2012-04-11 77 views
4

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

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

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

我有3个不同的页面,客户可以付款。所有3页在2012年4月6日开始这样做。没有任何页面被修改过。我在两年内没有修改过这些页面。任何帮助是极大的赞赏!

$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 ; 
+0

只是为了弄清楚功能我建议你脚本数据库没有任何数据,触发器......用该脚本创建一个新的数据库连接你的网站到新的数据库只是为了看如果它是某种黑客。 Cos乍一看它看起来像一个黑客。确保数据库中没有任何触发器或类似信息。 – Jester 2012-04-11 17:53:49

+1

对于所有带有撇号的内容的爱,花30分钟阅读[PHP PDO教程](http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps- PDO换数据库访问/)。将任意数据丢入SQL查询是鲁莽的。 – tadman 2012-04-11 18:00:30

+0

现在你真正的问题是找到并修复不良交易。如果您有相关的表格,您可能需要直接与客户联系,以了解哪些付款适用于哪些内容。 – HLGEM 2012-04-11 18:10:15

回答

7

你的号码是不是在数据库领域,能够处理较大...

4294967295是数量最多的32位可以容纳您的交易编号现在比的数值字段中输入数据库可以容纳更大。

+2

@ three3让自己在背上轻拍一下,以达到最佳效果 – citizenen 2012-04-11 22:42:53

1

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

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

0

transaction_id的数据类型更改为BIGINT

4

出色的工作,研究问题和报告你的问题的结果!

4294967295是MySQL可容纳最大INT,所以高于事务ID越来越存储为4294967295。为了解决这个问题,你可以更改列类型为bigint:modify column transaction_id bigint

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

0

另一种选择是看你的自动增量值的表。在我的情况下,它是4294967295:/