php代码,如何利用mysqli原生支持执行mysql语句?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文说一个非常原始的话题,那就是php
代码读写mysql
。如果站在各种php
框架的角度来看这个问题的话,很容易解决。所以本文的行文角度是【原生支持】,并不是被各大框架包装过的mysql
数据库读写方式。所谓的原生支持的代码写法,也是基于php
的各种extension
来决定的。本文描述的是基于php_mysqli.so
这个扩展。
大家好,这里是苏南大叔的“程序如此灵动”技术博客,记录苏南大叔的编程经验感悟。本文描述php
利用mysqli
扩展连接mysql
数据库的方式方法。测试环境:win10
,php@7.4.3nts
,mysqli@
,mysql
。本文是连接使用mysqli
方式的第一种方法,可以用于快速编写一个api.php
文件。
有哪些扩展?
php
连接mysql
,其实有很多扩展可以使用。
php_mysql
,这个被官方废弃了!php5
系列就不支持了。白瞎了这个好名字。php_mysqli
,这个是最新的官方支持,注意它是mysql
的扩展,并不是sqlite
的扩展!神之迷惑之字母i
。php_pdo_mysql
,pdo
系列数据库的代码风格都是一致的。odbc
,回到被sqlserver
支配的复杂模式...头大。
苏南大叔目前推荐大家首先使用你熟悉的框架来链接mysql
数据库,当然如果你恐怖于框架的庞大的话,就可以回过头来看看本文的内容。本文的正常使用,需要你在php.ini
中开启php_mysqli.dll
扩展。
extension = mysqli
开启后,在phpinfo()
里面就可以看到mysqli
扩展。
测试数据
默认连接localhost
的3306
,用户名密码都是root
。测试数据库是test
,数据表是users3
。建表语句如下:
DROP TABLE IF EXISTS `users3`;
CREATE TABLE `users3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`department` varchar(50) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `users3` VALUES (1,'技术部','苏南大叔','11111'),(2,'国际部','苏南大叔','22222'),(3,'后勤部','sunan大叔','33333');
连接数据库
$conn = new mysqli("localhost", "root", "root", "test", 3306);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
查询数据库
$sql = "select name,password from users3 where name = ? and password=?";
$cmd = $conn->prepare($sql);
$name = "苏南大叔";
$pass = "11111";
$cmd->bind_param("ss", $name, $pass);
// $cmd->bind_param("ss", "苏南大叔", "11111"); // Cannot pass parameter 2 by reference
$cmd->execute();
这个地方的bind_param()
函数非常奇怪,参数居然是reference
。而且,直接传递参数会报错。
Fatal error: Uncaught Error: Cannot pass parameter 2 by reference
另外第一个参数ss
,表示两个string
。
获取数据库
$cmd->bind_result($name2, $pass2);
$cmd->fetch();
var_dump($name2);
var_dump($pass2);
这个bind_result()
和上面的bind_param()
一样都是很奇怪的,和select
语句后面的字段有关,而且也是凭空生成的reference
类型。
可能获得错误提示信息是:
Warning: mysqli_stmt::bind_result(): Number of bind variables doesn't match number of fields in prepared statement
关闭链接
$conn->close();
结束语
本文里面仅仅是个代码演示,在实际的代码应用中,还是要多看官方文档,才能理解的更好了。
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。