O inserto do database mysql está alterando todos os IDs para 4294967295

Algo realmente estranho está acontecendo com meu database. Estou usando o PHP para inserir dados no meu database e tenho feito isso nos últimos 2 anos sem problemas. Quando um cliente faz um pagamento no meu site, eu armazeno todos os dados dessa transação no meu database. Cada transação tem um “transaction_id” exclusivo. Quando insiro as informações de pagamento no database, todas as informações estão inseridas corretamente, exceto para o “transaction_id”. Todas as transactions recebem o “transaction_id” de “4294967295”. Então fiz alguns testes. Aqui é o que eu fiz:

1) Eu ecoei o “transaction_id” para a minha canvas para ver o que seria dizer. Os resultados foram que o “transaction_id” que estava sendo ecoado era CORRETA. Não foi a repetição “4294967295”. No entanto, quando olho no meu database, ele mostra “4294967295”.

2) Desta vez eu decidi ecoar a consulta no meu navegador. A consulta foi CORRETA. Na consulta, a correção “transaction_id” estava na consulta. No entanto, quando olho no meu database, ele mostra “4294967295”.

Eu tenho 3 páginas diferentes, onde os clientes podem fazer pagamentos. TODAS as 3 páginas começaram a fazer isso em 6 de abril de 2012. Nenhuma dessas páginas foi modificada. Não modifiquei essas páginas em mais de 2 anos. Qualquer ajuda é muito apreciada!

$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 ('

There was an error with the INSERT payments query.: ' . mysqli_error($dbc) . '
Query:' . $query . '

') ; echo '

Transaction ' . $_SESSION['transaction_id'] . ' has been APPROVED by the system.

' ; echo '

' ; echo '

Below is a summary:

' ; echo '

Transaction ID: ' . $_SESSION['transaction_id'] . '
Payment Method: XXXX
Amount: $' . $amount . '
Customer Name: ' . $_SESSION['first_name'] . ' ' . $_SESSION['last_name'] . '

' ; echo "

Note: Please do NOT click the browser's Back button to enter a new transaction.

" ; echo $query ;

Seu número é maior do que o campo no database pode manipular …

4294967295 é o maior número de bits de 32 bits, o ID da transação agora é maior do que o campo numérico que seu database pode armazenar.

Excelente trabalho investigando o problema e relatando os resultados em sua pergunta!

4294967295 é o INT mais grande que o mysql pode armazenar, de modo que as IDs de transactions maiores que as que estão sendo armazenadas como 4294967295. Para corrigir isso, você pode alterar o tipo de coluna para BIGINT: modify column transaction_id bigint

Isso DEVE converter o tipo de coluna enquanto preserva todos os seus dados, mas seria bom fazer backup do database primeiro, por exemplo!

4294967295 é convenientemente 2 ^ 32-1 – o valor máximo para um inteiro não assinado de 32 bits. Parece que qualquer transação que você está dando é muito grande, então está transbordando e o comportamento do MySQL nessa situação é configurá-lo no máximo.

Além disso, se você estiver usando o MySQLi, você deve considerar o uso de declarações preparadas. Não tenho certeza de qual é o valor das variables ​​da session, mas eu suspeito que elas estão desarmadas, então elas precisam ser escapadas ou usar declarações preparadas.

Altere o tipo de dados do transaction_id para BIGINT

Outra opção é olhar para o valor de incremento automático da tabela. No meu caso era 4294967295: /