0

我是 PHP 和 MySQL 新手,当其中一个数据库字段为 UNIQUE 时,mysql_insert_id() 的行为对我来说已成为一堵墙。大大简化了,我有 2 张桌子。

属性表

PropertyID PK, AI

//许多属性描述符

UserID FK 到用户表

用户表

用户ID PK,人工智能

独特的电子邮件

密码

验证后,我将用户的电子邮件插入到 users 表中,并查看电子邮件是否已经存在,因此是返回用户。如果不存在,则将其插入并且是新用户。

$sql = "INSERT IGNORE INTO user ( email ) VALUES ( '$email' )";
//INSERT to a UNIQUE email causes an error & abort. With IGNORE, no INSERT happens (affected_rows=0)
$UserID = mysql_insert_id(); // is 0 if email exists in its UNIQUE field
if ( mysql_affected_rows() == 0 ) {//0 is existing user, else is new user}

这可以很好地将新用户和回访用户分开,他们稍后会收到不同的消息。并且它设置了2个逻辑通道-一个用于输入新密码,第二个用于检查输入的密码是否匹配。

但是,用户的第二个条目(或第三个及以后)的 UserID 始终为 0,零,因为电子邮件字段是唯一的。因此,我无法在属性表中针对 UserID 进行有用的查询,因为所有返回的用户行都有 UserID=0

尽管进行了很多搜索,但我还没有找到或想出解决方案。如何将真正的 UserID(而不是 0 返回)放入新用户和返回用户的属性表中?

尝试具体回答。我在这方面没有很好地遵循一般指示。

4

2 回答 2

0

像这样:

$sql = "INSERT IGNORE INTO user ( email ) VALUES ( '$email' )";
mysql_query($sql);
//INSERT to a UNIQUE email causes an error & abort. With IGNORE, no INSERT happens   (affected_rows=0)
$UserID = mysql_insert_id(); // is 0 if email exists in its UNIQUE field

if($UserID==0) //no insert
{
  $email = mysql_real_scape_string($email);
  $sql = "select * from user where email = '$email'"; //check for user on table user
  $result = mysql_query($sql);
  $row = mysql_fetch_assoc($result);
  $UserID = $row['UserID']; //return the user id that matches de email
}

PS:使用 mysql 或 PDO ...mysql 扩展程序正在被弃用...尝试 mysqli 扩展程序...mysqli 的程序方式与您在 PHP 上使用 mysql 扩展程序的方式非常相似。

于 2013-04-12T01:38:19.887 回答
0

取自这个问题/答案 -在使用 ON DUPLICATE KEY UPDATE 和 PHP 时获取 mysql_insert_id()

尝试从 更改INSERT IGNOREINSERT .. ON DUPLICATE KEY UPDATE

$sql = "INSERT INTO user ( email ) VALUES ( '$email' ) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) ";

然后使用id=LAST_INSERT_ID(id)将获得id返回用户的mysql_insert_id().

mysql 文档 - LAST_INSERT_ID(expr) ,INSERT ... ON DUPLICATE KEY UPDATE

于 2013-04-12T01:44:44.117 回答