Php MySQL-为什么LAST_INSERT_ID()对我不起作用?

Php MySQL-为什么LAST_INSERT_ID()对我不起作用?,php,mysql,Php,Mysql,我有以下代码: public function createNewGuide($userID,$guideName) { $sql =" INSERT INTO myTable(name, updated) VALUES ('$guideName', 'NOW()')"; //Process query $this->query($sql); // This inserts the new row $this->qu

我有以下代码:

  public function createNewGuide($userID,$guideName)
  {
    $sql =" INSERT INTO myTable(name, updated) 
            VALUES ('$guideName', 'NOW()')";

    //Process query
    $this->query($sql); // This inserts the new row
    $this->query('LAST_INSERT_ID()'); // This throws an error

    return $this->query_result;
  }
我的查询函数如下所示:

  private function query($sql) 
  {
      $this->query_result = mysql_query($sql, $this->conn)
        or die("Unable to query local database <b>". mysql_error()."</b><br>$sql");   
  } 
私有函数查询($sql)
{
$this->query\u result=mysql\u query($sql,$this->conn)
或者死(“无法查询本地数据库”.mysql_error()。”
$sql”); }
我得到以下错误:

MySQL数据库错误:您的SQL语法有错误;检查 与您的MySQL相对应的手册 正确语法的服务器版本 使用接近“最后一次插入ID()”

我在谷歌上搜索过类似的问题,但没有找到答案:(


我还没有尝试过,因为我真的很想使用SQL来实现这一点。

既然您正在使用
mysql.*
函数,为什么不直接使用该函数,而不是自己调用
LAST\u INSERT\u ID()


不过,您得到的SQL错误可能是因为您发送到服务器的SQL查询如下所示:

LAST_INSERT_ID()
select LAST_INSERT_ID()
而不是这个:

LAST_INSERT_ID()
select LAST_INSERT_ID()
如果您正在执行SQL查询以…选择…某些数据,则应该有一个
select

您忘记了选择:

"SELECT LAST_INSERT_ID()"
为什么不直接使用PHP呢

不管

SELECT LAST_INSERT_ID()

只要表中有一个自动递增列,如果没有SELECT,该列将无法工作,

SELECT LAST_INSERT_ID();
或者只需使用
mysql\u insert\u id
,这是一个php函数,在php级别上执行相同的操作

SELECT LAST_INSERT_ID();

如果我是你,我会让你的insert/select last_insert_id在php之前首先从命令行或查询浏览器工作。至少,这将至少确认或拒绝正确的sql语法。

伙计们已经回答说你缺少select前缀

顺便说一句,您应该注意INSERT语句……如果未转义
$guideName
,它就为SQL注入打开了一扇大门。

如果未插入行,则上次插入ID()
返回零

您应该检查您的
INSERT
是否实际成功。始终测试
mysql\u query()
和其他函数的返回值,如果发生错误,返回值通常为
FALSE

$sql =" INSERT INTO myTable(name, updated) 
        VALUES ('$guideName', 'NOW()')";

if ($this->query($sql) === FALSE) {
  die(mysql_error());
}

if (($result = $this->query("SELECT LAST_INSERT_ID()")) === FALSE) {
  die(mysql_error()); 
}

if (($row = mysql_fetch_array($result)) === FALSE) {
  die(mysql_error()); 
}

$id = $row[0];

我同意任何人说你应该使用
mysql\u insert\u id
,但是如果你想使用
LAST\u insert\u id
,你可以使用这个:

function getLastInsertId($db_connection)
{
   $result = 0;

   if($query_result = mysql_query("SELECT LAST_INSERT_ID();", $db_connection))
   {
      $temp = mysql_fetch_row($query_result);
      $result = $temp[0];   
   }

   return $result;   
}

我认为您的表有
datetime
/
timestamp
列,您的查询有
NOW()
varchar
值而不是
datetime
值,因此您的
SQL查询应该返回
false


如果查询返回
false
您将无法获取上次插入的id(始终用于当前连接)。

如果您有多个数据库链接到同一环境,则应始终指定链接标识符

如果使用
mysql\u insert\u id
php函数,则应始终使用
mysql\u insert\u id($link\u id);


如果您使用
选择最后一个插入ID(link\u ID)
通过SQL查询调用它,如果选择最后一个插入ID();返回0

使用此查询:

按上次插入ID(ID)描述限制1从表名称顺序中选择上次插入ID(ID)

它将为您提供所需的结果。

我使用

$Last\u ID=$mysqli->insert\u ID

一旦出现问题。运行Insert查询后,Insert_id为int(0)。
问题是在获取Insert\u id之前的“Insert”查询之后添加了一个“Select”查询,正如我所假设的那样,它会抛出它。

谢谢,就是这样。但它返回0:(为什么?因为我认为使用SQL语句获取正确的ID更安全?例如,当多个用户在同一个表中插入和更新数据时。除非您使用InnoDB并在事务中执行上述操作,否则我认为情况不会如此。也就是说,我相信mysql_insert_ID是特定于连接的,h除非您共享相同的数据库连接,否则您所指的内容不会成为问题。A我使用InnobDB。我现在的问题是
LAST\u INSERT\u ID()
,它只返回0。不知道为什么。只是检查一下基本情况,但您的表实际上有一个自动递增列吗?好的,我最后使用了mysql\u INSERT\u ID()因为我不能理解为什么<代码> ListIsPixtTyId()>代码>只返回0。您应该考虑使用查询参数而不是直接将值插入到SQL字符串中。您的代码可能有SQL注入漏洞。我知道-使用MySQLI,对吗?我已经尝试过了,但是我不能进行查询。我只得到错误:(因此,我正在以其他方式尽可能好地处理它。您在显示数据库错误消息的方式中也存在XSS漏洞。此漏洞?我做了一些测试,但这里肯定仍然存在漏洞。
SELECT LAST_INSERT_ID()
返回0。如果执行
SELECT LAST_INSERT_ID(列)
您得到了正确的值。然后,如果您在没有ID的情况下再次这样做,您将得到正确的值。插入另一行,现在尝试不使用ID,它将不会更新。使用ID选择,现在它会工作,并且它会更新一些内容,以便在没有ID的情况下再次工作,直到您插入新行。它被破坏。是的,您是正确的。我没有使用PHP函数启用,因为我不确定如果多个用户同时在同一个表中发布或更新数据,它是否会返回正确的ID。但是,使用
选择LAST\u INSERT\u ID()
只返回0…我非常确定
mysql\u last\u id
将完全满足您的要求,因为它正在处理当前连接。这也是我一直使用的,实际上^^^感谢您的回复。我想我忘了使用SELECT语句。下次我进行重构时将测试:)插入可能失败,因为您将NOW()放在引号内,使其成为无效的datetime文字的字符串文字。您希望它是一个函数调用。