【问题标题】:mysql database insert is changing all IDs to 4294967295mysql数据库插入将所有ID更改为4294967295
【发布时间】:2012-04-11 17:46:45
【问题描述】:

我的数据库发生了一些非常奇怪的事情。我正在使用 PHP 将数据插入到我的数据库中,过去 2 年我一直在这样做,没有任何问题。当客户在我的网站上付款时,我将来自该交易的所有数据存储在我的数据库中。每笔交易都有一个唯一的“transaction_id”。当我将付款信息插入数据库时​​,除了“transaction_id”之外的所有信息都正确插入。所有交易都被赋予“4294967295”的“transaction_id”。所以我做了一些测试。这是我所做的:

1) 我将“transaction_id”回显到我的屏幕上,看看它会说什么。结果是被回显的“transaction_id”是正确的。这不是重复的“4294967295”。但是,当我查看我的数据库时,它显示“4294967295”。

2) 这次我决定将查询回显到我的网络浏览器。查询是正确的。在查询中,正确的“transaction_id”在查询中。但是,当我查看我的数据库时,它显示“4294967295”。

我有 3 个不同的页面供客户付款。所有 3 个页面于 2012 年 4 月 6 日开始执行此操作。这些页面都没有被修改。我已经超过 2 年没有修改这些页面了。非常感谢任何帮助!

$query = "INSERT INTO payments (customer_id, transaction_id, invoice_number, authorization_code, subscription, subscription_id, avs_result, cvv_result, amount, full_tuition, payment_date, ip_address) VALUES ({$_SESSION['customer_id']}, {$_SESSION['transaction_id']}, {$_SESSION['invoice_number']}, '{$_SESSION['authorization_code']}', '{$_SESSION['subscription']}', {$_SESSION['subscription_id']}, '{$_SESSION['avs_result']}', '{$_SESSION['cvv_result']}', {$_SESSION['amount']}, {$_SESSION['full_tuition']}, '{$_SESSION['payment_date']}', '{$_SESSION['ip_address']}')" ;
$result = mysqli_query($dbc, $query) OR die ('<p>There was an error with the INSERT payments query.: ' . mysqli_error($dbc) . '<br />Query:' . $query . '</p>') ;

echo '<p>Transaction ' .  $_SESSION['transaction_id'] . ' has been <font color="green">APPROVED</font> by the system.</p>' ;

echo '<br /><br />' ;

echo '<p>Below is a summary:</p>' ;
echo '<p>Transaction ID: ' .  $_SESSION['transaction_id'] . '<br />
Payment Method: XXXX<br />
Amount: $' . $amount . '<br />
Customer Name: ' . $_SESSION['first_name'] . ' ' . $_SESSION['last_name'] . '<br />
</p>' ;

echo "<p>Note: Please do NOT click the browser's Back button to enter a new transaction.</p>" ;


echo $query ;

【问题讨论】:

  • 只是为了澄清功能我建议您在没有任何数据、触发器、...的情况下为数据库编写脚本某种黑客行为。因为乍一看它看起来像一个黑客。确保数据库上没有任何触发器等。
  • 对于所有带有撇号的事物的热爱,请花 30 分钟阅读PHP PDO Tutorial。将任意数据放入 SQL 查询中是鲁莽的。
  • 您现在真正的问题是找到并修复不良交易。如果您有相关表格,您可能必须直接联系客户以了解哪些付款用于什么。

标签: php mysql database


【解决方案1】:

您的数字大于数据库中的字段可以处理...

4294967295 是 32 位可以容纳的最大数字,您的事务 ID 现在大于您的数据库可以容纳的数字字段。

【讨论】:

  • @three3 拍拍自己的后背,让自己发挥得淋漓尽致
【解决方案2】:

调查问题并在您的问题中报告结果的出色工作!

4294967295 是 mysql 可以容纳的最大 INT,因此高于该值的事务 ID 将存储为 4294967295。要解决此问题,您可以将列类型更改为 BIGINT:modify column transaction_id bigint

这应该在保留所有数据的同时转换列类型,但最好先备份数据库以防万一!

【讨论】:

    【解决方案3】:

    4294967295 方便地是 2^32-1 - 32 位无符号整数的最大值。看起来你给它的 transaction_id 太大了,所以它溢出了,MySQL 在这种情况下的行为是将它设置为最大值。

    另外,如果您使用的是 MySQLi,您应该考虑使用准备好的语句。我不确定您的会话变量的值是什么,但我怀疑它们未转义,因此它们需要转义或使用准备好的语句。

    【讨论】:

      【解决方案4】:

      transaction_id的数据类型改为BIGINT

      【讨论】:

        【解决方案5】:

        另一种选择是查看表格的自动增量值。就我而言,它是 4294967295 :/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-10-21
          • 2018-10-17
          • 1970-01-01
          • 2015-09-10
          • 1970-01-01
          • 2015-01-27
          • 1970-01-01
          相关资源
          最近更新 更多