文章教程

9.1.1连接MySQL服务器

9/17/2020 9:37:07 PM 人评论 次浏览

9.1 PHP中常用的MySQL操作函数

数据库管理员在MySQL console命令窗口中输入MySQL命令或SQL语句可以实现与MySQL数据库之间的交互,但这种交互往往需要用户掌握大量的 SQL 语句的知识。有必要使用 HTML和PHP开发一些页面程序,为用户提供更好的MySQL数据库的图形用户接口(GUI)。PHP最大的特点就是提供了大量的 MySQL 数据库操作函数,这些函数功能强大,通过这些数据库操作函数可以轻松地实现图形用户接口。

9.1.1 连接MySQL服务器

进行MySQL数据库操作前,首先确保成功连接MySQL数据库服务器。PHP中连接MySQL数据库服务器最简单的函数是mysql_connect()。

语法格式:resource mysql_connect (string hostname,string username,string password);

函数功能:通过PHP程序连接MySQL数据库服务器。如果成功连接MySQL服务器,则返回一个MySQL服务器连接标识(link_identifier),否则返回FALSE。

函数说明:连接远程MySQL数据库服务器时,只需将hostname指定为该服务器的IP地址即可。字符串username和password指定了连接数据库服务器时的用户名和对应的密码。

例如如下程序connection.php连接了本地MySQL服务器。

<?php

$serverLink1 = mysql_connect("localhost","root","");

echo $serverLink1; //输出:Resource id #3

echo "<br/>";

$serverLink2 = mysql_connect("localhost","root","");

echo $serverLink2; //输出:Resource id #3

?>

连接 MySQL 服务器的过程需要耗费大量网络以及服务器资源,为了提高系统性能以及资源利用率,在同一个 PHP 脚本程序中连接同一个 MySQL 数据库服务器时,PHP 将不会创建新的MySQL服务器连接,程序connection.php中$serverLink2的值与$serverLink1的值相等,表示它们使用的是同一个数据库服务器连接。

9.1.2 设置数据库字符集

PHP与MySQL服务器连接成功后才可以进行信息交互。信息交互之前,为了防止中文乱码,通常将字符集设置为gbk或utf8。将MySQL数据库的字符集character_set_database设置为gbk或utf8 是避免乱码问题产生的前期工作,除此以外还需要将 character_set_client、character_set_ connection和character_set_results设置为gbk或utf8字符集。调用PHP函数mysql_query("set names'gbk'")可以将character_set_client、character_set_connection和character_set_results的字符集设置为gbk字符集。

9.1.3 关闭MySQL服务器连接

MySQL服务器连接占用了数据库服务器以及WEB服务器大量资源,PHP程序与MySQL服务器信息交互之后,应尽早关闭 MySQL 服务器连接,使用函数 mysql_close()可以关闭 MySQL服务器连接。

mysql_close()函数的语法格式:bool mysql_close( [resource link_identifier] )

函数功能:mysql_close()函数关闭指定的连接标识所关联到的MySQL服务器的连接。如果没有指定link_identifier,则关闭上一个打开的连接。如果关闭成功则返回TRUE,失败则返回FALSE。例如,程序closeConnection.php如下,该程序的运行结果如图9-1所示。

figure_0185_0252
图9-1 PHP与MySQL服务器的连接

<?php

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

if($serverLink){

echo "与MySQL服务器连接成功!<br/>";

}

$close = @mysql_close($serverLink);

if($close){

echo "关闭MySQL服务器连接成功!<br/>";

}else{

exit("关闭MySQL服务器连接失败!程序中断执行!");

}

?>

figure_0185_0253PHP脚本程序执行结束后,MySQL服务器连接会作为“垃圾”被PHP垃圾回收程序自动地“回收”,因此mysql_close ()函数不必显式地调用,但养成良好的编程习惯(如显式地关闭MySQL服务器连接)是必需的。

9.1.4 选择当前操作的数据库

使用函数mysql_select_db()可以设置当前操作的数据库。

语法格式:bool mysql_select_db ( string database_name [, resource link_identifier] )

函数功能:如果没有指定 MySQL 服务器连接标识符,则使用上一个打开的 MySQL 服务器连接。如果没有打开的连接,本函数将无参数调用 mysql_connect()函数尝试打开一个新的MySQL服务器连接然后使用它。如果选择当前操作的数据库成功则返回TRUE,否则返回FALSE。例如,程序selectDB.php如下,该程序的运行结果如图9-2所示。

<?php

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$dbLink = @mysql_select_db("student",$serverLink) or die("选择当前数据库失败!程序中断执行!");

if($dbLink){

echo "选择student数据库为当前数据库!";

}

$close = @mysql_close($serverLink);

?>

figure_0186_0254
图9-2 选择当前操作的数据库

9.1.5 发送SQL语句或MySQL命令

建立 MySQL 服务器连接,设置 gbk 字符集,并选择了当前操作的数据库后,就可以使用mysql_query()函数向MySQL服务器发送SQL语句或MySQL命令,以便MySQL服务器引擎执行这些SQL语句或MySQL命令,操作某个数据库。

语法格式:{bool|resouce} mysql_query ( string sql [, resource link_identifier] )

函数功能:如果没有指定MySQL服务器连接标识link_identifier,则使用已打开的连接。然后向数据库引擎发送 sql 字符串(SQL 语句或 MySQL 命令)。当发送的 sql 字符串执行失败时, mysql_query()函数返回FALSE;发送的sql字符串是insert语句、update语句或delete语句,并且sql字符串成功执行时,mysql_query()函数返回TRUE;发送的sql字符串是select语句,并且select语句成功执行时,mysql_query()函数返回结果集(result)类型的数据(实际是resource类型的数据)。

1.发送insert语句、update语句或delete语句

使用PHP的mysql_query()函数向MySQL服务器引擎发送insert语句、update语句或delete语句后,可以使用mysql_affected_rows()函数查看该SQL语句影响到的表记录行数。

mysql_affected_rows()函数的语法格式:int mysql_affected_rows ( [resource link_identifier] )

mysql_affected_rows()函数功能:取得最近一次与 link_identifier 关联的 insert、update或delete语句所影响的记录行数。

使用PHP的mysql_query()函数发送insert语句向某个数据库表中添加记录时,若该数据库表中的某个字段为auto_increment自增字段,可以使用mysql_insert_id()函数得到当前insert语句执行后的该字段值。

语法格式:int mysql_insert_id ( [resource link_identifier] )

mysql_insert_id()函数功能:mysql_insert_id()函数返回给定的link_identifier中上一条insert语句产生的auto_increment的ID号;如果没有指定link_identifier,则使用上一个打开的连接。

mysql_insert_id()函数说明:如果上一条 sql 字符串语句没有产生 auto_increment 的值,则mysql_insert_id()函数返回0;因此如果需要使用auto_increment值,应该尽早调用 mysql_insert_id()函数得到ID号的值。

例如,如下程序studentManage.php分别使用mysql_query()函数、mysql_affected_rows()函数和mysql_insert_id()函数完成student数据库中student表的更新记录操作,该程序的运行结果如图9-3所示。

$deletedRows = mysql_affected_rows();

figure_0187_0255
图9-3 mysql_query函数的用法

<?php

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");

$insertSQL = "insert into student values(null,'test','test',2)";

$updateSQL = "update student set class_id=1 where student_name='test'";

$deleteSQL = "delete from student where student_name='test'";

$inserted = mysql_query($insertSQL);

echo "当前插入记录的student_id值为:".mysql_insert_id()."<br/>";

$insertedRows = mysql_affected_rows();

echo "插入记录的行数:$insertedRows<br/>";

$updated = mysql_query($updateSQL);

$updatedRows = mysql_affected_rows();

echo "修改记录的行数:$updatedRows<br/>";

$deleted = mysql_query($deleteSQL);

echo "删除记录的行数:$deletedRows<br/>";

$close = @mysql_close($serverLink);

?>

2.发送select语句

mysql_query()函数还可以向MySQL服务器引擎发送select语句,此时mysql_query()函数将返回一个结果集(result)数据,可以使用mysql_num_rows()函数查看该select语句查询到的表记录行数。

mysql_num_rows()函数的语法格式:int mysql_num_rows ( resource result )

mysql_num_rows()函数功能:返回结果集result中记录的行数,该函数仅对 select 语句有效。

结果集(result)使用过后,应该尽快地将其占用的服务器内存资源释放,可以使用函数mysql_free_result()实现。

mysql_free_result()函数的语法格式:bool mysql_free_result ( resource result )

mysql_free_result()函数功能:释放结果集 result 占用的服务器内存资源。若执行成功,返回TRUE,否则返回FALSE。

例如,如下程序select.php使用mysql_query()函数、mysql_num_rows()函数和mysql_free_result()函数实现student数据库student表的查询操作,该程序的运行结果如图9-4所示。

<?php

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");

$selectSQL = "select * from student";

$resultSet = mysql_query($selectSQL);

var_dump($resultSet);

echo "<br/>";

echo "student表的记录数为:".mysql_num_rows($resultSet);

mysql_free_result($resultSet);

mysql_close($serverLink);

?>

figure_0188_0256PHP脚本程序执行过后,结果集占用的服务器内存会自动地“回收”,mysql_free_result()函数不必显式地被调用,但养成良好的编程习惯(如显式地释放结果集)是必需的。

3.发送MySQL命令

使用 mysql_query()函数还可以向 MySQL 服务器引擎发送 MySQL 命令。例如 PHP 语句“ mysql_query("set names 'gbk'"); ” 将 character_set_client 、 character_set_connection 和character_set_results的字符集设置为gbk。例如如下程序command.php向MySQL服务器引擎发送了“set names 'gbk'”和“show databases”MySQL命令,并使用mysql_fetch_array()函数遍历结果集中的数据,该程序的运行结果如图9-5所示。

<?php

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$resultSet = mysql_query("show databases");

while($db = mysql_fetch_array($resultSet)){

echo $db["Database"]."<br/>";

}

mysql_free_result($resultSet);

mysql_close($serverLink);

?>

figure_0188_0257
图9-4 mysql_query函数的用法
figure_0188_0258
图9-5 mysql_query函数的用法

9.1.6 遍历结果集中的数据

使用mysql_query()函数取得select语句的结果集result后,可以使用mysql_fetch_row()函数或mysql_fetch_array()函数遍历结果集中的数据,这两个函数的共同特征是需要结果集类型的数据作为函数的参数。

mysql_fetch_row()函数的语法格式:array mysql_fetch_row ( resource result )

mysql_fetch_row()函数功能:从结果集result中取得下一行记录,并将该记录生成一个数组,数组的元素的键为从零开始的整数,数组元素的值依次为 select 语句中“字段列表”的值。若结果集result中没有下一行记录,则函数返回FALSE。

mysql_fetch_array()函数的语法格式:array mysql_fetch_array ( resource result )

mysql_fetch_array()函数功能:该函数是mysql_fetch_row()函数的扩展版本,该函数的返回值中除了包含mysql_fetch_row()函数的返回值,还包含select语句中“字段列表=>字段列表值”的数组元素。例如如下程序fetchArray.php遍历student数据库中student表的记录,并将student表中的所有记录打印在页面上,fetchArray.php程序的运行结果如图9-6所示。

figure_0189_0259
图9-6 遍历结果集中的数据

<?php

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");

$selectSQL = "select * from student";

$resultSet = mysql_query($selectSQL);

while($student = mysql_fetch_array($resultSet)){

echo $student['student_id']." ";

echo $student['student_no']." ";

echo $student['student_name']."<br/>";

}

mysql_free_result($resultSet);

mysql_close($serverLink);

?>

如果student数据库的字符集设置为gbk,遍历student表时,需使用“mysql_query("set names'gbk'");”语句将character_set_client、character_set_connection和character_set_results的字符集设置为gbk。若没有该语句,页面显示将出现中文乱码。例如,将程序fetchArray.php中的PHP语句“mysql_query("set names 'gbk'");”注释后重新访问该页面,运行结果如图9-7所示。

figure_0189_0260
图9-7 遍历结果集中的数据

fetchArray.php 程序中不能将 mysql_fetch_array()函数替换成 mysql_fetch_row()函数。如下程序fetchRow.php中的mysql_fetch_row()函数可以替换成mysql_fetch_array()函数。

<?php

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");

$selectSQL = "select * from student";

$resultSet = mysql_query($selectSQL);

while($student = mysql_fetch_row($resultSet)){

echo $student[0]." ";

echo $student[1]." ";

echo $student[2]."<br/>";

}

mysql_free_result($resultSet);

mysql_close($serverLink);

?>

figure_0190_0261在 MySQL 引擎中执行 SQL 语句或 MySQL 命令产生结果集, PHP 通过使用mysql_fetch_*()函数将 MySQL 服务器的执行结果集“拷贝”到 PHP 服务器内存,以便PHP程序对这些数据进行访问。

9.1.7 MySQL服务器连接与关闭最佳时机

MySQL服务器连接应该尽早地关闭,这并不意味着在同一个PHP脚本程序中,每一次数据库操作后,立即关闭MySQL服务器连接,例如,程序closeConnectionTime.php如下。

<?php

function student_query(){

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");

$selectSQL = "select * from student";

$resultSet = mysql_query($selectSQL) or die(mysql_error());

while($student = mysql_fetch_array($resultSet)){

echo $student['student_id']." ";

echo $student['student_no']." ";

echo $student['student_name']."<br/>";

}

mysql_free_result($resultSet);

mysql_close($serverLink);

}

student_query();

student_query();

?>

在closeConnectionTime.php程序中,每调用一次student_query()函数,都会开启新的MySQL服务器连接和关闭 MySQL 服务器连接,耗费了网络资源和服务器资源,这里推荐的做法是将程序close ConnectionTime.php修改为如下代码。

<?php

function student_query(){

$selectSQL = "select * from student";

$resultSet = mysql_query($selectSQL) or die(mysql_error());

while($student = mysql_fetch_array($resultSet)){

echo $student['student_id']." ";

echo $student['student_no']." ";

echo $student['student_name']."<br/>";

}

mysql_free_result($resultSet);

}

$serverLink = @mysql_connect("localhost","root","") or die("连接服务器失败!程序中断执行!");

mysql_query("set names 'gbk'");

$dbLink = @mysql_select_db("student") or die("选择当前数据库失败!程序中断执行!");

student_query();

student_query();

mysql_close($serverLink);

?>

这样closeConnectionTime.php在进行数据库操作时,仅打开一次MySQL服务器连接,节省了网络和服务器资源。

9.1.8 MySQL服务器连接与关闭函数的制作

由于WEB系统中的PHP程序需要经常和数据库服务器进行交互,而数据库服务器连接又是非常宝贵的系统资源,为了方便管理数据库服务器连接,可以制作PHP函数专门管理数据库服务器连接,例如,程序database.php如下。

<?php

$databaseConnection = null;

function getConnection(){

$hostname = "localhost";   //数据库服务器主机名,可以用IP代替

$database = "users";    //数据库名

$userName = "root";    //数据库服务器用户名

$password = "";     //数据库服务器密码

global $databaseConnection;

$databaseConnection = @mysql_connect($hostname, $userName, $password) or die(mysql_error());       //连接数据库服务器

mysql_query("set names 'gbk'"); //设置字符集

@mysql_select_db($database, $databaseConnection) or die(mysql_error());

}

function closeConnection(){

global $databaseConnection;

if($databaseConnection){

mysql_close($databaseConnection) or die(mysql_error());

}

}

?>

程序database.php首先定义了一个全局变量$databaseConnection,然后定义了一个开启数据库服务器的连接函数getConnection()和数据库服务器连接关闭函数closeConnection()。

figure_0191_0262使用database.php文件定义的getConnection()函数前,需要根据特定需要修改局部变量$hostname、$database、$userName和$password的值。

教程类别