为了账号安全,请及时绑定邮箱和手机立即绑定

我是小白,谢谢老师解惑下,关于用mysqli_insert_id($link);得到的值是0的问题!

在mysql.func.php中构造了下面的函数:

function insert($table,$array){
	$link=connect();
	$keys=join(",",array_keys($array));
	$vals="'".join("','",array_values($array))."'";
	$sql="insert {$table}($keys) values({$vals})";
	mysqli_query($link,$sql);
	return mysqli_insert_id($link);
}

function getInsertId(){
	$link=connect();
	return mysqli_insert_id($link);
}

在pro.func.php中调用


$res = insert ( "imooc_pro", $arr );

打印出来值却不为0.

$pid = getInsertId ();

打印出来值为0.


于是不解,百度之

The mysqli_insert_id() function returns the ID generated by a query on a table with a column having the AUTO_INCREMENT attribute. If the last query wasn't an INSERT or UPDATE statement or if the modified table does not have a column with the AUTO_INCREMENT attribute, this function will return zero.


英语不好,只好大概知道:

 mysqli_insert_id() 函数通过查询一个含有AUTO_INCREMENT属性列的表返回一个ID值,如果最后一条查询不是INSERT或者UPDATE操作或者修改的表中不含有AUTO_INCREMEN属性的列,那么这个函数就会返回0.


呃,不知道是不是这个意思.

如果是这个意思,那么在调用getInsertId()函数前,我已经调用了insert ( "imooc_pro", $arr ),应该没问题啊.但就是值就是为0.

后来我想了想,在封装getInsertId()时,我又调用了$link=connect();连接数据库的函数,是这个原因导致的吗?但如果我不调用$link=connect(),我也没办法使用mysqli_insert_id($link)函数.所以这个getInsertId()函数用mysqli_insert_id($link)函数如何能单独进行封装?

然后觉得$pid的值和$res应该是一样的,老师做这两个值的判断if ($res&&$pid)的用意是什么啊?能不就if($res),呃,实际上用这个是可以跑通的~~

呃,然后就是想问问,数据库连接好了,用了之后,是不是一定要关闭数据库,还是说一直可以连接?是不是一会儿连接数据库,一会儿关闭数据库.会Mysql数据库的性能有影响?


我是小白,谢谢老师解惑下!

正在回答

7 回答

嗯 你连接两次,相当于又建立个连接,你是在两次连接中执行的,一个连接执行插入,一个连接得到上一步插入操作产生的自增长值,肯定得不到啊,连接一次就可以

^-^...

2 回复 有任何疑惑可以回复我~
#1

独孤啸

老师 请看我的答案是否可以
2016-09-18 回复 有任何疑惑可以回复我~
#2

张浩铧

老师,mysqli_insert_id($con)要求必须有参数,也就是说必须重连一次,这样避免不了二次重连了
2017-02-23 回复 有任何疑惑可以回复我~

 $res=insert("imooc_pro", $arr);

//不用调用getInsertId(),因为insert()已经返回了一个最后一次查询中的 ID

    if($res){   //这里改一下

        foreach ($uploadFiles as $uploadFile){

            $arr1['pid']=$res;   //这里改

            $arr1['albumPath']=$uploadFile['name'];

            addAlbum($arr1);

        }

        $mes="<p>添加成功!<a href='addPro.php' target='mainFrame'>继续添加</a>|<a href='listPro.php' target='mainFrame'>查看商品</a></p>";


0 回复 有任何疑惑可以回复我~

搞定了、、、因为封装的insert本来就是返回一个id直接用$res就好了

3 回复 有任何疑惑可以回复我~
#1

张浩铧

这方法不错!
2017-02-23 回复 有任何疑惑可以回复我~

同问,取不到$pid的值

0 回复 有任何疑惑可以回复我~

这个问题我也困扰许久,其实可以这样解决:

老师没有把这块写出来 我们用个全局变量就可以


function connect(){

加上

global $link;


function insert($table,$array){

加上

global $link;

以下使用 面向过程

mysqli_query($link, $sql);

return mysqli_insert_id($link);

或 面向对象

$link->query($sql);

return $link->insert_id;

欢迎交流!


4 回复 有任何疑惑可以回复我~
#1

学点儿东西

没看懂你的意思啊,你这个同上是什么意思,能把代码写清楚吗
2016-09-22 回复 有任何疑惑可以回复我~
#2

独孤啸 回复 学点儿东西

把数据库连接对象做成全局 就可以有值了
2016-09-27 回复 有任何疑惑可以回复我~
#3

lumia2048 回复 独孤啸

你这个global $link = mysqli_connect(DB_HOST,DB_USER,DB_PWD,DB_DBNAME) 不是老师写的$link = mysqli_connect(DB_HOST,DB_USER,DB_PWD) 要写清楚点哦
2016-11-08 回复 有任何疑惑可以回复我~

跟着老师把connect封装成了一个方法,但是会导致mysqli_insert_id拿到的值永远是0,所以此处应该单独用$link建立一个连接,然后mysqli_insert_id($link);就可以拿到最新的id

function insert($table,$array){
	$keys = join(",",array_keys($array));
	$vals = "'".join("','",array_values($array))."'";
	$sql = "insert {$table} ($keys) values ({$vals})";
	/*这里不能用connect()是因为使用connect()时又执行了一次数据库连接,
	就拿不到mysqli_insert_id的最新一次id,获取到的永远都是0;*/
	$link = mysqli_connect(DB_HOST,DB_USER,DB_PWD,DB_DBNAME) or die("数据库连接失败");
	//不能用mysqli_query(connect(), $sql);
	mysqli_query($link, $sql);
	//不能用mysqli_insert_id(connect());
	return mysqli_insert_id($link);
}


1 回复 有任何疑惑可以回复我~

请问问题解决了吗,我也是遇到了一样的问题。如果直接if($res)那么pid的值一直都是0。

0 回复 有任何疑惑可以回复我~
#1

PHP12138

我也想问,最后解决了吗,由于和许多人一样不能用mysql语句,只能用mysqli,所以会和老师的有一些区别。怎么才能使pid里有值?
2016-04-21 回复 有任何疑惑可以回复我~
#2

青鸟衔音 回复 PHP12138

对这个问题 同问
2016-05-25 回复 有任何疑惑可以回复我~
#3

青鸟衔音

具体于这个问题 我用了 $sql = "SELECT id FROM pro ORDER BY id DESC LIMIT 1"; $pid = fetchOne($sql)[0]; 获得了$pid 但是mysqli函数以后可能还会出现别的问题 很闹心
2016-05-25 回复 有任何疑惑可以回复我~
#4

堕落之罪 回复 青鸟衔音

解决了吗?
2016-08-16 回复 有任何疑惑可以回复我~
#5

堕落之罪 回复 PHP12138

解决了吗
2016-08-16 回复 有任何疑惑可以回复我~
查看2条回复

举报

0/150
提交
取消
手把手教你实现电商网站后台开发
  • 参与学习       117283    人
  • 解答问题       1999    个

手把手教你用PHP搭建电子商务平台,由浅入深教你搭建电商系统

进入课程

我是小白,谢谢老师解惑下,关于用mysqli_insert_id($link);得到的值是0的问题!

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信