获取最后插入行的ID(PHP/MySQL)

问题描述 投票:0回答:1

努力理解如何获取新插入行的ID。

这是我的程序 mysqli 连接和 SQL INSERT 语句:

class DB {
    
    var $conn;
    function __construct($servername, $username, $password, $dbname, $dbport = 0000) {
        $this->conn = new mysqli($servername, $username, $password, $dbname, $dbport );         
    }
 
// Run a query
    public function query($sql) {
        return $this->conn->query($sql);
    }

// Clean incoming data
    public function clean($data) {
        return $this->conn->real_escape_string($data);
    }    
}
    
define("DB_HOST","localhost");
define("DB_USER","myusername");
define("DB_PASS","mypass");
define("DB_NAME","mydbname");
define("db",new DB(DB_HOST, DB_USER, DB_PASS, DB_NAME));

$sql = db->query("INSERT INTO my_table (field_one, field_two, field_three) VALUES ( 'test1', 'test2', 'test3')");

我想我可以做一些事情(像这样):

if (mysqli_query(db, $sql)) {
    $last_id = mysqli_insert_id(db);
    echo "New record created. Last inserted ID is: " . $last_id;
    } else {
    echo "Error: " . $sql . "<br>" . mysqli_error(db);
    }

我哪里出错了?非常感谢您的解释以及原因?

也可能是一个愚蠢的问题,但在我在线阅读的示例中 - 没有一个与我设置的连接完全匹配 - 没有提到 ID 列的名称是否重要?我的格式是“table_id”而不仅仅是“id”,并且它设置为自动递增。

php mysql mysqli
1个回答
0
投票

如果您确实包含了错误消息,那将会很有帮助,但问题是您的 DB 类既不是 Mysqli 类的扩展,也没有实现相关接口,因此您不能简单地将其放入函数中需要一个 Mysqli 对象。正如 ADyson 已经提到的那样,您的包装类是不必要的,并且会在这里积极妨碍您,就像在许多其他地方一样。

抛弃包装类并直接使用 Mysqli 对象。

此外,全局状态通常是一个坏主意,特别是对于数据库连接。它允许“远距离的幽灵行动”,也就是看起来完全不相关的代码,通过全局命名空间中的共享对象产生副作用,并且限制您只能使用单个数据库连接而无需进行重大重写。

通常最好将数据库连接传递到需要它的调用或对象中,例如:

$db = new Mysqli(...);

foo($db, $arg1, $arg2);

$f = new Foo($db, ...);
© www.soinside.com 2019 - 2024. All rights reserved.