5

私のデータベースで何か本当に奇妙なことが起こっています。私はPHPを使用してデータベースにデータを挿入していますが、過去2年間、問題なくこれを行っています。顧客が私のウェブサイトで支払いをするとき、私はそのトランザクションからのすべてのデータを私のデータベースに保存します。各トランザクションには、一意の「transaction_id」があります。支払い情報をデータベースに挿入すると、「transaction_id」を除くすべての情報が正しく挿入されます。すべてのトランザクションには、「4294967295」の「transaction_id」が与えられます。それで私はいくつかのテストをしました。これが私がしたことです:

1)「transaction_id」を画面にエコーアウトして、何が表示されるかを確認しました。その結果、エコーアウトされていた「transaction_id」は正しいものでした。繰り返しの「4294967295」ではありませんでした。ただし、データベースを見ると、「4294967295」と表示されます。

2)今回は、クエリをWebブラウザにエコーアウトすることにしました。クエリは正しかった。クエリでは、正しい「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 ;
4

5 に答える 5

9

あなたの数は、DBのフィールドが処理できるよりも大きいです...

4294967295は、32ビットが保持できる最大数であり、トランザクションIDは、DBが保持できる数値フィールドよりも大きくなっています。

于 2012-04-11T17:50:43.217 に答える
5

問題を調査し、質問の結果を報告する素晴らしい仕事です!

4294967295はmysqlが保持できる最大のINTであるため、それよりも高いトランザクションIDは4294967295として格納されます。これを修正するには、列タイプをBIGINTに変更します。modify column transaction_id bigint

これは、すべてのデータを保持しながら列タイプを変換する必要がありますが、万が一の場合に備えて、最初にデータベースをバックアップすることをお勧めします。

于 2012-04-11T17:54:17.173 に答える
1

4294967295は便利なことに2^32-1-です。32ビットの符号なし整数の最大値です。与えているtransaction_idが大きすぎるように見えるので、オーバーフローしていて、その状況でのMySQLの動作は最大に設定することです。

また、MySQLiを使用している場合は、プリペアドステートメントの使用を検討する必要があります。セッション変数の値はわかりませんが、エスケープされていないため、エスケープするか、プリペアドステートメントを使用する必要があると思われます。

于 2012-04-11T17:50:15.093 に答える
0

のデータ型をに変更しtransaction_idますBIGINT

于 2012-04-11T17:52:21.770 に答える
0

もう1つのオプションは、テーブルの自動増分値を確認することです。私の場合は4294967295でした:/

于 2015-09-24T11:31:06.513 に答える