Home  >  Article  >  Backend Development  >  PHP的MySQLi函数库的使用 以及 表单的字符编码配置

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

WBOY
WBOYOriginal
2016-06-23 13:30:15914browse

1.什么是mysqli

PHP-MySQL 函数库是 PHP 操作 MySQL 资料库最原始的扩展库,PHP-MySQLi 的 i 代表 Improvement ,相当于前者的改进增强版,也包含了相对进阶的功能,另外本身也增加了安全性,比如可以大幅度减少 SQL 注入等问题的发生。


2. mysql与mysqli的概念相关

(1)mysql与mysqli都是php方面的函数集,与mysql数据库关联不大。

(2)在php5版本之前,一般是用php的mysql函数去驱动mysql数据库的,比如mysql_query()的函数,属于面向过程

(3)在php5版本以后,增加了mysqli的函数功能,某种意义上讲,它是mysql系统函数的增强版,更稳定更高效更安全,与mysql_query()对应的有mysqli_query(),属于面向对象,用对象的方式操作驱动mysql数据库


3. mysql与mysqli的主要区别

(1)mysql是非持继连接函数,mysql每次链接都会打开一个连接的进程,所以mysqli耗费资源少一些。

(2)mysqli是永远连接函数,mysqli多次运行mysqli将使用同一连接进程,从而减少了服务器的开销。mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。

(3)mysqli支持面向对象编程方式和面向过程编程方式,而mysql则只可以面向过程。


例如如下代码分别是mysqli的面向对象编程方式和面向过程方式

面向对象方式

<?php$mysqli = new mysqli("localhost","db_user","db_passwd","database");# check connectionif (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 connectionif (!$link) {    printf("Connect failed: %s\n",mysqli_connect_error());    exit;}printf("Host infomation: %s\n",mysqli_get_host_info($link));#close connectionmysqli_close($link);?>

(4)mysqli 可以通过预处理语句来减少开销和SQL注入的风险,而mysql则做不到。


综上所述,如果大家用的是PHP5,而且mysql版本在5.0以上,希望大家以后能用mysqli的就尽量使用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();?>

以上代码如果连接成功则运行结果

latin1mysqlnd 5.0.10 ? 20111026 ? $Id: e707c415db32080b3752b232487a435ee0372157 $localhost via TCP/IP5.6.12-log50612

如果连接失败则结果可能为

连接数据库失败: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();?>

运行结果

id10062id10063id10064


在这里需要注意的是

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

通过以上的预处理语句,我们也可以实现数据的插入。


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

  • 效率上高,就是如果执行多次相同的语句,只有语句数据不同,因为将一条语句在服务器端准备好,然后将不同的值传给服务器,再让这条语句执行。相当于编译一次,使用多次。

  • 安全上:可以防止SQL注入 (?占位)这样就可以防止非正常的变量注入。



所以,推荐大家使用mysqli 的预处理语句方式,不仅效率高,而且更安全。




-------------------------------------------------------------------

关于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">  <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)


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:php-java-bridge安装问题Next article:PHP表单之表单验证