mysqli提供了两种接口操作数据库MySQL
- 面向过程
2. 面向对象
<?php /*面向过程*/ $mysqli = mysqli_connect("localhost", "root", "123456", "mydb"); if (mysqli_connect_errno($mysqli)) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } $res = mysqli_query($mysqli, "select * from mytb"); $row = mysqli_fetch_assoc($res); echo $row[‘_msg‘]; /*面向对象 建议使用第二种*/ $mysqli = new mysqli("localhost", "root", "123456", "mydb"); if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: " . $mysqli->connect_error; } $res = $mysqli->query("select * from mytb"); while($row = $res->fetch_assoc()){ echo $row["id"]." ".$row["age"]." ".$row["name"]."\n"; } ?>
为了统一,下面仅仅使用面向对象的方式进行讲解。
mysqli支持持久连接persistent connection,持久连接在使用完后不会关闭,而是放到连接池,如果一个请求使用与上次相同的主机名,密码,端口,数据库的话,则会继续使用连接池中的连接,而不是重新新建一个连接。
mysqli->query(statements)会将得到的数据结果缓存到客户端的内存中,以备使用。
mysqli->real_query("SELECT id FROM test ORDER BY id ASC");结果仍然在mysql server上以备client读取,而不会立即缓存到客户端,PHP占用内存变小,但是MYSQL服务器的压力变大。
查询得到的数据默认都是字符串,除非设定MYSQLI_OPT_INT_AND_FLOAT_NATIVE选项
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);这样得到的数据会自动根据数据库中数据的类型来来讲数据转化。
<?php $mysqli = new mysqli("localhost", "root", "123456", "mydb"); $mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE,1);//设定自动转换 if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: " . $mysqli->connect_error; } $res = $mysqli->query("select * from mytb"); while($row = $res->fetch_assoc()){ echo $row["id"].gettype($row["id"]);//数字类型 }
Mysql数据库支持预编译的sql语句,这样sql语句接受参数,而且实现相同sql语句的高效执行。
预编译语句的执行包括两个阶段1.预编译 2.绑定参数 并且执行
<?php $mysqli = new mysqli("localhost", "root", "123456", "mydb"); $mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE,1); if ($mysqli->connect_errno) { echo "Failed to connect to MySQL: " . $mysqli->connect_error; } if($stmt = $mysqli->prepare("insert into mytb(id,age,name)values(?,?,?)")){/*预编译*/ $id = 4; $age = 28; $name = "shit"; $stmt->bind_param("iis",$id,$age,$name);/*绑定参数*/ } if($stmt->execute()){/*执行*/ echo "success!"; }
注意:不同于非预编译执行的语句,预编译语句执行的返回结果会会自动将数据类型转化为数据库中正确的类型(而非全是字符串)。
时间: 2024-10-19 14:06:08