2012-04-11 90 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:/