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所示。
<?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服务器连接失败!程序中断执行!");
}
?>
PHP脚本程序执行结束后,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);
?>
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();
<?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);
?>
PHP脚本程序执行过后,结果集占用的服务器内存会自动地“回收”,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);
?>
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所示。
<?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所示。
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);
?>
在 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()。
使用database.php文件定义的getConnection()函数前,需要根据特定需要修改局部变量$hostname、$database、$userName和$password的值。