PHP的MySQLi函数库的使用 以及 表单的字符编码配置

PHP的MySQLi函数库的使用 以及 表单的字符编码配置,第1张

PHP的MySQLi函数库的使用以及表单的字符编码配置

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

运行结果

id10062 id10063 id10064


这里应该注意的是

fetch_array(MYSQLI_BOTH)

这个方法有三个参数,分别是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 '[email protected]' (length=17)       'email' => string '[email protected]' (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 = "[email protected]";          #执行     $stmt->execute();     #执行输出     echo "最后ID".$stmt->insert_id."<br>";     echo "影响了".$stmt->affected_rows."行<br>";          #关闭数据库连接     $mysqli->close(); ?>

通过上面的预处理语句,我们还可以插入数据。


那么预处理有什么特点呢?

  • 高效是指如果多次执行同一个语句,只是语句数据不同,因为一个语句是在服务器端准备的,那么就向服务器发送不同的值,然后执行这个语句。相当于编译一次,使用多次。

  • 安全性:可以防止SQL注入(?占位符)以防止异常变量注入。



    所以建议大家使用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文件中的代码

    <html> <body> <form action="tt.php" method="post"> <head>         <meta http-equiv="Content-Type" content="text/html; charset=utf-8">         <meta http-equiv="pragma" content="no-cache"> Test input values to MySQL<br> </head> <br> <input type="text" name="isbn" maxlength="13" size="13"> &nbsp; <input type="submit" value="提交"> </body> </html>

    这里定义了一个表单,名称是isbn,允许的数据类型是text。

    使用post方法将其传递到后端tt.php脚本页面。


    Tt.php文件代码

    <html> <head>         <meta http-equiv="Content-Type" content="text/html; charset=utf-8">         <meta http-equiv="pragma" content="no-cache"> </head> <title>          Input to MySQL page! </title> <h1> 返回结果:</h1> <?php //create short variable names $v = $_POST['isbn'];      //获取表单传递过来的值 #判断如果值为空,那么打印错误信息,并退出。 if (!$v) {         echo "you must input some values <br> Please go back and try again.";         exit; } #检查是否经过php的魔术字符转换 if (!get_magic_quotes_gpc()){         $isbn = addslashes($v); } #定义一个数据库连接对象 @ $db = new mysqli('211.162.188.60','test','123.com','test'); #设置字符 if ( $db->set_charset("utf8") ){    //注意这里是utf8  并不是utf-8         printf("Current charset is: %s <br>",$db->character_set_name()); } else {         echo "Error: Could not set this charset !"; } #检查是否连接数据库错误 if (mysqli_connect_errno()) {         echo "Error: Could not connect to database. Please try again later.";         exit; } #插入数据 $insert = "insert into ttt set S22 = '".$isbn."'"; #执行插入 *** 作 $result = $db->query($insert); #检测是否执行成功 if ($result) {         echo $db->affected_rows." values inserted into database."; //打印影响行数 } else {         echo "An error has occurred. The item was not added."; } #关闭连接 $db->close(); ?>

    执行结果:

    返回结果: 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)


    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://www.outofmemory.cn/zz/779986.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-04
    下一篇 2022-05-04

    发表评论

    登录后才能评论

    评论列表(0条)

    保存