Что-то действительно странное происходит с моей базой данных. Я использую PHP для вставки данных в мою базу данных, и я делаю это в течение последних 2 лет без каких-либо проблем. Когда клиент производит платеж на моем веб-сайте, я сохраняю все данные из этой транзакции в своей базе данных. Каждая транзакция имеет уникальный «transaction_id». Когда я вставляю информацию о платежах в базу данных, вся информация вставляется правильно, за исключением «transaction_id». Все транзакции выдаются «transaction_id» из «4294967295». Поэтому я провела некоторое тестирование. Вот что я сделал:
1) Я отозвал «transaction_id» на свой экран, чтобы увидеть, что скажет. Результаты состояли в том, что «transaction_id», который был эхом, был ПРАВИЛЬНО. Это не повторение «4294967295». Однако, когда я смотрю в своей базе данных, он показывает «4294967295».
2) На этот раз я решил повторить запрос в своем веб-браузере. Запрос был ПРАВИЛЬНО. В запросе CORRECT «transaction_id» находился в запросе. Однако, когда я смотрю в своей базе данных, он показывает «4294967295».
У меня есть 3 разных страницы, где клиенты могут совершать платежи. Все 3 страницы начали делать это 6 апреля 2012 года. Ни одна из этих страниц не была изменена вообще. Я не изменял эти страницы более двух лет. Любая помощь очень ценится!
$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 ;
Ваш номер больше, чем поле в DB может обрабатывать …
4294967295 – это самое большое число 32 бит, которые могут содержать, ваш идентификатор транзакции теперь больше, чем числовое поле, которое может удерживать ваша БД.
Отличная работа, исследующая проблему и отчетность о результатах в вашем вопросе!
4294967295 – это самый большой INT, который может хранить mysql, поэтому идентификаторы транзакций выше, чем они сохраняются как 4294967295. Чтобы исправить это, вы можете изменить тип столбца на BIGINT: modify column transaction_id bigint
Это СЛЕДУЕТ преобразовывать тип столбца, сохраняя все ваши данные, но было бы полезно создать резервную копию базы данных сначала на всякий случай!
4294967295 удобно 2 ^ 32-1 – максимальное значение для 32-битного беззнакового целого. Похоже, что любая транзакция, которую вы даете, слишком велика, поэтому она переполнена, и поведение MySQL в этой ситуации заключается в том, чтобы установить ее на максимальную.
Кроме того, если вы используете MySQLi, вам следует рассмотреть возможность использования подготовленных операторов. Я не уверен, какова ценность ваших переменных сеанса, но я подозреваю, что они не привязаны, поэтому им нужно либо экранировать, либо использовать подготовленные операторы.
Измените тип данных transaction_id
на BIGINT
Другим вариантом является просмотр вашего значения автоматического прироста таблицы. В моем случае это было 4294967295: /