1.什么是mysqli?
PHP-MySQL函数库是PHP *** 作MySQL数据库最原始的扩展库。PHP-MySQL的I代表改进,相当于前者的改进增强版。它还包含了比较先进的功能,也增加了自身的安全性,比如大大减少SQL注入等问题。
2.mysql与mysqli的概念有关
(1)mysql和mysql都是php中的函数集,和mysql数据库联系不大。
(2)在php5之前,php的mysql函数一般用来驱动mysql数据库,比如mysql_query()的函数,它是面向进程的。
(php5之后,增加了mysqli的函数功能。从某种意义上说,它是mysql系统功能的加强版,更加稳定、高效、安全。Myqli_query()对应mysql_query(),是面向对象的,通过对象 *** 作驱动mysql数据库。
3.MySQL和MySQL的主要区别
(1)mysql是非持久连接功能。mysql每次链接都会打开一个连接的进程,所以MySQL消耗的资源比较少。
(2)Myqli是永久连接函数。Myqli在多次运行Myqli时会使用相同的连接过程,从而减少服务器的开销。Mysqli封装了一些高级 *** 作,比如事务,以及DB *** 作中很多可用的方法。
(mysql支持面向对象编程和面向过程编程,而mysql只能面向过程。
比如下面的代码分别是mysqli的面向对象编程模式和面向过程模式。
面向对象模式
<?php $mysqli = new mysqli("localhost","db_user","db_passwd","database"); # check connection if (mysqli_connect_errno()) { printf ("Connect failed: %s\n",mysql_connect_error()); exit; } printf ("Host infomation: %s\n",$mysqli->host_info); # close connection $mysqli->close(); ?>面向过程的方法
<?php $link = mysqli_connect("localhost","db_user","db_passwd","database"); # check connection if (!$link) { printf("Connect failed: %s\n",mysqli_connect_error()); exit; } printf("Host infomation: %s\n",mysqli_get_host_info($link)); #close connection mysqli_close($link); ?>(mysql可以通过预处理语句来降低开销和SQL注入的风险,但mysql不能。
综上所述,如果你使用的是PHP5,mysql版本在5.0以上,希望你以后能尽量使用mqsqli。不仅效率高,而且更安全,推荐你使用面向对象编程。
这里只介绍面向对象编程。
使用面向对象的模式函数
1、连接数据库并获取相关信息
<?php $mysqli = new mysqli("localhost","root","","mysql"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #获取当前字符集 echo $mysqli->character_set_name()."<br>"; #获取客户端信息 echo $mysqli->get_client_info()."<br>"; #获取mysql主机信息 echo $mysqli->host_info."<br>"; #获取服务器信息 echo $mysqli->server_info."<br>"; #获取服务器版本 echo $mysqli->server_version."<br>"; #关闭数据库连接,严格来说,这并不是必要的,因为脚本执行完毕的时候他们将被自动关闭 $mysqli->close(); ?>如果连接成功,上面的代码运行结果。
latin1 mysqlnd 5.0.10 – 20111026 – $Id: e707c415db32080b3752b232487a435ee0372157 $ localhost via TCP/IP 5.6.12-log 50612如果连接失败,结果可能是
连接数据库失败:Access denied for user ‘root’@’localhost’ (using password: YES) 连接数据库失败:Unknown database ‘hello’2.查询数据
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #构造SQL语句 $query = "SELECT * FROM test ORDER BY id LIMIT 3"; #执行SQL语句 $result = $mysqli->query($query); #遍历结果 while ($row = $result->fetch_array(MYSQLI_BOTH)){ echo "id".$row["id"]."<br>"; } #释放结果集 $result=free(); #关闭连接 $mysqli->close(); ?>运行结果
这里应该注意的是
这个方法有三个参数,分别是MYSQLI_BOTH、MYSQLI_NUM和MYSQLI_ASSOC。
如果传入MYSQLI_BOTH,则返回数据的索引包括数字和名称。
array(size=26) 0=>string '10062'(length=5) 'id' => string '10062' (length=5) 1 => string '??' (length=2) 'name' => string '??' (length=2) 2 => string '10169103@qq.com' (length=17) 'email' => string '10169103@qq.com' (length=17) 3 => string '18366119732' (length=11) 'phone' => string '18366119732' (length=11)实际上,fetch_row()和fetch_assoc()是等价的方法
它们之间的关系如下
$result->fetch_row() = mysql_fetch_row() = $result->fetch_array(MYSQLI_NUM) = mysql_fetch_array(MYSQLI_NUM) 返回索引数组 $result->fetch_assoc() = mysql_fetch_assoc() = $result->fetch_array(MYSQLI_ASSOC) = mysql_fetch_array(MYSQLI_ASSOC) 返回索引列名如果fetch_array()方法不传递任何东西,默认情况下是MYSQLI_BOTH。
3.插入数据
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #插入数据 $sql = "INSERT INTO test(name,phone) values ("hello","10086")"; #执行插入语句 $result = $mysqli->query($sql); #如果执行错误 if (!$result){ echo "SQL语句有误<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit(); } #如果插入成功,则返回影响的行数 echo $mysqli->affected_rows; #关闭数据库连接 $mysqli->close(); ?>如果插入成功,结果将是1;如果失败,将会报告一个错误。
4、修改内容
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #执行语句 $sql = "update test set name = 'hello' where id = 10062"; #执行修改语句 $result = $mysqli->query($sql); #如果执行错误 if (!$result){ echo "SQL语句有误<br>"; echo "ERROR:".$mysqli->errno."|".$mysqli->error; exit(); } #如果修改成功,则返回影响的行数 echo $mysqli->affected_rows; #关闭数据库连接 $mysqli->close(); ?>如果修改成功,还会返回修改的行数。
5、预处理语句
<?php $mysqli = new mysqli("localhost","root","","test"); #如果连接失败 if (mysql_connect_errno()){ echo "数据库连接失败:".mysql_connect_error(); $mysqli = null; exit(); } #准备好一条语句放到服务器中,比如插入语句 $sql = "INSERT INTO test(name,email) values (?,?)"; #生成预处理语句 $stmt = $mysqli->prepare($sql); #给站位符号每个 ? 号传值(绑定参数)i d s b,没一个参数为格式化字符,ss代表两个字符串,d代表数字 $stmt = bind_param("ss",$name,$email); #执行 $stmt->excute(); #为变量赋值 $name = "Mike"; $email = "mike@live.cn"; #执行 $stmt->execute(); #执行输出 echo "最后ID".$stmt->insert_id."<br>"; echo "影响了".$stmt->affected_rows."行<br>"; #关闭数据库连接 $mysqli->close(); ?>通过上面的预处理语句,我们还可以插入数据。
那么预处理有什么特点呢?
所以建议大家使用mysqli的预处理语句,不仅效率高,而且更安全。
面向过程的风格
<?php $link = mysqli_connect('localhost', 'my_user', 'my_password', 'test'); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } /* change character set to utf8 */ if (!mysqli_set_charset($link, "utf8")) { printf("Error loading character set utf8: %s\n", mysqli_error($link)); } else { printf("Current character set: %s\n", mysqli_character_set_name($link)); } mysqli_close($link); ?>-
关于html表单提交字符时MySQL中字符编码的问题
让我们首先看看html文件中的代码
这里定义了一个表单,名称是isbn,允许的数据类型是text。
使用post方法将其传递到后端tt.php脚本页面。
Tt.php文件代码
执行结果:
返回结果: Current charset is: utf8 . 1 values inserted into database.查看数据库
+----+------+--------------+ | s1 | tax | s22 | +----+------+--------------+ | 0 | 1.00 | 测试数据 | | 0 | 1.00 | 测试数据 | | 0 | 1.00 | 测试数据 | | 0 | 1.00 | 测试数据 | | 0 | 1.00 | 测试数据 | +----+------+--------------+ 5 rows in set (0.02 sec)欢迎分享,转载请注明来源:内存溢出
评论列表(0条)