0
     $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。

4

2 回答 2

1

根据手册,如果最后一条语句没有生成值,mysql_insert_id()将返回:0AUTO_INCREMENT

上一个查询成功时为 AUTO_INCREMENT 列生成的 ID,如果上一个查询没有生成 AUTO_INCREMENT 值,则为 0,如果没有建立 MySQL 连接,则为 FALSE。

您在插入任何记录之前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);哪里。$connmysql_connect()

站点注释(未具体回答)
您的代码极易发生 SQL 注入;你没有逃避任何价值观。与其深入了解 SQL 注入是什么,我更愿意指导您使用准备好的语句。

此外,PHP 正在弃用这些mysql_方法以支持mysqli_andPDO方法。这两个都支持准备好的声明,我建议您查看这些声明。

在此期间,请考虑用 包装变量mysql_real_escape_string(),例如:

... values ('" . mysql_real_escape_string($username) . "', ...
于 2012-10-09T19:19:33.197 回答
0

直到发送电子邮件后您才进行查询,mysql_insert_id给出了上一个查询为 AUTO_INCREMENT 列生成的 ID,因此您必须在使用前放置查询mysql_insert_id

于 2012-10-09T19:22:06.140 回答