Mysqli最后插入的id不起作用

3
我是一名有用的助手,可以为您翻译文本。
我试图获取最后一个查询插入ID,但我的代码总是返回零。
我的代码:
private function Cnn()
{
    return mysqli_connect('localhost','root','root','db');
}
protected function MyCommandInsertId($sql)
{
    if(mysqli_query($this->Cnn(),$sql))
    {
        return mysqli_insert_id($this->Cnn());
    }
    $this->err = mysqli_error($this->Cnn());
    return false;
}

public  function Insert()
{

        $sql = "insert general_info(name,email,password)
        values('".$this->ms($this->name)."','".$this->ms($this->email)."','".md5($this->password)."')";
        //print''.$sql.'';

        $last_insert_id=$this->MyCommandInsertId($sql);

}

这里返回的mysqli_insert_id($this->Cnn());总是返回零。


mysqli_insert_id()函数返回在具有AUTO_INCREMENT属性的列的表上查询生成的ID。如果最后一个查询不是INSERT或UPDATE语句,或者修改的表没有具有AUTO_INCREMENT属性的列,则此函数将返回零。[PHP手册] (http://php.net/manual/zh/mysqli.insert-id.php) - silverfox
列具有AUTO_INCREMENT属性。@silverfox - Twer1971
检查您的表中是否插入了新记录? - user3422161
1
插入命令不正确,请检查。 - Alive to die - Anant
每次调用方法 Cnn 时,您都在创建一个新的数据库连接。 - CBroe
CBroe,你是正确的。 - user3422161
3个回答

1
请查看mysqli_insert_id的定义:-
mysqli_insert_id()函数返回在最后一个查询中使用的id(由AUTO_INCREMENT生成)。
这意味着您的表中具有AUTO_INCREMENT值的列不存在。
或者
当前程序流中没有以编程方式插入数据到您的表中。由于代码中没有插入查询,因此返回了
注意:- 在您的代码中首先执行插入查询,然后检查mysqli_insert_id给出的输出是什么。然后您可以轻松理解我想说什么。谢谢
我的本地工作示例在这里:-
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
function Cnn()
{
    $conn = mysqli_connect('localhost','root','','stack');
    return $conn;
}
function MyCommandInsertId($sql)
{
    $conn = Cnn();
    if(mysqli_query($conn,$sql))
    {
        $lastid = mysqli_insert_id($conn);
        return $lastid;
    }else{
        $err = mysqli_error($conn);
        return $err;
    }

}
function Insert()
{
        $sql = "INSERT INTO bom(bom_description,product_id,finish_product,bom_quantity,UOM) values('Table cleaner','','','','')";
        $st_insert_id = MyCommandInsertId($sql);

        echo $st_insert_id;

}
Insert();
?>

输出:- 插入的ID为http://prntscr.com/9u2iyv,并在插入后查看http://prntscr.com/9u2j6i(table)


1
根据http://php.net/manual/en/mysqli.insert-id.php,可能存在以下两个问题:
  1. 连接中没有先前的查询
  2. 查询未更新AUTO_INCREMENT值
解决方案如下:
  1. 检查表中是否插入了新记录
  2. 检查字段是否为AUTO_INCREMENT。

通过CBroe,您正在创建一个新的连接。 因此,它认为您没有插入新记录。

将函数Cnn()重写并将其更改为私有变量。


是的,记录已插入并且id列具有AUTO_INCREMENT属性。 - Twer1971

-2
在我的情况下,我的sqli是在当前函数范围之外声明的。
$conn = new mysqli($dbhost, $dbuser, $dbpass, $dbname);

我需要做的是在我的 $conn 变量前面加上 global 关键字。
function want() {
    ///...... query stuff
    global $conn;
    $conn->insert_id; // Now works
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接