技术开发 频道

PHP 开发经典教程(Part 8): 数据库操作

简单操作数据库 

    现在,让我们使用PHP来做同样的事情。自一开始,你就可以使用PHP来建立数据库,但是因为我们的数据库已经存在,所以我们将简单地对数据库“testdb”发出一条SELECT查询语句,然后以HTML页面显示结果:

<html> <head> <basefont face="Arial"> </head> <body> <?php // set database server access variables: $host = "localhost"; $user = "test"; $pass = "test"; $db = "testdb"; // open connection $connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); // select database mysql_select_db($db) or die ("Unable to select database!"); // create query $query = "SELECT * FROM symbols"; // execute query $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); // see if any rows were returned if (mysql_num_rows($result) > 0) { // yes // print them one after another echo "<table cellpadding=10 border=1>"; while($row = mysql_fetch_row($result)) { echo "<tr>"; echo "<td>".$row[0]."</td>"; echo "<td>" . $row[1]."</td>"; echo "<td>".$row[2]."</td>"; echo "</tr>"; } echo "</table>"; } else { // no // print status message echo "No rows found!"; } // free result set memory mysql_free_result($result); // close connection mysql_close($connection); ?> </body> </html>


    下面是程序结果:

    正如你可以看到的那样,使用PHP从数据库得到数据包括几个步骤,每个步骤实际上都是预定义的PHP函数。下面让我们仔细研究每个步骤。

1. 要做的第一件事就是指定一些在建立到数据库服务器的连接时所需要的重要信息。这些信息包括访问数据库所需要的服务器名称、用户名称和密码以及要查询的数据库名称。这些值都被设置在常规PHP变量。

<?php $host = "localhost"; $user = "test"; $pass = "test"; $db = "testdb"; ?>

 

2. 为了开始和MySQL数据库服务器通信,你需要打开一个到该服务器的连接。在PHP和数据库服务器之间的所有通信都通过这条连接而发生。 

    为了初始化该连接,PHP提供了mysql_connect()函数:

<?php $connection = mysql_connect($server, $user, $pass); ?>

 

    mysql_connect()函数中的所有参数都是可选的,但是你通常需要三个参数以在你自己的机器之外使用:数据库服务器名称,用户名称和密码。如果数据库服务器和Web服务器运行于同一台物理机器上,那么你可以使用“localhost”作为数据库服务器名称(其实际上是由PHP提供的缺省值)。 

    mysql_connect()函数返回一个“连接标识符”,该“连接标识符”存储于变量$connection中。这个标识符在与数据库通信时使用。

3. 一旦你和数据库建立了连接,那你必须用函数mysql_select_db()来选择一个数据库以供使用。

<?php mysql_select_db($db) or die ("Unable to select database!"); ?>

 

    该函数必须被传递一个用于所有后续查询的数据库名称。这里的第二个可选参数是一个连接标识符;如果没有指定标识符,那么假定最后打开的连接。如果你同时有两个或两个以上打开的数据库连接,那么将连接标识符指定为mysql_select_db()函数的第二个参数(且实际上指定为脚本中所有其他mysql_*函数的第二个参数)以便于PHP不会困惑于哪里使用哪个连接,这会是一个好注意。

4. 下一个步骤就是创建查询然后执行它。该步骤是用mysql_query()函数来完成的。

<?php $query = "SELECT * FROM symbols"; $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); ?>

 

    该函数也需要两个参数:查询字符串和用于连接的连接标识符。再次说明,如果没有指定连接标识符,那么使用最后一个打开的连接。根据查询是否成功,函数返回真或假;查询失败可以通过…或die()语句来捕获,而mysql_error()函数可用于显示对应的错误信息。

5. 如果mysql_query()成功,那么查询返回的结果集存储于变量$result中。这取决于你的查询,该结果集可包含一或多行(列)数据。你可以用不同的PHP函数(其包括这里用到的函数mysql_fetch_row(),该函数取得一行数据作为一称作$row的数组。)来检索结果集中的特定子集。该行中的字段然后就可以使用标准的PHP数组符号来访问。每次你调用mysql_fetch_row()时,结果集中的下一条记录被返回。这使得mysql_fetch_row()函数非常适用于while()或者for()循环中。

<?php if (mysql_num_rows($result) > 0) { while($row = mysql_fetch_row($result)) { echo "<td>".$row[0]."</td>"; echo "<td>".$row[1]."</td>"; echo "<td>".$row[2]."</td>"; } } ?>

 

    请注意,对函数mysql_fetch_row()的调用被包含在一条条件测试语句中,该条件测试语句首先检查看是否有任意行被返回。该信息由mysql_num_rows()函数来提供,该函数包含了查询所返回的行数。很显然,你只能将该函数用于返回数据的查询(比如,SELECT或者SHOW语句)。它不适合用于INSERT、UPDATE、DELETE或类似的查询中。 

    这里有若干其他函数可代替mysql_fetch_row(),它们将会在稍后被解释说明。

6. 最后,因为查询之后返回的每个结果集都将占用内存,所有使用函数mysql_free_result()释放使用过的内存是一个好注意。在结果集被释放后,如果没有进一步的查询运行,那么你可以用mysql_close()函数来关闭到MySQL服务器的连接。

<?php mysql_free_result($result); mysql_close($connection); ?>

 

    你也可以使用PHP的mysql_fetch_row()和list()函数来获取值的一个简单数组,然后将这些值赋给不同变量---这是上述章节中的技术的一个变化。请看(只有while()循环改变):

<html> <head> <basefont face="Arial"> </head> <body> <?php // set server access variables $host = "localhost"; $user = "test"; $pass = "test"; $db = "testdb"; // open connection $connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); // select database mysql_select_db($db) or die ("Unable to select database!"); // create query $query = "SELECT * FROM symbols"; // execute query $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); // see if any rows were returned if (mysql_num_rows($result) > 0) { // yes // print them one after another echo "<table cellpadding=10 border=1>"; while(list($id, $country, $animal) = mysql_fetch_row($result)) { echo "<tr>"; echo "<td>$id</td>"; echo "<td>$country</td>"; echo "<td>$animal</td>"; echo "</tr>"; } echo "</table>"; } else { // no // print status message echo "No rows found!"; } // free result set memory mysql_free_result($result); // close connection mysql_close($connection); ?> </body> </html>

 

    在这个例子中,list()函数用于将结果集中的不同元素赋值给PHP变量,在重现该页面时接着使用该PHP变量。 

    你可以使用PHP的mysql_fetch_assoc()函数来将每行描述为字段-值对的关联数组(上面所用技术的一点较小变化)。

<html> <head> <basefont face="Arial"> </head> <body> <?php // set server access variables $host = "localhost"; $user = "test"; $pass = "test"; $db = "testdb"; // open connection $connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); // select database mysql_select_db($db) or die ("Unable to select database!"); // create query $query = "SELECT * FROM symbols"; // execute query $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); // see if any rows were returned if (mysql_num_rows($result) > 0) { // yes // print them one after another echo "<table cellpadding=10 border=1>"; while($row = mysql_fetch_assoc($result)) { echo "<tr>"; echo "<td>".$row['id']."</td>"; echo "<td>".$row['country']."</td>"; echo "<td>".$row['animal']."</td>"; echo "</tr>"; } echo "</table>"; } else { // no // print status message echo "No rows found!"; } // free result set memory mysql_free_result($result); // close connection mysql_close($connection); ?> </body> </html>

 

    请注意,在这个例子中,字段值是通过使用字段名称而不是索引值来访问的。 

    然而,在上述所有可供选择的方法中,我最喜欢的函数是mysql_fetch_object()函数,该函数以一个具有与字段名称对应的属性的对象(还记得在第七章中所讲到它们吗?)而返回每一行。

<html> <head> <basefont face="Arial"> </head> <body> <?php // set server access variables $host = "localhost"; $user = "test"; $pass = "test"; $db = "testdb"; // open connection $connection = mysql_connect($host, $user, $pass) or die ("Unable to connect!"); // select database mysql_select_db($db) or die ("Unable to select database!"); // create query $query = "SELECT * FROM symbols"; // execute query $result = mysql_query($query) or die ("Error in query: $query. ".mysql_error()); // see if any rows were returned if (mysql_num_rows($result) > 0) { // yes // print them one after another echo "<table cellpadding=10 border=1>"; while($row = mysql_fetch_object($result)) { echo "<tr>"; echo "<td>".$row->id."</td>"; echo "<td>".$row->country."</td>"; echo "<td>".$row->animal."</td>"; echo "</tr>"; } echo "</table>"; } else { // no // print status message echo "No rows found!"; } // free result set memory mysql_free_result($result); // close connection mysql_close($connection); ?> </body> </html>

 

    这里,每个$row对象被创建的时候都具有对应于该行字段名称的属性。因此,行值可以使用标准的object->property符号来访问。 

    如果你属于那种喜欢鱼与熊掌兼得的类型的人,你大概会喜欢mysql_fetch_array()函数(该函数返回一个关联数组和数值索引数组)该函数是mysql_fetch_row() 及mysql_fetch_assoc()函数的结合。 

    请到下列网址阅读相关信息:http://www.php.net/manual/en/function.mysql-fetch-array.php。

0
相关文章