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

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的面向对象编程方式和面向过程方式

面向对象方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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();
?>

面向过程的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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 );
?>

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

综上所述,如果大家用的是PHP5,而且mysql版本在5.0以上,希望大家以后能用mysqli的就尽量使用mqsqli,不仅高效,而且更安全,而且推荐大家使用面向对象编程方式。 

在这里,我们也只介绍面向对象编程方式。 

面向对象方式函数使用

1,连接数据库并获取相关信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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();
?>

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

1
2
3
4
5
latin1
mysqlnd 5.0.10 – 20111026 –  $Id : e707c415db32080b3752b232487a435ee0372157 $
localhost via TCP/IP
5.6.12-log
50612

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

1
2
连接数据库失败:Access denied  for  user ‘root’@’localhost’ (using password: YES)
连接数据库失败:Unknown database ‘hello’

2.查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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();
?>

运行结果

1
2
3
id10062
id10063
id10064


在这里需要注意的是

1
fetch_array(MYSQLI_BOTH)

这个方法,参数有三个,分别是MYSQLI_BOTH,MYSQLI_NUM,MYSQLI_ASSOC。

如果传入了MYSQLI_BOTH,返回数据的索引既包括数字和名称

1
2
3
4
5
6
7
8
9
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()

它们之间的关系如下

1
2
$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,插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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,修改内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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,预处理语句 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?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 的预处理语句方式,不仅效率高,而且更安全。 

面向过程风格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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文件里面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
< 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文件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<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();
 
 
?>

执行结果:

1
2
3
返回结果:
Current charset is: utf8 .
1 values inserted into database.

查看数据库

1
2
3
4
5
6
7
8
9
10
+ ----+------+--------------+
| s1 | tax  | s22          |
+ ----+------+--------------+
|  0 | 1.00 | 测试数据     |
|  0 | 1.00 | 测试数据     |
|  0 | 1.00 | 测试数据     |
|  0 | 1.00 | 测试数据     |
|  0 | 1.00 | 测试数据     |
+ ----+------+--------------+
rows  in  set  (0.02 sec)

猜你喜欢

转载自www.linuxidc.com/Linux/2015-08/121802.htm