2016-05-28 2 views
0

Я просто установил сервер LAMP в экземпляре Amazon Linux. Все работает нормально, и все мои связи с моей базой данных отлично работают.Вставка MySQL записывает другое значение, чем значение, которое я вводил

Но у меня проблема, которую я просто не могу понять. Я работаю над экзаменационной системой, и я хочу дать случайный идентификатор каждому учащемуся, который его возьмет. Мне не нужна информация о студентах, поэтому у меня нет соответствующих полей, которые я мог бы использовать в качестве уникальных идентификаторов.

$id_escuela=2; 
$id_grupo=$_POST['grado']; 
$id_eval=rand(1,9999999999); 
$sql = "INSERT INTO pinion_evalua (id_eval,id_escuela,anio) VALUES (".$id_eval.",".$id_escuela.",".$id_grupo.")"; 

На моем локальном сервере все работает отлично, и я получаю случайные числа каждый раз, но когда я загрузить свои файлы на Amazon сервер, я застрял с определенным номером (2147483647), даже если результат Ранд отличается. Например, я получаю:

Error: INSERT INTO pinion_evalua(id_eval,id_escuela,anio) VALUES (4612160288,1,2) 
Duplicate entry '2147483647' for key 'id_eval' 

Как это возможно? Я попытался удалить случайную часть и использовать автоинкремент, но я все равно получаю тот же номер. Я даже пытался уменьшить размер int, но я все равно получаю номер, даже если он идет вразрез с правилами поля. Это сводит меня с ума.

Неужели кто-нибудь из вас может дать мне подсказку о том, что может быть неправильным?

С уважением.

+0

Я не знаю php, но похоже, что он связан с http://stackoverflow.com/questions/15532635/converting-a-sting-to-an-integer-returns-2147483647 – ASM

+0

вам не нужно назначать уникальный идентификатор , используйте поле id в качестве первичного ключа и auto increment true. – shubham715

+0

сделать поле id_eval BigInt –

ответ

0

Максимальное значение для INT столбца в MySQL точно 2147483647.

http://dev.mysql.com/doc/refman/5.7/en/integer-types.html

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

У вас будет такая же проблема с AUTO_INCREMENT, когда наибольшее значение в столбце также является максимальным значением для этого столбца. Сервер попытается увеличить на 1, значение будет усечено до максимально возможного значения, и вставка не удастся.

3

У вас есть много проблем в этих нескольких строк кода:

  • Вы, очевидно, под управлением PHP на 32 битной системе и попытаться получить случайное значение больше, чем это.
  • Поскольку вам не нужен назначенный идентификатор, почему бы не использовать автоматически увеличиваемое число в MySQL?
  • Ваш код восприимчив к SQL-инъекции, который можно легко продемонстрировать, введя 3); delete pinion_evalua where (1 = 1. Правильным решением было бы использовать подготовленные операторы, как описано в PHP manual.
+0

код действительно уязвим для SQL-инъекций, хотя php/mysql не поддерживает сложные запросы. –

+0

Хорошо, но это зависит от используемой библиотеки. –

+0

На самом деле есть «новая» родная функция http://php.net/manual/en/mysqli.quickstart.multiple-statement.php nevermind my comment. –

Смежные вопросы