2010-01-09 94 views
1

我有以下代码:MySQL-为什么LAST_INSERT_ID()不适合我?

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 Database Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LAST_INSERT_ID()'

我GOOGLE了,看着相似的问题,但没有找到答案:(

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

+0

您应该考虑使用查询参数,而不是直接将值插入到SQL字符串中。您的代码可能存在SQL注入漏洞。 – 2010-01-09 12:45:23

+0

我知道 - 使用MySQLi的权利?我已经尝试过了,但我无法查询查询。我只能得到错误:(所以我尽我所能地以其他方式处理它。 – Steven 2010-01-09 13:13:45

+0

您在显示数据库错误消息的方式中也存在XSS漏洞。http://en.wikipedia.org/wiki/Cross-site_scripting – 2010-01-09 13:42:05

回答

11

为什么不使用PHP的mysql_insert_id

不管......

SELECT LAST_INSERT_ID() 

...应该工作只要你在表已经自动增量列。

+0

因为我认为使用SQL语句获得正确的ID更安全吗?例如,当多个用户在同一个表中插入和更新数据时 – Steven 2010-01-09 12:43:28

+1

除非你'使用客栈oDB并在交易中执行上述操作,我不认为这将证明是这种情况。也就是说,我相信mysql_insert_id是特定于连接的,因此除非您共享相同的数据库连接,否则您所指的不会成为问题。 – 2010-01-09 12:45:25

+0

我正在使用InnobDB。我现在用'LAST_INSERT_ID()'的问题是,这只是返回0.不知道为什么。 – Steven 2010-01-09 12:51:01

1

由于您正在使用mysql_*函数,为什么不直接使用mysql_insert_id函数,而是自己调用LAST_INSERT_ID()


不过,你所得到的SQL错误可能是因为您要发送到服务器的SQL查询是这一个:

LAST_INSERT_ID() 

取而代之的是一个:

select LAST_INSERT_ID() 

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

+0

yes,you are correct。我没有使用PHP函数,因为如果多个用户同时在同一个表中广告或更新数据,我不确定它是否会返回正确的ID。 ,使用'select LAST_INSERT_ID()'只返回0 .... – Steven 2010-01-09 12:46:51

+1

我非常确定mysql_last_id会完成你想要的任务,因为它正在处理当前的连接,而这正是我一直使用的,实际上^^ – 2010-01-09 12:51:14

6

你忘了SELECT:

"SELECT LAST_INSERT_ID()" 
+0

谢谢,就是这样,但它返回0 :(为什么是这样? – Steven 2010-01-09 12:41:37

4

这将不无SELECT工作:

SELECT LAST_INSERT_ID(); 

或只是使用mysql_insert_id,这是一个PHP函数做同样的PHP的水平。但是,如果您的表ID是BIGINT,请使用第一种方法。

+0

+1为BIGINT提示 – 2010-01-09 13:26:17

0
SELECT LAST_INSERT_ID(); 

如果我是你。在php之前,我会先从命令行或查询浏览器中插入/选择last_insert_id。至少,这将至少证实或拒绝正确的sql语法。

1

这些家伙已经回答说您错过了SELECT前缀。

顺便说一句,你应该看你的INSERT语句......它有一个清除SQL注入的门,如果$guideName没有逃脱。

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]; 
+0

感谢您的答复。我想我忘记了使用SELECT语句。下次我将进行一些重构测试:) – Steven 2012-02-27 18:42:05

+0

可能INSERT失败了,因为你把NOW()放在引号内,使它成为不是有效日期时间文字的字符串文字。你希望它是一个函数调用。 – 2012-02-27 19:26:15

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; 
} 
0

我觉得你的表有datetime/timestamp栏和查看查询有NOW()varchar值而不是datetime值,所以你的SQL query应该有返回false

如果查询返回false,则不会获取最后插入的id(始终用于当前连接)。

2

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

mysql_insert_id PHP函数的情况下,你应该总是把它用mysql_insert_id($link_id);

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

0

如果SELECT LAST_INSERT_ID();返回0;

使用以下查询:

SELECT LAST_INSERT_ID(Id)的从表名,以便通过LAST_INSERT_ID(Id)的降序极限1;

它会给你所需的结果。