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文字的字符串文字。您希望它是一个函数调用。