努力理解如何获取新插入行的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”,并且它设置为自动递增。
如果您确实包含了错误消息,那将会很有帮助,但问题是您的 DB 类既不是 Mysqli 类的扩展,也没有实现相关接口,因此您不能简单地将其放入函数中需要一个 Mysqli 对象。正如 ADyson 已经提到的那样,您的包装类是不必要的,并且会在这里积极妨碍您,就像在许多其他地方一样。
抛弃包装类并直接使用 Mysqli 对象。
此外,全局状态通常是一个坏主意,特别是对于数据库连接。它允许“远距离的幽灵行动”,也就是看起来完全不相关的代码,通过全局命名空间中的共享对象产生副作用,并且限制您只能使用单个数据库连接而无需进行重大重写。
通常最好将数据库连接传递到需要它的调用或对象中,例如:
$db = new Mysqli(...);
foo($db, $arg1, $arg2);
$f = new Foo($db, ...);