Вопрос по php, database, mysql – MySQL вставка базы данных меняет все идентификаторы на 4294967295

4

Что-то действительно странное происходит с моей базой данных. Я использую PHP для вставки данных в свою базу данных, и я делал это в течение последних 2 лет без каких-либо проблем. Когда клиент совершает платеж на моем веб-сайте, я сохраняю все данные этой транзакции в своей базе данных. У каждой транзакции есть уникальный идентификатор транзакции. Когда я вставляю информацию о платеже в базу данных, вся информация вставляется правильно, за исключением & quot; Transactions_id & quot ;. ВСЕм транзакциям присваивается & quot; Transactions_id & quot; из "4294967295". Итак, я провел некоторое тестирование. Вот что я сделал:

1) Я повторил & quot; Transactions_id & quot; на мой экран, чтобы увидеть, что бы сказать. Результатом было то, что & quot; Transactions_id & quot; это было отражено было правильно. Это не было повторение "4294967295". Однако, когда я просматриваю свою базу данных, она показывает «4294967295».

2) На этот раз я решил отправить запрос в мой веб-браузер. Запрос был ПРАВИЛЬНЫМ. В запросе ИСПРАВЛЕНО & quot; Transactions_id & quot; был в запросе. Однако, когда я просматриваю свою базу данных, она показывает «4294967295».

У меня есть 3 разные страницы, где клиенты могут совершать платежи. ВСЕ 3 страницы начали делать это 6 апреля 2012 года. Ни одна из этих страниц не была изменена вообще. Я не изменял эти страницы более 2 лет. Любая помощь с благодарностью!

<code>$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 ;
</code>
Ради любви ко всем вещам с апострофами потратьте тридцать минут и прочитайтеPHP PDO Tutorial, Перебрасывать произвольные данные в SQL-запрос безрассудно. tadman
Ваша настоящая проблема сейчас состоит в том, чтобы найти и исправить плохие транзакции. Если у вас есть связанные таблицы, вам, возможно, придется связаться с клиентом напрямую, чтобы узнать, какие платежи идут на что. HLGEM
просто чтобы очистить функциональность, я бы посоветовал вам написать сценарий базы данных без каких-либо данных, триггеров, ... Создайте новую базу данных с помощью этого сценария, подключите ваш сайт к новой базе данных, просто чтобы увидеть, является ли это своего рода хаком. Потому что на первый взгляд это выглядит как взломать. Убедитесь, что у вас нет никаких триггеров или чего-то подобного в базе данных. Jester

Ваш Ответ

5   ответов
0

transaction_id вBIGINT

4

о вашему вопросу!

4294967295 - это самый большой INT, который может содержать mysql, поэтому идентификаторы транзакций, которые превышают этот, сохраняются как 4294967295. Чтобы исправить это, вы можете изменить тип столбца на BIGINT:modify column transaction_id bigint

Это ДОЛЖНО преобразовывать тип столбца при сохранении всех ваших данных, но было бы хорошо сначала создать резервную копию базы данных на всякий случай!

0

auto increment value стола. В моем случае это было 4294967295: /

9

4294967295 - это наибольшее число, которое может содержать 32 бита, идентификатор вашей транзакции теперь больше, чем числовое поле, которое может содержать БД.

Error: User Rate Limit Exceeded
1

4294967295 удобно 2 ^ 32-1 - максимальное значение для 32-разрядного целого числа без знака. что все транзакции, которые вы даете, слишком велики, поэтому он переполнен, и поведение MySQL в этой ситуации - установить его на максимум.

Кроме того, если вы используете MySQLi, вам следует рассмотреть возможность использования подготовленных операторов. Я не уверен, каково значение ваших переменных сеанса, но я подозреваю, что они не экранированы, поэтому их необходимо либо экранировать, либо использовать подготовленные операторы.

Похожие вопросы