通常,在database中的每一个表都有一个prmary key主键,比如下面这个叫做voters的表
voter_id作为主键,并且它设置了一个特殊属性 AUTO)INCREMENT ,即自动增加 (如果insert一个新的voter但没有设置它的voter_id,则它的voter_id就会被设置为一个数,并且这个数是递增的。(其中具体的算法不在这里详说))。
瞎扯了一堆还是没有说到mysql_insert_id()?莫急——
在w3school中这个函数是这么定义的
我就不翻译了——
换句话说,如果你insert了一个新的数据,又需要马上对这个项进行读取或者更新或者让这个项关联其他的表,那么你就很可能需要知道它的主键(因为主键都是独一无二的 unique)。而这个函数mysql_insert_id()就能帮你方便的获取这个主键。
没有什么比举例子更能帮助理解了:
面向过程的调用方法
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("CREATE TABLE myCity LIKE City");
$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);
printf ("New Record has id %d.\n", $mysqli->insert_id);
/* drop table */
$mysqli->query("DROP TABLE myCity");
/* close connection */
$mysqli->close();
?>
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TABLE myCity LIKE City");
$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
mysqli_query($link, $query);
printf ("New Record has id %d.\n", mysqli_insert_id($link));
/* drop table */
mysqli_query($link, "DROP TABLE myCity");
/* close connection */
mysqli_close($link);
?>
但是奇怪的是,有时候面向过程的使用方法不一定奏效,比如我今天刚写的一段代码中
mysqli_insert_id($link)
这个永远出错,无论怎么debug都找不出原因。于是我尝试使用object的方式,就立马解决了。
有可能是浏览器兼容问题或者php就是在逐渐推广OOP的使用方法(个人猜测)。
因此,建议更经常使用OOP的方式来写mysqli相关的代码。
(对小白的提示:var_dump()可以帮助显示object中的信息哟~简直是debug的神器)