我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文说一个非常原始的话题,那就是php代码读写mysql。如果站在各种php框架的角度来看这个问题的话,很容易解决。所以本文的行文角度是【原生支持】,并不是被各大框架包装过的mysql数据库读写方式。所谓的原生支持的代码写法,也是基于php的各种extension来决定的。本文描述的是基于php_mysqli.so这个扩展。

苏南大叔:php代码,如何利用mysqli原生支持执行mysql语句? - 原生支持mysqli
php代码,如何利用mysqli原生支持执行mysql语句?(图3-1)

大家好,这里是苏南大叔的“平行空间笔记本”技术博客,记录苏南大叔的编程经验感悟。本文描述php利用mysqli扩展连接mysql数据库的方式方法。测试环境:win10php@7.4.3ntsmysqli@mysql。本文是连接使用mysqli方式的第一种方法,可以用于快速编写一个api.php文件。

有哪些扩展?

php连接mysql,其实有很多扩展可以使用。

  • php_mysql,这个被官方废弃了!php5系列就不支持了。白瞎了这个好名字。
  • php_mysqli,这个是最新的官方支持,注意它是mysql的扩展,并不是sqlite的扩展!神之迷惑之字母i
  • php_pdo_mysqlpdo系列数据库的代码风格都是一致的。
  • odbc,回到被sqlserver支配的复杂模式...头大。

苏南大叔目前推荐大家首先使用你熟悉的框架来链接mysql数据库,当然如果你恐怖于框架的庞大的话,就可以回过头来看看本文的内容。本文的正常使用,需要你在php.ini中开启php_mysqli.dll扩展。

extension = mysqli

开启后,在phpinfo()里面就可以看到mysqli扩展。

苏南大叔:php代码,如何利用mysqli原生支持执行mysql语句? - phpinfo_mysqli
php代码,如何利用mysqli原生支持执行mysql语句?(图3-2)

测试数据

默认连接localhost3306,用户名密码都是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');

苏南大叔:php代码,如何利用mysqli原生支持执行mysql语句? - 数据库
php代码,如何利用mysqli原生支持执行mysql语句?(图3-3)

连接数据库

$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();

结束语

本文里面仅仅是个代码演示,在实际的代码应用中,还是要多看官方文档,才能理解的更好了。

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php    mysql