通常,在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的神器)