赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > PHP操作MySQL数据库
PHP操作MySQL数据库

PHP操作MySQL主要使用mysql库或mysqli,其中都包含大量的函数,提供对MySQL数据库的各种操作。mysql库比较旧,现在已经不再推荐使用,但mysqli库面向过程的方法与mysql库基本一致,只有几个函数略有更改,可以参照其方法使用。mysqli库是比较新的操作MySQL库,既可以使用面向过程的方法,也可以使用面向对象的方法,是推荐使用的函数库。

1)mysql库

这是PHP连接MySQL数据库最原始,也是最标准的方式。mysql库也提供了大量的函数来完成数据库的操作。
mysql库属于PHP的第三方库,默认情况下未启用。mysql库的功能被封装在php-mysql.dll文件中,因此在使用mysql库的函数操作数据库之前必须先引用过来。
具体方法是:打开PHP的配置文件php.ini,找到extension=php_mysql.dll所在的行,然后删除行开始的注释符号。修改后的形式为:
extension=php_mysql.dll //启用mysql库,前面的表示注释的分号要删除
Extension关键字表示这是一个第三方的扩展类库,等号后面表示要加载的类库位于php_mysql.dll文件中。默认情况下,这些类库位于PHP目录下的ext子目录中,这里实际加载的是PHP安装目录\ext\php_mysql.dll文件。
完成对php.ini的更改之后进行保存,还需要重启Apache服务器读取新的配置,然后运行phpinfo()将会看到有关mysql库的配置信息。

2)mysqli库:

从MySQL4.1开始修改了加密算法,将原来的加密函数password()更改为old_password(),新的加密算法名称为password(),于是在PHP5中新增加了一个MySQL的mysqli库与新加密函数对应。
mysqli库既可以使用以前的方式与MySQL进行操作,又对它进行了扩展支持使用PHP5面向对象的操作方式。mysqli库的主要增强功能如下:
·支持本地绑定、占位符和游标
·可以同时执行多个SQL语句
·支持面向对象的调用方式
·性能和速度上的提升
与mysql库一样,使用mysqli库之前需要在php.ini中进行配置。mysqli库的功能封装在php_mysqli.dll,因此需要取消一行的注释引入mysqli库:
extension=php_mysqli.dll //该库为PHP扩展库
完成对php.ini的更改之后进行保存。为了使修改生效还需要重新启动Apache服务器读取新的配置。然后运行phpinfo()同样会看到有关mysqli库的配置信息。

一、使用mysql函数库操作MySQL:

连接MySQL数据库是进行数据库操作的第一步,只有建立了连接才有可能实现在数据库和程序之间传输数据。在使用完成后,还必须关闭连接释放资源。

1.建立连接:

mysql_connect()函数可以打开或重复使用一个到MySQL的连接。语法格式为:
resource mysql_connect ([string $server[, string $username[, string $password[, bool $new_link[, int $client_flags]]]]])
该函数包括5个参数,其中$server表示要连接的MySQL服务器;$username表示登录时使用的用户名,默认是root;$password表示登录所用的密码,默认值为空;$new_link表示第二次调用mysql_connect()时将不会建立新连接,而是返回已经打开的连接标识符;$client_flags是一个常量,有如下可选值:
·MYSQL_CLIENT_COMPRESS:使用压缩的通信协议
·MYSQL_CLIENT_IGNORE_SPACE:允许在函数名后留空格位
·MYSQL_CLIENT_INTERACTIVE:允许设置断开连接之前所空闲等候的interative_timeout时间
·MYSQL_CLIENT_SSL:使用SSL加密
mysql_connect()函数执行成功之后返回连接句柄,否则返回false。示例:
$link=mysql_connect("localhost", "root", "root");
mysql_connect()函数还可以使用下面几种形式:
$link=mysql_connect("db.example.com:3721", "root", "password");
$link=mysql_connect("192.162.10.6:3721", "root", "password");
$link=mysql_connect("/usr/local/tmp/mysql", "root", "password");
$link=mysql_connect("localhost:/usr/local/tmp/mysql.sock", "root", "password");

使用mysql_connect()函数建立的连接在脚本执行结束后,连接也就关闭了。为此,mysql库提供了mysql_pconnect()函数可以建立一个持久化连接。语法格式为:
resource mysql_pconnect ([string $server[, string $username[, string $password[, int $client_flags]]]])
上述代码,当脚本执行完毕后到MySQL服务器的连接$link不会被关闭,连接将保持打开状态以备下次使用。即使使用mysql_close()函数也不会关闭由mysql_pconnect()函数建立的永久连接。
当连接的时候mysql_pconnect()函数将先尝试寻找一个在同一个主机上用同样的用户和密码已经打开的(持久)连接,如果找到则返回此连接标识而不打开新连接。

2.关闭连接:

使用mysql_close()函数可以关闭连接到MySQL服务器的非持久性连接。语法格式为:
bool mysql_close([resource $link_indentifier])
其中,$link_indentifier参数表示MySQL的连接句柄。如果没有指定,默认使用mysql_ connect()最后打开的一个连接。如果没有找到该连接,mysql_close()函数会尝试调用mysql_connect()建立连接并使用它。关闭成功时该函数返回true,否则返回false。

3.选择数据库:

建立连接之后便可以使用mysql_select_db()函数从MySQL服务器选择一个作为目标数据库。语法格式为:
bool mysql_select_db (string $database_name[, resource $link_indentifier])
其中,$database_name参数表示要选择的数据库,$link_indentifier参数表示数据库连接句柄。如果没有指定数据库句柄,则使用上一个已打开的数据库连接句柄;若没有已打开的数据库连接句柄,函数将尝试使用无参数调用mysql_connect()函数创建数据库连接并使用。
该函数尝试将指定MySQL服务器上标识的数据库设置为当前激活数据库。若操作成功返回true,否则返回false。

4.mysql函数库对数据库的基本操作:

从数据库中获取所需的数据并让它们显示到页面上,或者执行一个SQL语句更新数据。

1)获取结果集:

当在MySQL中执行一条查询语句时,MySQL会自动将语句发送到指定的数据库,并将获取执行的结果,然后以列和行的形式展现出来,同时输出总行数。
如果要使用PHP获取MySQL查询的结果集必须依赖于函数。

①获取查询结果的记录数:

mysql_num_rows()函数用于获取select语句查询得到数据集的行数。语法格式为:
int mysql_num_rows(resource $result)
其中,参数$result为mysql_query()函数所返回的结果集,执行后返回结果集中的记录数。

②获取结果集中的一列:

mysql_result()函数可以返回结果集中的一个列。语法格式为:
mixed mysql_result (resource $result, int $row[, mixed $field])
该函数可以从资源对象$result中指定的$row中获取一个指定的$field数据。其中,$row参数可以是列的偏移量,$field表示要获取的列名(或者别名)。如果mysql_result()函数执行成功返回列,否则返回false。

③获取数据集中的一行:

mysql_fetch_row()函数可以从结果集中取得一行作为数组。语法格式为:
array mysql_fetch_row(resource $result)
mysql_fetch_row()函数从$result关联的结果集中取得一行数据并作为数组返回。每个结果的列存储在一个数组的单元中,偏移量从0开始。

2)显示结果集:

PHP提供了一些函数用于显示在数据库中执行查询得到的数据集。

①mysql_fetch_assoc()函数:

mysql_fetch_assoc()函数可以从结果集中取得一行作为关联数组返回,如果没有更多的行,则返回false。语法格式:
array mysql_fetch_assoc(resource $result)
下面代码实现遍历表的数据:
<table>
<tr>
<th>编号</th><th>标题</th><th>发布时间</th><th>浏览次数</th><th>文章标签</th>
</tr>
<?php
  $conn=mysql_connect("localhost", "root", "123456");
  if ($conn) {
    mysql_select_db("db_blog", $conn);
    $strsql="select id,title,pubtime,views,tags from articles order by id"; //查询语句
    $result=mysql_query($strsql, $conn); //执行查询
while ($row=mysql_fetch_assoc($result)) {
       echo  "<tr>";
       echo  "<td>".$row['id']."</td>";
       echo  "<td>".$row['title']."</td>";
       echo  "<td>".$row['pubtime']."</td>";
       echo  "<td>".$row['views']."</td>";
       echo  "<td>".$row['tags']."</td>";
       echo  "</tr>";
    }
    mysql_close($conn);
  }
?>
</table>
mysql_fetch_assoc()函数从结果集$result中取出一行作为数组保存到$row变量中,然后使用while语句循环读取。取值的时候要注意,指定的数组键名必须与表中的列表一致,如果大小写不同将导致无法识别。

②mysql_fetch_array()函数:

mysql_fetch_array()函数是mysql_fetch_row()函数的扩展版本。它除了将数据以数字索引方式储存在数组中之外,还可以将数组作为关联索引储存,用列名作为键名。语法格式为:
array mysql_fetch_array(resource $result[, int $result_type])
这里的可选参数$result_type用于设置返回数组的格式,有3个可选项:
·MYSQL_ASSOC:关联数组,效果与mysql_fetch_assoc()函数相同
·MYSQL_NUM:数字数组
·MYSQL_BOTH:默认,同时产生关联和数字数组
示例:将表中所有数据保存到结果集
<h2>使用mysql_fetch_array()获取文章信息</h2>
<?php
  $conn=mysql_connect("localhost", "root", "123456");
  if ($conn) {
    mysql_select_db("db_blog", $conn);
    $strsql="select id,title,pubtime,views,tags from articles order by id"; //查询语句
    $result=mysql_query($strsql, $conn); //执行查询
    echo  "<pre>";
    print_r(mysql_fetch_array($result)); //输出返回的关联数组和数字数组
    echo  "</pre>";
    mysql_close();
  }
?>
上述代码调用mysql_fetch_array()时指定了一个参数,此时会使用默认的MYSQL_BOTH同时输出包含有关联数组和数字的数组。

③mysql_fetch_object()函数:

mysql_fetch_object()函数从结果集中获取一行数据作为对象。语法格式为:
object mysql_fetch_object(resource $result)
mysql_fetch_object()函数的功能和mysql_fetch_array()函数类似,唯一的区别是:该函数返回的是一个对象而不是数组。也就是说,只能通过列名来访问对象,而不是偏移量,并且列区分大小写。示例:
<h2>显示所有文章信息</h2>
<ul>
<?php
  $conn=mysql_connect("localhost", "root", "123456");
  if ($conn) {
    mysql_select_db("db_blog", $conn);
    $strsql="select id,title,views from articles order by id"; //查询语句
    $result=mysql_query($strsql, $conn); //执行查询
    while ($row=mysql_fetch_object($result)) {
       $id=$row->id;
       $title=$row->title;
       $pubtime=$row->views;
       echo  "<li>编号:".$id."</td>标题:".$title."| 浏览次数:".$pubtime."<br /><br /></li>";
    }
    mysql_close();
  }
?>
</ul>

3)执行SQL语句:

mysql_query()函数可以向MySQL发送select语句,还可以执行update、delete和其他数据库语句。同样,也可以使用mysql_db_query()函数把SQL语句传递给MySQL,然后由MySQL执行这些SQL语句。

①mysql_query()函数:

mysql_query()函数用于向MySQL发送一条SQL语句。语法格式为:
resource mysql_query(string $squery[, resource $link_identifier])
其中,$squery参数表示要执行的SQL语句,$link_identifier参数表示打开的数据库连接。若没有设置$link_identifier,则使用上一个已经打开的数据库连接。调用后mysql_query()函数会向$link_identifier关联的MySQL中执行$squery语句,执行成功时返回true,出错时返回false。

②mysql_db_query()函数:

mysql_db_query()函数的功能和mysql_query()函数一样,语法格式为:
resource mysql_db_query(string $database, string $query[, resource $link_identifier])
其中,$database参数为要执行SQL语句的数据库,$query参数为要执行的SQL语句,$link_identifier参数为数据库连接标识符。
mysql_db_query()函数在执行成功时,根据查询结果返回一个MySQL结果资源号,出错时将返回false。而对于insert、update和delete语句,它会返回true或false来指示执行成功或失败。
在使用该函数后,不会自动切换回先前使用mysql_select_db()函数连接的数据库。若需要再次使用先前连接的数据库,需要再次手动指定,因此建议查询时使用database.table的格式来替换该函数。示例:
<?php
  $conn=mysql_connect("localhost", "root", "123456"); //打开连接
  if ($conn) {
    echo "连接数据库成功。<br />";
    if (mysql_select_db("test_student", $conn)) { //选择test_student数据库
      echo "选择test_student数据库成功。<br />";
    }
    $strsql="insert into students (name,sex,address,age,department)" 
        value('zhht',0,'beijing',26,,'computer');"; //查询语句
    if (mysql_db_query("mis_student", $strsql)) { //向mis_student数据库插入数据
      echo "已经向mis_student数据库的student表中插入一条记录。<br />";
    }
    if (mysql_close($conn)) echo "<br />数据库已经关闭。"; //关闭连接
  }
?>
上述代码中,虽然使用mysql_select_db()语句选择了test_student数据库,mysql_db_query()语句却可以向mis_student数据库中执行$strsql语句。
不推荐使用mysql_db_query()函数,而应该用mysql_select_db()和mysql_query()来替代。

5.辅助函数:

这些函数使得PHP可以轻松地获取客户端或MySQL服务器端的信息。

1)mysql_get_client_info()函数:

mysql_get_client_info()函数返回表示客户端库的版本。语法格式为:
string mysql_get_client_info(void)

2)mysql_get_server_info()函数:

mysql_get_server_info()函数返回link_identifier所使用的服务器版本信息。语法格式为:
string mysql_get_server_info([resource $link_identifier])

3)mysql_stat()函数:

mysql_stat()函数返回当前服务器状态,例如,正常运行时间、线程、执行的查询、太慢的查询、已打开的表、已刷新的表、当前打开的表和每秒平均查询数等。语法格式为:
string mysql_stat([resource $link_identifier])

4)mysql_get_host_info()函数:

mysql_get_host_info()函数与MySQL连接所使用的连接方式,包括服务器的主机名。语法格式为:
string mysql_get_host_info([resource $link_identifier])

5)mysql_client_encoding()函数:

mysql_client_encoding()函数从MySQL中获取字符集的名称。语法格式为:
string mysql_client_encoding([resource $link_identifier])
示例:获取当前MySQL服务器的版本、所使用的字符编码集、连接方式、客户端版本号等
<h2>获取MySQL服务器的状态信息</h2>
<ul>
<?php
  $conn=mysql_connect("localhost", "root", "123456");
  echo "<li>当前使用的字符编码集为:".mysql_client_encoding($conn)."</li>";
  echo "<li>MySQL服务器版本为:".mysql_get_server_info($conn)."</li>";
  echo "<li>连接方式:".mysql_get_host_info()."</li>";
  echo "<li>客户端版本:".mysql_get_client_info()."</li>";
  echo "<li>服务器状态:".mysql_stat()."</li>";
?></ul>

6.显示MySQL数据库信息:

在进行数据库操作时,有时可能因程序的需求需要获取数据库的相关信息。例如,数据库列表等信息。

1)获取错误信息:

Mysql库提供了两个用于获取错误信息的函数。

①mysql_error()函数:

mysql_error()函数返回上一个MySQL操作产生的文本错误信息,如果MySQL操作没有出错,则返回空字符串。语法格式为:
string mysql_error([resource $link_identifier])
可选参数$link_identifier表示一个连接标识符。如果没有指定,则从上一个成功打开的MySQL服务器中提取错误信息。
mysql_error()函数仅返回最后一次MySQL函数执行(不包括mysql_error()函数和mysql_errno()函数)的错误文本,因此如果要使用此函数,应确保在调用另一个MySQL函数之前检查其值。

②mysql_errno()函数:

mysql_errno()函数可以返回上一个MySQL操作中错误信息的数字编码,而不是详细错误信息。语法格式为:
int mysql_errno([resource $link_identifier])
如果执行过程没有出错,则返回0。示例:
<?php
  echo "使用root用户的空密码连接localhost。<br />";
  $conn=@mysql_connect("localhost", "root", ""); //使用错误的用户和密码建立连接
  if ($conn) {
    echo "建立连接失败!<br />";
    echo "错误编码:".mysql_errno()."<br />"; //输出错误编码
    echo "错误描述:".mysql_error(); //输出错误信息
  }
?>

2)获取数据库信息:

如果要判断一个数据库是否已经存在,需要先获取所有数据库的列表然后比较。mysql库提供了mysql_list_dbs()函数和mysql_db_name()函数来获取数据库信息。

①mysql_list_dbs()函数:

mysql_list_dbs()函数可以返回一个包含了当前MySQL中所有可用数据库的结果集。语法格式为:
resource mysql_list_dbs([resource $link_identifier])

②mysql_db_name()函数:

mysql_db_name()函数可以取得mysql_list_dbs()调用所返回的数据库名称。语法格式为:
string mysql_db_name(resource $result, int $row[, mixed $field])
其中,$result参数表示mysql_db_name()函数调用所返回的结果集,$row参数表示结果集中的行号,$field参数表示结果集中的列名。如果成功则返回数据库名,失败返回false。

3)获取数据表信息:

①mysql_list_tables()函数:

mysql_list_tables()函数接受一个数据库名返回它包含的所有表。语法格式为:
resource mysql_list_tables(string $database[, resource $link_identifier])
其中,$database参数表示要获取数据表列表的数据库名,$link_identifier参数表示数据库连接标识符。它返回一个指定数据库中所有数据表的结果集,可使用类似mysql_fetch_row()函数获取该结果集,若失败则返回false。

②mysql_table_name()函数:

mysql_table_name()函数接受mysql_list_tables()返回的结果集,以及一个整数索引并返回表名。语法格式为:
string mysql_table_name(resource $result, int $i)

4)获取列信息:

①mysql_fetch_field()函数:

mysql_fetch_field()函数可以用来从某个查询结果中取得列的信息。语法格式为:
object mysql_fetch_field(resource $result[, int $field_offset])
$field_offset参数表示列偏移量,如果没有指定则自动提取下一个未被提取的列。函数mysql_fetch_field()将返回一个对象描述列的各种信息,该对象包括的表属性如表:


名称

说明

name

列名

table

所在的表名

max_length

最大长度

not_null

如果该列不能为NULL,则为1;否则为0

primary_key

如果该列是primary key则为1;否则为0

unique_key

如果该列是unique key则为1;否则为0

multiple_key

如果该列是non-unique key则为1;否则为0

numeric

如果该列是numeric则为1;否则为0

blob

如果该列是BLOB则为1;否则为0

type

该列的数据类型

unisigned

如果该列是无符号数则为1;否则为0

zerofill

如果该列是zero-filled(零填充)则为1;否则为0

②mysql_num_fields()函数:

mysql_num_fields()函数可以返回结果集中列的数量。语法格式为:
int mysql_num_fields(resource $result)

③mysql_list_fields()函数:

mysql_list_fields()函数可以获取指定表名的列信息。语法格式为:
resource mysql_list_fields (string $database_name, string $table_name [, resource $link_identifier)
其中,$database_name参数表示数据库名,$table_name参数表示表名。该函数返回一个结果集,可以用于mysql_field_flags()函数、mysql_field_len()函数、mysql_field_name()函数和mysql_field_type()函数等。

④mysql_field_flags()函数:

mysql_field_flags()函数可以从结果集中取得和指定列关联的标识,例如primary_key、enum和binary等。语法格式为:
string mysql_field_flags(resource $result, int $field_offset)
其中,$field_offset参数表示从哪个列开始,如果为0表示第一个列。

⑤mysql_field_len()函数:

mysql_field_len()函数可以返回指定列的长度,如果失败则返回false。语法格式为:
int mysql_field_len(resource $result, int $field_offset)

⑥mysql_field_name()函数:

mysql_field_name()函数可以返回指定索引的列名。语法格式为:
string mysql_field_name(resource $result, int $field_index)
其中,$result参数必须是一个合法的结果标识符,$field_index参数是该字段从0开始的数字偏移量。示例:

⑦mysql_field_type()函数:

mysql_field_type()函数的功能和mysql_field_name()函数相似,参数也完全相同,但返回的是列类型,列可以是int、real、string、blob类型以及其他类型。语法格式为:
string mysql_field_type(resource $result, int $field_index)

⑧mysql_field_table()函数:

mysql_field_table()函数返回指定结果集中指定偏移量列所在的表名。语法格式为:
string mysql_field_table(resource $result, int $field_offset)

二、使用mysqli函数库操作MySQL:

PHP还提供更高级的mysqli库,不仅实现了mysql库的所有操作,而且支持以面向对象的方式操作数据库,同时又很多新增功能。
MySQL扩展随PHP5应用服务器分发,需要使用时只需要激活即可。php.ini文件中:
  extension=php_mysqli.dll

1.MySQLi运行时配置:

一些配置选项会影响MySQLi扩展的运行,见下表:


配置项名

默认值

可选值

意义

mysqli.max_links

-1

PHP_INI_SYSTEM

每个处理所需的最大MySQL连接数

mysqli.default_port

NULL

PHP_INI_ALL

要使用的默认TCP端口号

mysqli.default_socket

NULL

PHP_INI_ALL

默认的cocket名

mysqli.default_host

NULL

PHP_INI_ALL

默认的主机名

mysqli.default_user

NULL

PHP_INI_ALL

默认的用户名

mysqli.default_pw

NULL

PHP_INI_ALL

默认的密码

2.MySQLi基本的使用方法:

操作数据库的基本步骤也是4个,连接并选择数据库、执行SQL查询、操控查询结果、释放资源并断开连接,并且可以实现预处理语句。
①基本的数据库查询:
示例:
<?php
/*---------建立连接--------*/
$mysqli=new mysqli("localhost","root","verydecret","myDatabase");
//检查连接状态
if(mysqli_connect_errno()){
   printf("连接失败: %s\n",mysqli_connect_error());
   exit();
}
/*---------执行查询--------*/
//设置数据编码
$mysqli->query("SET NAMES 'utf-8'");
//执行查询,返回一个结果集,mysqli_result类的一个实例
$resultset=$mysqli->query("SELECT * FROM employees");
/*---------处理结果--------*/
if($resultset){
   while($myrow=$result->fetch_assoc()){
      echo "名字:".$myrow["firstName"]."<br />";
      echo "姓氏:".$myrow["lastName"]."<br />";
      echo "职位类型:".$myrow["EmpType"]."<br />";
   }
/*---------关闭,清空所占内存--------*/
   $resultset->close();
}
/*---------关闭连接,清空所占内存--------*/
$my_sqli->close();
?>
②预处理语句:
<?php
/*---------建立连接--------*/
$mysqli=new mysqli("localhost","root","verydecret","myDatabase");
//检查连接状态
if(mysqli_connect_errno()){
   printf("连接失败: %s\n",mysqli_connect_error());
   exit();
}
/*---------创建预处理语句--------*/
//使用stmt_init()方法创建一个预处理对象
$stmt=$mysqli->stmt_init();
//调用prepare()方法创建预处理语句
$prepare=$stmt->prepare("SELECT * FROM employees WHERE Age=? AND firstName=?");
if($prepare){
   //使用bind_param()方法绑定参数
   $age=26;
   $firstName="myFirst";
   $stmt->bind_param("is",$age,$firstName);
   /*---------执行查询--------*/
   $stmt->execute();
   //将查询结果绑定到结果
   $stmt->bind_result($firstName,$lastName,$EmpType,$Age,$pic);
   //提取一条结果
   $stmt->fetch();
   //处理结果
   echo $firstName." ".$lastName." ".$EmpType." ".$Age;
/*---------关闭预处理,清空所占内存--------*/
   $stmt->close();
}
/*---------关闭连接,清空所占内存--------*/
$my_sqli->close();
?>
③调用存储过程:
使用预处理也可以调用存储过程。示例:
<?php
/*---------建立连接--------*/
$mysqli=new mysqli("localhost","root","verydecret","myDatabase");
//检查连接状态
if(mysqli_connect_errno()){
   printf("连接失败: %s\n",mysqli_connect_error());
   exit();
}
/*---------创建预处理语句--------*/
//使用stmt_init()方法创建一个预处理对象
$stmt=$mysqli->stmt_init();
//调用prepare()方法创建预处理语句
$prepare=$stmt->prepare("CALL insert_employees_1(?,?,?,?,?)");
if($prepare){
   //使用bind_param()方法绑定参数
   $age=26;
   $firstName="myFirst";
   $lastName="myLast";
   $EmpType="myEmpType";
   $pic=NULL;
   $stmt->bind_param("sssib",$firstName,$lastName,$EmpType,$age,$pic);
   /*---------执行查询--------*/
   $stmt->execute();
   //获取执行的结果
   If($result){
      echo "成功执行";
   } else {
      echo "没有执行";
   }
/*---------关闭预处理,清空所占内存--------*/
   $stmt->close();
}
/*---------关闭连接,清空所占内存--------*/
$my_sqli->close();
?>

3.使用MySQLi类:

MySQLi类表示PHP和MySQL数据库之间的连接。要使用该类,首先必须创建一个构造方法:
$mysqli=new mysqli([string $host[, string $username[, string $passwd[, string $dbname[, int $port[, string $socket]]]]]]);
MySQLi类的方法见下表:


方法

说明

autocommit()

打开或关闭自动提交的数据库选项

change_user()

改变指定数据库连接所使用的用户

character_set_name()

返回数据库连接的默认字符集

close()

关闭一个之前打开的连接

commit()

提交当前事务

connect()

打开一个到MySQL数据库服务器的新连接

debug()

执行排错操作

dump_debug_info()

取得排错信息

get_client_info()

返回客户端版本

get_host_info()

返回连接使用的类型

get_server_info()

返回MySQL服务器的信息

get_server_version()

返回MySQL服务器的版本

init()

初始化MySQLi对象

info()

取得最近执行的查询的信息

kill()

要求服务器停止一个MySQL线程

multi_query()

执行多个查询

more_results()

检查是否存在多个结果

next_result()

从当前返回的结果中读取下一个结果

options()

设置选项

ping()

检查是否有连接

prepare()

准备一个SQL查询

query()

执行一个查询

real_connect()

打开一个数据库连接

escape_string()

转义SQL语句中的特殊字符

rollback()

回滚当前事务

select_db()

选择默认的数据库

set_charset()

设置默认的客户端字符集

ssl_set()

设置ssl参数

stat()

获取当前系统状态

stmt_init()

初始化一个语句用于mysqli_stmt->prepare()方法

store_result()

从最后的查询获取一个结果集

thread_safe()

检查线程是否安全

use_result()

从最后的查询获取一个没有缓存的结果集

MySQLi类的属性见下表:


属性

说明

affected_rows

返回前一个MySQL操作所影响的行数

client_info

返回MySQL客户机的版本,作为一个字符串

client_version

返回MySQL客户机的版本,作为一个整数

errno

返回最近的函数调用所触发的错误代码

error

返回最近的函数调用所触发的错误字符串

field_count

返回最近的数据库查询所返回的字段的数量

host_info

返回一个字符串,代表所用连接的类型

info

返回最近的数据库查询的有关信息

insert_id

返回在最近的数据库查询中所用的自动产生的id

protocol_version

返回所用的MySQL协议的版本

server_info

返回一个字符串,表示服务器的版本号

server_version

返回一个整数,表示服务器的版本号

sqlstate

返回最近操作所触发错误的SQLSTATE代码

thread_id

返回当前连接所用的线程id

warning_count

返回当前一个SQL语句执行期间产生的警告的数量

4.使用mysqli_stmt类:

mysqli_stmt类表示一个预处理语句。方法见下表:


方法

说明

bind_param()

将变量绑定到预处理语句

bind_result()

将值绑定到预处理语句

close()

关闭预处理语句

data_seek()

搜索结果集中任意的行

execute()

执行一个预处理语句

fetch()

获取预处理语句中的结果,将其赋给绑定的变量

free_result()

清空存储结果占用的内存

prepare()

准备一个预处理语句

reset()

重置预处理语句

result_metadata()

获取结果集中的元数据信息

send_long_data()

发送大块数据

store_result()

为预处理语句缓存整个结果集

mysqli_stmt类的属性见下表:


属性

说明

affected_rows

返回最近操作所影响的行数

errno

返回最近操作的出错代码

error

返回最近操作的出错字符串

field_count

返回结果集中字段的数量

id

返回预处理语句的标识

insert_id

返回预处理语句为一个AUTO_INCREMENT字段产生的值

num_rows

返回结果集中行的数量

param_count

返回一个预处理语句中的参数的数量

sqlstate

返回一个字符串,用于标识最近操作的SQLSTATE代码

5.使用mysqli_result类:

mysqli_result类表示数据库的查询所返回的结果集。方法见下表:


方法

说明

close()

关闭结果集

data_seek()

移动内部的结果指针

fetch_array()

获取行,可以将结果保存为一个复合数组或索引数组,或者两者都有

fetch_assoc()

获取行,将结果保存为一个复合数组

fetch_field()

获取结果集中某个字段的信息

fetch_fields()

获取结果集中所有字段的信息

fetch_field_direct()

获取指定字段的元信息

fetch_object()

获取行,将结果保存为一个对象

fetch_row()

获取行,将结果保存为一个枚举数组

field_seek()

设置结果指针到指定的字段偏移量

free_result()

释放结果内存

mysqli_result类的属性见下表:


属性

说明

current_field

返回当前字段指针的字段偏移量

field_count

返回最近查询结果集中字段的数量

lengths

返回结果集中当前行字段的数量

num_rows

返回结果集中行的数量

type

返回类型,MYSQLI_STORE_RESULT或MYSQLI_USE_RESULT

6.面向过程的mysqli函数库使用:

mysqli库还可以想使用mysql函数库那样使用,也就是面向过程的使用方式。Mysqli库里面的函数通常都以“mysqli_”为前缀,被启用之后就可以直接使用该库里面的函数了。

1)基本操作:

下表列出常用的函数和功能:


函数名称

功能

相似mysql函数

mysqli_connect()

连接MySQL服务器

mysql_connect()

mysqli_select_db()

选择一个数据库

mysql_select_db()

mysqli_close()

关闭数据库连接

mysql_close()

mysqli_query()

执行SQL查询语句,返回结果集

mysql_query()

mysqli_num_rows()

获取结果集中受影响的行数

mysql_num_rows()

mysqli_error()

产生错误消息,如果没有错误产生一个空的字符串

mysql_error()

mysqli_errno()

产生错误的所在位置,即行号

mysql_errno()

示例:使用mysqli库函数建立一个到MySQL的连接,然后选择数据库并输出结果行
<h2>使用mysqli库函数连接MySQL</h2>
<?php
  $conn=mysqli_connect("localhost", "root", "123456"); //建立连接
  if ($conn) {
    echo "(1)建立到MySQL数据库的连接。<br />";
    mysqli_select_db($conn, "db_blog"); //选择数据库
    echo "(2)已结连接到db_blog数据库。<br />";
    $strsql="select id,title,pubtime,views,tags from articles order by id";
    $result=mysqli_query($conn, $strsql); //执行查询
    echo "(3)执行SQL语句查询articies表所有行。<br />";
    $rows=mysqli_num_rows($result); //获取查询的结果数
    echo "(4)articies表中当前共有:$rows条<br />";
    mysqli_close($conn); //关闭连接
    echo "(5)关闭数据库连接。";
  }else{
    echo "建立连接失败<br />";
    echo "错误编码:".mysqli_errno()."<br />"; //输出错误编码
    echo "错误描述:".mysqli_error(); //输出错误信息
  }
?>
大部分的mysqli库函数与mysql库中的函数使用方法相同,但是mysqli_select_db()函数和mysqli_query()函数两个参数的顺序与mysql库相反。

2)获取结果集:

使用mysqli_num_rows()可以获取mysqli_query()执行结果集中的行数,如果要遍历结果集就需要使用获取函数。mysqli库也可以获取一行、数组或者一个对象。常用函数如下表:


函数名称

功能

相似mysql函数

mysqli_fetch_object()

从结果集返回一个对象,而不是数组

mysql_fetch_object()

mysqli_fetch_row()

从结果集中获取一行数据,并将该值放到一个索引数组中

mysql_fetch_row()

mysqli_fetch_array()

从结果集获取记录,并放到数组中

mysql_fetch_array()

mysqli_fetch_assoc()

从结果集获取记录,并放到关联数组中

mysql_fetch_assoc()

使用mysqli_fetch_assoc()函数可以从结果集中获取一行,并将数据放到关联数组中。示例:
<h2>使用mysqli_fetch_assoc()获取文章信息</h2>
<?php
  $conn=mysqli_connect("localhost", "root", "123456"); //建立连接
  if ($conn) {
    mysqli_select_db($conn, "db_blog"); //选择数据库
    $strsql="select id,title,pubtime,views,tags from articles order by id";
    $result=mysqli_query($conn, $strsql); //执行查询
    echo "<pre>";
    print_r(mysqli_fetch_assoc($result)); //输出一行的数组
    echo "</pre>";
    mysqli_close($conn); //关闭连接
  }
?>
mysqli_fetch_assoc()默认会从结果集中返回第一行的数组,失败时返回false。上表中的函数都可以实现遍历结果集的功能。示例:
<h2>显示所有文章信息</h2>
<table>
<tr><th>编号</th><th>标题</th><th>浏览次数</th></tr>
<?php
  $conn=mysqli_connect("localhost", "root", "123456"); //建立连接
  if ($conn) {
    mysqli_select_db($conn, "db_blog"); //选择数据库
    $strsql="select id,title,views from articles order by id";
    $result=mysqli_query($conn, $strsql); //执行查询
    while ($row=mysqli_fetch_object($result)) { //获取一行的对象
      echo "<tr>";
      echo "<td>".$row->id."</td>";
      echo "<td>".$row->title."</td>";
      echo "<td>".$row->views."</td>";
      echo "</tr>";
    }
    mysqli_close($conn); //关闭连接
  }
?></table>

3)使用预处理语句:

通常在一些Web应用中要操作一些表,只是每次的参数不同。如果访问量很多时,这些语句对系统的使用会很大。因此,MySQL4.1以后版本提供了对预处理语句的使用,实现较低的占用及较少的代码来实现任务。
为了使用MySQL的预处理语句功能,mysqli库提供了prepare系列的函数保障开发人员在执行语句时的稳定性和安全性,以及代码编写的简洁性。按功能来分,mysqli库可以分为绑定参数预处理语句和绑定结果预处理语句。

①绑定参数预处理语句:

绑定参数预处理语句允许创建一个查询模板并保存在MySQL上。当开始一个查询时,需要把一些数据参数发给MySQL以填充这个模板。当MySQL认为这个查询是完整无误的查询后则立即执行。
例如,对一个类似如下的条件查询语句:
select * from articles where id=2;
使用查询模板后可以修改为如下形式:
select * from articles where id=?;
这里的“?”表示语句中的参数占位符,执行时将被实际值所代替。一个语句中可以同时包含多个参数占位符,例如如下的插入语句:
Insert into articles (id, title, views, tags) values (?, ?, ?, ?);
下表列出了使用绑定参数预处理语句需要用到的函数。


函数名称

功能

mysqli_stmt_prepare()

准备要执行的语句

mysqli_stmt_execute()

执行预处理语句,该语句何时执行取决于语句类型

mysqli_stmt_close()

关闭预处理语句占用的资源

mysqli_stmt_bind_param()

将变量名绑定到相应的字段(绑定参数)

mysqli_stmt_affected_rows()

返回预处理语句执行后影响的行数

以上各行数的语法格式分别为:
mysqli_stmt_prepare(mysqli_stmt stmt, string query)
mysqli_stmt_execute(mysqli_stmt stmt)
mysqli_stmt_close(mysqli_stmt stmt)
mysqli_stmt_bind_param(mysqli_stmt stmt, string types, mixed &var1[, mixed &...])
mysqli_stmt_affected_rows(mysqli_stmt stmt)
其中,stmt表示一个预处理语句对象;query表示一条SQL语句;types参数表示其后各个变量的数据类型,可接受4个参数:I表示integer,D表示double,S表示string,B表示blob类型。
示例:实现使用预处理语句向articles表中插入一行数据
<?php
  $conn=mysqli_connect("localhost", "root", "123456"); //建立连接
  if ($conn) {
    mysqli_select_db($conn, "db_blog"); //选择数据库
    $strsql="insert into articles (id, title, views) values (?, ?, ?);"; //定义预处理语句
    $stmt=mysqli_prepare($conn, $strsql); //创建预处理对象
    mysqli_stmt_bind_param($stmt, "isi", $id, $title, $views); //为预处理语句绑定参数
    $id=6;
    $title="test"; //指定$id参数的值
    $views=3;
    mysqli_stmt_execute($stmt); //执行预处理语句
    $rows=mysqli_stmt_affected_rows($stmt)); //获取影响的行数
    echo "本次操作一共影响:$rows行<br />"; //输出
    mysqli_close($conn); //关闭连接
  }
?>
使用时注意,在mysqli_prepare()函数创建的预处理对象中的参数数量必须与mysqli_stmt _bind_param()函数绑定的参数数量相同。本例中预处理语句有3个参数。
调用mysqli_stmt_bind_param()函数时第1个参数是预处理对象,第2个参数是一个字符串用于指定占位符的数据类型,后面是每个参数对应的变量。第2个参数是如下类型标识符的组合:
·i:表示占位符对应的类型是int类型。
·b:表示占位符对应的类型是blobs类型(二进制大对象类型)。
·d:表示占位符对应的类型是double或者float类型。
·s:表示占位符对应的类型是字符串或者其他类型。
这里使用的是isi组合,表示要插入的数据类型依次为int、字符串和int。然后为参数指定值,再使用mysqli_stmt_execute()函数发送给服务器处理,最后关闭连接。

②绑定结果预处理语句:

使用绑定结果的预处理语句,允许将PHP脚本中的变量绑定到所获取的相应字段上,从而可以在有时难以处理的索引或者关联数组的结果集中提取值,然后在必要时使用这些变量。
使用绑定结果预处理语句时,还需要使用mysqli_stmt_bind_result()函数和mysqli_stmt_fetch()函数。
mysqli_stmt_bind_result()函数将变量绑定到所获取的字段上。语法格式为:
bool mysqli_stmt_bind_result(mysqli_stmt stmt, mixed &var1[, mixed &...])
mysqli_stmt_fetch()函数将所获取的字段绑定到一个变量上。语法格式为:
bool mysqli_stmt_fetch(mysqli_stmt stmt)
示例:使用绑定结果准备语句查询数据
<?php
  $conn=mysqli_connect("localhost", "root", "123456"); //建立连接
  if ($conn) {
    mysqli_select_db($conn, "db_blog"); //选择数据库
    $strsql="select id, title, views from articles;"; //定义预处理语句
    $stmt=mysqli_prepare($conn, $strsql); //创建预处理对象
    mysqli_stmt_execute($stmt); //执行查询语句
    mysqli_stmt_bind_result($stmt, $id, $title, $views); //为预处理语句绑定参数
    while (mysqli_stmt_fetch($stmt)) { //遍历输出每个变量
      echo $id." ";
      echo $title." ";
      echo $views." <br />";
    }
    mysqli_close($conn); //关闭连接
  }
?>
使用时注意,mysqli_stmt_bind_result()函数第1个参数是预处理对象,后面的每个变量按顺序依次对应结果集中的一列。mysqli_stmt_fetch()函数会对结果集中的每行数据进行读取和绑定变量,因此循环结束后会遍历整个结果集。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659