当前位置: 首页 > 后端技术 > PHP

PHP中的MySQLi扩展学习(三)mysqli的基本操作

时间:2023-03-29 19:29:30 PHP

我们继续学习MySQLi扩展。上一篇文章提到,MySQLiextensions的功能比PDO多,所以我们还是会在继续学习的过程中穿插MySQLi中各种好玩的方法功能。不过,今天的主角是MySQLi中如何执行SQL语句以及多条SQL语句的执行。连接和选择数据库首先是一个小内容的学习和分享。依旧是连接数据库,不过这次我们使用另一种方式连接。$mysqli=newmysqli();$mysqli->real_connect("localhost","root","","blog_test");var_dump($mysqli);//["thread_id"]=>//int(163)$mysqli->real_connect("localhost","root2","123","blog_test");var_dump($mysqli);//["thread_id"]=>//int(164)首先,我们实例化创建了一个mysqli对象。在实例化过程中,我们没有向mysqli构造函数传递任何参数,而是使用real_connect()方法传递数据库服务器信息并建立连接。相信很多朋友都可以从代码中看出,我们可以在一个mysqli实例下使用real_connect()来切换不同的数据库连接。通过打印mysqli对象的内容可以看出,这两个连接的线程ID是不同的,也就是说是两个不同的连接,但是都使用了最上面初始化的mysqli对象。连接是可以切换的,那我们要连接的数据库呢?当然,您也可以轻松切换。$mysqli->select_db('mysql');就是这样一个简单的select_db()方法,可以帮助我们在代码执行过程中动态修改连接的数据库。执行SQL语句对于PDO,如果是查询语句,我们需要使用query()方法。如果是其他的增删改查语句,我们需要使用exec()来执行不同的SQL语句。但是在MySQLi中,我们只统一使用query()方法。$mysqli->query("insertintozyblog_test_user(username,password,salt)values('3a','3a','3a')");var_dump($mysqli->affected_rows);var_dump($mysqli->insert_id);$mysqli->query("updatezyblog_test_usersetpassword='3aa'whereusername='3a'");var_dump($mysqli->affected_rows);$mysqli->query("从zyblog_test_user中删除id=60");var_dump($mysqli->affected_rows);$res=$mysqli->query("select*fromzyblog_test_userwhereusername='3a'");print_r($res);//mysqli_result对象//(//[current_field]=>0//[field_count]=>4//[lengths]=>//[num_rows]=>3//[type]=>0//)print_r($res->fetch_assoc());//数组//(//[id]=>61//[用户名]=>3a//[密码]=>3aa//[salt]=>3a//)while($row=$res->fetch_assoc()){print_r($row);}//数组//(//[id]=>62//[用户名]=>3a//[密码]=>3aa//[salt]=>3a//)//大批//(//[id]=>63//[用户名]=>3a//[密码]=>3aa//[salt]=>3a//)//......用于增删改查,修改等语句,query()方法只会返回一个布尔值,即语句是否执行成功。请记住,它不会返回受影响的行数,这一点需要注意。如果我们需要获取受影响的行数,我们需要使用MySQLi的属性affected_rows。对于insert语句,insert_id属性用于获取最新插入的数据ID。如果执行SELECT语句,则query()返回一个mysqli_result对象,它表示从数据库查询中获得的结果集。我们会在后面的文章中详细解释这个对象的内容。执行多条SQL语句的能力是PDO做不到的,但是据说PDO是支持的,语句可以正常执行,但是我们无法得到完整的返回结果。$sql="insertintozyblog_test_user(username,password,salt)values('3bb','3bb','3bb');".“更新zyblog_test_usersetpassword='3aa'whereusername='3a';”."select*fromzyblog_test_userwhereusername='3b';"."selectnow()";$pdo=newPDO("mysql:dns=locahost;dbname=blog_test",'root','',[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION]);$res=$pdo->exec($sql);var_dump($res);//int(1)$stmt=$pdo->query($sql);foreach($stmtas$row){//PHP致命错误:未捕获的PDOException:SQLSTATE[HY000]:var_dump($row)中的一般错误;}从代码中可以看出,如果使用了exec()方法,那么返回的就是一条INSERT语句的结果。如果使用query()方法,虽然返回了PDOStatement对象,但是无法遍历。接下来我们看看MySQLi是如何执行这条多条语句拼接在一起的SQL语句的。$mysqli->multi_query($sql);$i=1;do{echo'文章'.$我。'文章:',PHP_EOL;$i++;$result=$mysqli->use_result();var_dump($结果);var_dump($mysqli->affected_rows);if(is_object($result)){var_dump($result->fetch_assoc());}var_dump($mysqli->next_result());echo'========',PHP_EOL;}while($mysqli->more_results());//第1条://bool(false)//int(1)//========//第2条条目://bool(false)//int(0)//========//第3条条目://object(mysqli_result)#2(5){//["current_field"]=>//int(0)//["field_count"]=>//int(4)//["lengths"]=>//NULL//["num_rows"]=>//int(0)//["type"]=>//int(1)//}//int(-1)//array(4){//["id"]=>//string(2)"67"//["用户名"]=>//字符串(2)"3b"//["密码"]=>//字符串(2)"3b"//["盐"]=>//string(2)"3b"//}//========//第4条://bool(false)//int(0)//=========multi_query()是MySQLi提供的执行多条SQL语句的方法。执行后,返回的结果是一个布尔值。如果第一条语句有问题,则返回FALSE。如果后面的语句是错误的,我们需要调用next_result()来获取后面语句的错误信息。其实这也引出了我们的next_result()方法的作用。相当于为获取下一个结果的操作做准备,也可以看作是将游标移动到下一条SQL语句。more_results()方法是判断是否还有更多语句没有执行。use_result在上面的测试代码中,使用了use_result()方法来获取每条语句的执行结果。它的作用是启动结果集的检索。也就是说,当执行mutli_query()时,这些语句并不会立即执行,而是在调用use_result()时执行当前语句。我们注意到INSERT和UPDATE语句返回FALSE。SELECT语句中的num_rows也是0。这是它的特点,它不会直接将结果集信息保存在程序的内存中。所以use_result()方法最大的优点就是占用内存小,适合大量查询的遍历。缺点是每次都需要去数据库查询,速度慢。store_result除了use_result(),还有一个store_result()方法可以帮助我们获取查询的结果集。它与use_result()方法相反,即直接执行,将结果集保存在内存中。$mysqli=newmysqli("localhost","root","","blog_test");$mysqli->multi_query($sql);$i=1;do{echo'第'.$我。'条:',PHP_EOL;$i++;$result=$mysqli->store_result();变量转储($结果);var_dump($mysqli->affected_rows);if(is_object($result)){var_dump($result->fetch_assoc());}var_dump($mysqli->next_result());echo'========',PHP_EOL;}while($mysqli->more_results());//第1条://bool(false)//int(1)//========//第2条://bool(false)//int(0)//========//第3条://object(mysqli_result)#1(5){//["current_field"]=>//int(0)//["field_count"]=>//int(4)//["lengths"]=>//NULL//["num_rows"]=>//int(7)//["type"]=>//int(0)//}//int(7)//array(4){//["id"]=>//字符串(2)"67"//["用户名"]=>//字符串(2)"3b"//["密码"]=>//字符串(2)"3b"//["盐"]=>//string(2)"3b"//}//========//第4条://object(mysqli_result)#3(5){//["current_field"]=>//int(0)//["field_count"]=>//int(1)//["lengths"]=>//NULL//["num_rows"]=>//int(1)//["type"]=>//int(0)//}//int(1)//array(1){//["now()"]=>//string(19)"2020-09-1410:31:37"//}不仅查询结果中的num_rows有数据,而且最后一条SELECTnow();语句也成功返回,和我们的结果类似日常使用query()还有一点需要注意的是,大家可以看看这两个获取结果的方法的循环条件我们是怎么写的,more_results()和next_result()这两个结果集的方法也是不一样的。。大家可以自己测试一下日常生活在开发过程中,最好把每一条语句都执行一遍,这样可以避免出现各种不能ide的问题通知并影响我们正常的业务执行。至于要不要使用这个能力,就看大家自己了。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/6。PHP之MySQLi扩展学习(三)mysqli的基本操作。PHP参考文档:https://www.php.net/manual/zh/book.mysqli.php各媒体平台均可搜索【硬核项目经理】