首页 » 网站推广 » phpadomysql技巧_PHP中的MySQLi扩展进修三mysqli的基本操作

phpadomysql技巧_PHP中的MySQLi扩展进修三mysqli的基本操作

访客 2024-12-05 0

扫一扫用手机浏览

文章目录 [+]

$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() 方法来通报数据库做事器信息并建立连接。

相信不少朋友从代码中就可以看出,我们利用 real_connect() 可以在一个 mysqli 实例下来切换不同的数据库连接。
通过打印 mysqli 工具的内容就可以看出,两个连接的线程ID不同,也便是说,它们是不同的两个连接,但是利用的都是最上面所初始化的那个 mysqli 工具。

phpadomysql技巧_PHP中的MySQLi扩展进修三mysqli的基本操作

连接可以切换了,那么我们要连接的数据库呢?当然也可以方便地切换。

phpadomysql技巧_PHP中的MySQLi扩展进修三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("deletefromzyblog_test_userwhereid=60");var_dump($mysqli->affected_rows);$res=$mysqli->query("selectfromzyblog_test_userwhereusername='3a'");print_r($res);//mysqli_resultObject//(//[current_field]=>0//[field_count]=>4//[lengths]=>//[num_rows]=>3//[type]=>0//)print_r($res->fetch_assoc());//Array//(//[id]=>61//[username]=>3a//[password]=>3aa//[salt]=>3a//)while($row=$res->fetch_assoc()){print_r($row);}//Array//(//[id]=>62//[username]=>3a//[password]=>3aa//[salt]=>3a//)//Array//(//[id]=>63//[username]=>3a//[password]=>3aa//[salt]=>3a//)//……

对付增、删、改之类的语句,query() 方法只会返回一个布尔值,也便是语句是否实行成功。
记住,它返回的不是受影响的行数,这一点是须要把稳的。
我们如果须要获取受影响的行数须要利用 MySQLi 的属性 affected_rows 。
对付插入语句来说,获取最新插入的数据ID利用的是 insert_id 属性。

如果实行的是 SELECT 语句,那么 query() 返回的便是一个 mysqli_result 工具,它代表从一个数据库查询中获取的结果集。
关于这个工具的内容我们将在后面的文章中进行详细的解释。

实行多条 SQL 语句

实行多条 SQL 语句的能力对付 PDO 来说是无法实现的,不过听说 PDO 是支持的,语句是可以正常实行的,但是我们拿不到完全的返回结果。

$sql="insertintozyblog_test_user(username,password,salt)values('3bb','3bb','3bb');"."updatezyblog_test_usersetpassword='3aa'whereusername='3a';"."selectfromzyblog_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){//PHPFatalerror:UncaughtPDOException:SQLSTATE[HY000]:Generalerrorinvar_dump($row);}

从代码中可以看出,如果利用的是 exec() 方法,那么返回的便是 INSERT 语句的结果。
如果利用 query() 方法,返回的虽然是 PDOStatement 工具,但是它是无法遍历的。

接下来我们就看看 MySQLi 是如何来实行这个多条语句拼接在一起的 SQL 语句的。

$mysqli->multi_query($sql);$i=1;do{echo'第'.$i.'条:',PHP_EOL;$i++;$result=$mysqli->use_result();var_dump($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)#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"//["username"]=>//string(2)"3b"//["password"]=>//string(2)"3b"//["salt"]=>//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'第'.$i.'条:',PHP_EOL;$i++;$result=$mysqli->store_result();var_dump($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"]=>//string(2)"67"//["username"]=>//string(2)"3b"//["password"]=>//string(2)"3b"//["salt"]=>//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 有数据了,末了一条 SELECT now(); 语句也成功返回了。
它和我们日常利用 query() 的结果是类似的。

其余须要把稳的一点是,大家可以看一下我们实行这两条获取结果办法的循环条件是如何写得。
more_results() 和 next_result() 针对这两种结果集的获取办法也是不同的,大家可以自己测一下。

总结

光说不练假把式,虽说多语句实行看似很美好,但纵然在这大略的测试代码中,也会涌现各种问题,大家一定要自己多考试测验一下。
在日常的开拓过程中,最好还是一条一条的语句来实行,避免涌现各种无法查明的问题而影响我们正常的业务实行。
至于到底要不要利用这个能力,还是大家仁者见仁智者见智了。

测试代码:

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

标签:

相关文章

招商蛇口中国房地产龙头企业,未来可期

招商蛇口(股票代码:001979),作为中国房地产企业的领军企业,自成立以来始终秉持“以人为本,追求卓越”的经营理念,致力于打造高...

网站推广 2025-02-18 阅读1 评论0