MySQL-为什么LAST_INSERT_ID()不适合我?

时间:2010-01-09 12:38:05

标签: 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->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");   
  } 

我收到以下错误:

  

MySQL数据库错误:您的SQL语法出错;检查   与您的MySQL对应的手册   用于正确语法的服务器版本   在“LAST_INSERT_ID()”附近使用

我用Google搜索并查看了类似的问题,但未找到答案:(

我没有尝试PHP function mysql_insert_id(),因为我真的想用SQL做这件事。

12 个答案:

答案 0 :(得分:11)

为什么不使用PHP的mysql_insert_id

...无关

SELECT LAST_INSERT_ID()

...只要您在表格中有自动增量列,就应该

答案 1 :(得分:6)

你忘记了SELECT:

"SELECT LAST_INSERT_ID()"

答案 2 :(得分:4)

如果没有SELECT,那将无法运作:

SELECT LAST_INSERT_ID();

或者只是使用mysql_insert_id,它是一个php函数,它在php级别上也是如此。但是,如果表ID为BIGINT,请使用第一种方法。

答案 3 :(得分:2)

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

如果是mysql_insert_id php函数,您应该始终使用mysql_insert_id( $link_id );

来调用它

如果您使用SELECT LAST_INSERT_ID( link_id )通过SQL查询调用它。

答案 4 :(得分:1)

当您使用mysql_*函数时,为什么不使用mysql_insert_id函数,而不是自己调用LAST_INSERT_ID()


但是,您获得的SQL错误可能是因为您要发送到服务器的SQL查询是这样的:

LAST_INSERT_ID()

而不是这一个:

select LAST_INSERT_ID()

如果您正在执行SQL查询以...选择...某些数据,则应该有select

答案 5 :(得分:1)

这些人已经回答你错过了SELECT前缀。

顺便说一下,你应该看一下你的INSERT语句......如果$guideName没有被转义,它就有一个明确的SQL注入门。

答案 6 :(得分:1)

如果没有插入行,

LAST_INSERT_ID()将返回零。

您应该检查您的INSERT是否真的成功了。始终测试mysql_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];

答案 7 :(得分:1)

如果 SELECT LAST_INSERT_ID(); 返回0;

使用此查询:

从table_name订购LAST_INSERT_ID(Id)按LAST_INSERT_ID(Id)desc limit 1;

它会给你所需的结果。

答案 8 :(得分:0)

SELECT LAST_INSERT_ID();

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

答案 9 :(得分:0)

我同意任何人说你应该使用mysql_insert_id,但是如果你想使用LAST_INSERT_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;   
}

答案 10 :(得分:0)

我认为您的表格包含datetime / timestamp列,并且您的查询的值为NOW() varchar而非datetime值,因此您的{{1应该返回SQL query

如果查询返回false,您将不会获得最后插入的ID(始终用于当前连接)。

答案 11 :(得分:0)

我用

$Last_ID=$mysqli->insert_id;

一旦我有问题。运行插入查询后,Insert_id 为 int(0)。 问题是在获取 insert_id 之前的“插入”查询之后的附加“选择”查询中,正如我假设的那样,它抛出它。