20.2 PHP操作MySQL数据库
连接MySQL数据库之后,PHP可以通过query()函数对数据进行查询、插入、更新和删除等操作。但是query()函数一次只能执行一条SQL语句。如果需要一次执行多个SQL 语句,需要使用multi_query()函数。PHP通过query()函数和multi_query()函数可以方便地操作MySQL数据库。本节将为读者介绍PHP操作MySQL数据库的方法。
20.2.1执行SQL语句
PHP可以通过query()函数来执行SQL语句。如果SQL语句是INSERT语句、UPDATE语句和DELETE语句等,语句执行成功QUERY()返回TRUE,否则返回false。并且,可以通过affected_rows()函数获取发生变化的记录数。
【示例20-2】下面PHP通过query()函数执行INSERT语句。执行成功后,返回执行成功的信息,并且返回插入的记录数。其部分代码如下:
$result=$connection->query("INSERT INTO score VALUES(11,908,’法语',88)”);//执行INSERT语句 if($result){ echo "<p>INSERT语句执行成功<p>";//输出INSERT语句执行成功 echo "<p>插入的记录数:",$connection->affected_rows,"</p>"; //返回插入的记录数 } else{ echo "<p>INSERT语句执行失败<p>";//输出INSERT语句执行失败 }
INSERT语句执行成功后,会出现提示信息“INSERT语句执行成功”,并且通过affected_rows()函数可以获取插入的记录数。如果INSERT灯语句执行失败,会出现INSERT语句执行失败”
PHP也可以通过query()函数来执行SELECT语句,执行成功后会返回一个mysqli_result对象。本章假设mysql_result对象为$result,$result中存储的是SELECT语句的查询结果。通过$result->num_rows可以获取査询的记录数,$result->field_count可以获取查询结果中的字段数。
【示例20-3】下面PHP通过query()函数执行SELECT语句。执行成功后,返回执行成功的信息,并且返回查洵的记录数和字段数。其部分代码如下:
$result=$connection->query("SELECT * FROM score"); //执行 SELECT 语句 if($result){ echo "<p>SELECT语句执行成功</p>"; echo "<p>查询的记录数:",$result->num_rows,"</p>"; //输出查询的记录数 echo "<p>查询的字段数:",$result->field_count,"</p>"; //输出查询的字段数 } else{ echo "<p>SELECT语句执行失败</p>";//输出SELECT语句执行失败的信息 }
如果$result不为空时,结果输出“SELECT语句执行成功”,并且显示记录数和字段数。如果$result为空值,则说明SELECT语句执行失败。
20.2.2处理查询结果
query()函数成功的执行SELECT语句后,会返回一个mysqli_result对象$result。SELECT语句的查询结果都存储在$result中。mysqli接口中提供了4种方法来读取数据。这4种方法的介绍如下:
$rs=$result->fetch_row():以普通数组的形式返回记录,通过$rs[$n]来获取字段的值。$rs[0]表示第一个字段,后面依次类推。
$rs=$result->fetch_array():以关联数组的形式返回记录,可以通过$rs[$n]或者$rs["columName"]来获取字段的值。例如,第一个字段的字段名为id,可以通过$rs[0]或者$rs["id"]来获取id字段的值。
$rs=$result->fetch_assoc():以关联数组的形式返回记录,但只能通过 $rs["columnName "]的方式来获取字段的值。
$rs=$result->fetch_object():以对象的形式返回记录,通过$rs->columnName的方式来获取字段值。例如,通过$rs->coiumName字段的值。
【示例20-4】下面通过fetch_row()函数来返回SELECT语句的查询结果,其部分代码如下:
$result=$connection->query("SELECT * FROM score"); //执行 SELECT 语句 //判断是否还有记录,如果有记录,通过fetch_row()方法返回记录的值;如果没有记录,返回false while($rs=$result->fetch_row()){ echo "<p>",$rs[0],"\t",$rs[1],"\t",$rs[2],"\t",$rs[3],"</p>";//输出 rs 中的值 }
本示例中,$rs的值只能通过$rs[$n]的形式来获取。
【示例20-5】下面面通过fetch_array()函数来返回SELECT语句的査询结果,其部分代码如下:
$result=$connection->query("SELECT * FROM score"); //执行SELECT语句 //判断是否还有记录,如果有记录,通过fetch_array()方法返回记录的值:如果没有记录,返回false while($rs=$result->fetch_array){ echo"<p>,$rs->id,"\t",$rs.stu_id,"\t",$rs.c_name,"\t",$rs->grade,</p>"//输出 rs 的值 }
fetch_array()函数的记录可以通过$rs[$n]的形式来获取字段的值,也可以通过$rs->["columName"]的形式来获取字段的值。当然,这两种形式也是可以混用的,本示例中就将两者混用。
【示例20-6】下面通过fetch_object()两数来返回SELECT语句的查询结果。其部分代码如下:
$result=$connection->query("SELECT * FROM score"); //执行 SELECT 语句 //判断是否还有记录,如果有记录,通过fetch_object()方法返回记录的值;如果没有记录,返回false while($rs=$result->fetch_object){ echo "<p>",$rs->id,"\t",$rs->stuJdHrs->c_name,"\t",$rs->grade,"</p>"; //输出 rs 的值 }
本示例中使用fetch_object()函数来返回查询结果。通过$rs->id获取id字段的值,$rs->stu_id获取stu_id字段的值。
技巧:上面的4种方法都是按照从前到后的顺序读取记录。而且,调用一次返回一条记录。记录读取完毕后,将返回false。如果希望改变读取记录的顺序,可以使用data_seek()函数。还可以通过htmlspecialchars()函数将数据库中的特殊字符按HTML标准进行转换。
20.2.3获取查询结果的字段名
通过fetch_fields()函数可以获取查询结果的详细信息,这个函数返回对象数组。通过这个对象数组可以获取字段名、表名等信息。例如,$info=$result->fetch_fields()可以产生一个对象数组$info。然后通过$info[$n]->name获取字段名,$info[$n]->table他获取表名。
【示例20-7】下面通过fetch_fields()函数获取查询结果的字段名和所在的表的名称。其部分代码如下:
$result=$connection->query("SELECT * FROM score"); $num=$result->field_count; $info=$result->fetch_fields(); echo "<p>table:",$info[0]->table,"</p>"; for($i=0;$i<$num;$i++){ echo $info[$i]->name,"\t"; }
本示例中使用field_count函数获取字段数。通过fetch_fields()获取查询结果的详细信息,并存储到对象数组$info中。通过$info[0]->table获取表的名称,$info[$i]->name获取字段名。
20.2.4 _次执行多个SQL语句
query()函数一次只能执行一条SQL语句,而multi_query()函数可以一次执行多个SQL 语句。如果第一个SQL语句正确执行,那么Multi_query()函数返回加true,否则,返回false。PHP中使用multi_query()函数获取multi_query()函数执行查询的记录。一次只能获取一个SQL语句的执行结果。可以使用next_result()函数来判断下一个SQL语句的结果是否存在, 如果存在,next-result()函数返回true,否则,返回false。
【示例20-8】下面使用multi_query()函数一次性执行两个SELECT语句。其部分代码如下:
$sql="SELECT * FROM score;SELECT * FROM student"; //定义字符串变量,其值是两个SELECT语句 $rs=$connection->multi_query($sql); //使用multi_query()方法执行SELECT语句 if($rs){ $result=$connection->store_result(); //将查询结果赋值给$result while($row=$result->fetch_object()){ //通过fetch_object()函数取出每条记录的值 echo "<p>",$row->id,"\t",$row->stu_id,"\t",$row->c_name,"\t",$row->grade,"</p>"; } if($connection->next_result()){ //判断是否还有下一个SELECT语句的查询结果 $result=$connection->store_result(); //将査询结果赋值给$result while($row=$result->fetch_object()){ echo "<p>",$row->id,"t",$row->name,"\t",$row->sex,"\t",$row->birth,"</p>"; } } }
$rs的值为true时,表示“SELECT * FROM score”语句执行成功。然后可以通过 store_result()函数获取查询结果,并且使用next_result()函数将记录读取出来。第一个SELECT语句的记录全部读取完毕后,使用如next_result()函数判断是否还有其他SQL语句的执行结果。返回值为true时,表示还有其他结果。可以再次使用store_result()函数来读取下一个SQL语句的执行结果。
说明:store_result()函数一次读取一个sql语句的所有执行结果,并且将这些结果全部返回到客户端。除了store_result()函数以外,还可以使用use_result()函数来读取执行结果。use_result函数将读取的结果存储在服务器端,每次只向客户端传送一条记录。因此store_result()函数的效率比use_result()函数低。
20.2.5处理带参数的sql语句
PHP中可以执行带参数的SQL语句。带参数的SQL语句中可以不指定某个字段的值, 而使用问号“”代替。然后在后面的语句中指定值来替换掉问号。通过prepare()函数将带参数的SQL语句进行处理,其语句如下:
$stmt=$mysqli->prepare("INSERT INTO table(name1 , name2) VALUES(?, ?)");
上面的INSERT语句没有指定namel字段和name2字段的值,而是用问号代替。然后可以在后面的语句为这两个字段设置值。prepare()函数返回一个mysqli_stmt对象,也就是说上面语句中的$stmt是一个mysqli_stmt对象。mysqli_stmt对象通过bind_param()方法为每个变量设置数据类型,bind_param()方法中使用不同的字母来表示数据类型。这些字母介绍如下:
i表示整数。其中包括INT,TINYINT和BLGINT等
d表示浮点数。其中包括FLOAT,DOUBLE和DECIMAL等
s表示字符串。其中包括CHAR,VARCHAR和TEXT等
b表示二进制数据。其中包括BLOB等
bind_param()函数中将数据类型与相应的变量对应。其语句形式如下:
$stmt->bind_param('idsb', $var1, $var2, $var3, $var4);
上面语句中,变量$varl对应字母i,这表示$var是整数类型;变量$var2对应字母d, 这表示$var2是浮点数类型;变量$var3和$var4分别为字符串类型和二进制类型。 上面的两个语句可以将带参数的sql语句设置好,然后就可以为这些参数赋值。赋值完毕后,可以通过execute()方法执行SQL语句。其语句的基本形式如下:
$stmt->execute();
【示例20-9】下面向score表中插入两条记录。其部分代码如下:
//通过prepare()方法执行INSERT语句,INSERT语句用问号(?)代替具体的值 $stmt=$mysqli->prepare("INSERT INTO score(id, stuJd, c_name, grade) VALUES(?, ?,?,?)"); $stmt->bind_param('iisi', $id, $stu_id, $c_name, $grade); //给变量设置数据类型 $id=15;//给每个变量赋值 $stu_id=908; $c_name="数学"; $grade=85; $stmt->execute(); //执行 INSERT 语句 $id=16; //给每个变量赋值 $stu_id=909; $c_name="数学"; $grade=88; $stmt->execute(); //执行 INSERT 语句
本示例将id为15和16的两条记录插入到score表中。如果条件需要,可以通过上面的形式插入更多的记录。由上面的例子可以看出,带参数的sql语句使用起来非常灵活。 这种方法不仅可以执行INSERT语句,而且还可以执行UPDATE语句和DELETE语句。 语句执行完成后,可以通过$stmt->affect_rows属性返回影响的记录数。
20.2.6关闭创建的对象
对MySQL数据库的访问完成后,必须关闭创建的对象。连接MySQL数据库时创建了$connection对象,处理sql语句的执行结果时创建了$result对象。操作完成后,这些对象都必须使用close()方法来关闭。其基本形式为:
$result->close(); $connection->close();
当不再需要$result中的结果时,就可以关闭$result对象。当对MySQL数据库的所有操作都完成后,需要断开与MySQL数据库的连接时,可以关闭$connection对象。 如果PHP代码中使用prepare()函数,那么一定会返回mysqli_stmt对象。如果execute()方法执行完后,也可以通过close()方法关闭mysqli_stmt对象。假设mysqli_stmt对象为$stmt,关闭该对象的语句如下:
$stmt->close();
在PHP中,代码编写完成后,最好多考虑创建了哪些对象、哪些对象需要关闭。如果后面不需要再使用这些对象,那么最好将其关闭。