Ошибка в mysql_insert_id() [MAIL TAG]

     $headers  = 'MIME-Version: 1.0' . "\r\n";
     $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
     $headers .= 'From: contact@email.com';
     $to = $email;
     $subject = "Confirmation";
     $message = "Hi, $username. You're registred in Site. Link for confirmation:     http://site.com/confirm/**".mysql_insert_id()."**";
     mail($to, $subject, $message, $headers);
     $query = mysql_query("insert into usr_users(username, password, email, avator, pin)          values('$username', '$password', '$email', '$img', '$pin')");
     $query2 = mysql_query("insert into usr_confirm(user_name, user_id, active, data) values('$username', '".mysql_insert_id()."', '$active', '$senha')");
     echo"Success!</br>";

Второй mysql_insert_id () (строка 9) является правильным! Но первый mysql_insert_id() (строка 6) возвращает 0 в почтовом ящике.

2 ответа

Решение

Согласно инструкции, mysql_insert_id() вернусь 0 если последнее утверждение не генерирует AUTO_INCREMENT значение:

Идентификатор, сгенерированный для столбца AUTO_INCREMENT предыдущим запросом в случае успеха, 0, если предыдущий запрос не генерирует значение AUTO_INCREMENT, или FALSE, если не установлено соединение MySQL.

Вы впервые используете mysql_insert_id() позвоните, прежде чем вставить какие-либо записи, поэтому результат должен быть 0 (если нет вызова до этого где-нибудь еще в вашем коде - тогда вы на самом деле получите искаженные результаты). Попробуйте переместить ваши звонки, связанные с почтой, ниже ваших операторов вставки, давая вам:

// insert the records
$query = mysql_query("insert into usr_users(username, password, email, avator, pin)          values('$username', '$password', '$email', '$img', '$pin')");
$query2 = mysql_query("insert into usr_confirm(user_name, user_id, active, data) values('$username', '".mysql_insert_id()."', '$active', '$senha')");

// send the email
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$headers .= 'From: contact@email.com';
$to = $email;
$subject = "Confirmation";
$message = "Hi, $username. You're registred in Site. Link for confirmation:     http://site.com/confirm/**".mysql_insert_id()."**";
mail($to, $subject, $message, $headers);
echo"Success!</br>";

Если после этого изменения вы по-прежнему получаете сообщение об ошибке, вам необходимо подтвердить, что поле первичного ключа на usr_confirm таблица правильно настроена с auto_increment, Кроме того, если он настроен правильно, попробуйте передать переменную соединения в функцию, такую ​​как mysql_insert_id($conn); где $conn результат вашего mysql_connect() вызов.

Примечание к сайту (не конкретный ответ)
Ваш код чрезвычайно подвержен SQL-инъекциям; Вы не избегаете ни одного из значений. Вместо того, чтобы вдаваться в то, что такое SQL-инъекция, я бы скорее рекомендовал вам использовать подготовленные операторы.

Кроме того, PHP осуждает mysql_ методы в пользу mysqli_ а также PDO методы. Обе эти поддержки подготовили заявления, и я бы порекомендовал вам изучить их.

Тем временем, пожалуйста, подумайте об обёртывании ваших переменных mysql_real_escape_string(), такие как:

... values ('" . mysql_real_escape_string($username) . "', ...

Вы не сделали запрос, пока не отправите письмо, mysql_insert_id дает идентификатор, сгенерированный для столбца AUTO_INCREMENT по предыдущему запросу, так что вам придется разместить запрос на одну позицию перед использованием mysql_insert_id

Другие вопросы по тегам