PHP+MySQL数据库函数简介
时间:2006-08-04 来源:mylxiaoyi
在我们安装和设置了我们的MySQL数据库以后,我们就可以开始编写PHP脚本来与他进行交互了。在这里我们将会试着解释网站也数据交互的所有基本函数。
MySQL4.1系列的开发版本引入了一些新的特征,这些新的特征需要重写PHP中已经存在的MySQL的支持函数。这些新的PHP扩展被称之为改进的
MySQL。这必须在安装PHP时使用--with-mysqli选项构建入PHP中,他所提供的函数是以mysqli_为前缀的,而不是旧版本的以
mysql_为前缀。MySQL4.1系列和与搭配的新的PHP扩展之前一些差距,所以我们只是关注于现在的支持,这将会覆盖的以现有的
MySQL/PHP安装。
连接MySQL
初始化MySQL连接的基本命令如下:
如果我们使用变量则为
mysql_connect($hostname,$user,$password);
如果我们使用字符串则为
mysql_connect('localhost','root','sesame');
在这里密码是可选的,这取决于我们所使用的数据库。如果不需要密码,则那个变量留空。我们也可以为我们的服务器指定一个端口和套接吕($hostname:port:socket),除非我们特殊的选择了一个非标准的端口与套接口,否则我们并不需要这样做。
相应的mysqli函数为mysqli_connect,这个函数可以允许我们指定第四个参数,从而我们可以在我们用来连接的函数中指定我们选择的数据
库。函数mysqli_select_db是存在的,但是我们只是希望在同一个连接中使用多个数据库时才会使用这个函数。
在同一个脚本中,我们在每一次查询数据库时并不需要每一次都要建立一个新的数据库连接。然而对于每一个与数据库交互的脚本,我们需要再一次运行这个函数。
下面,我们需要来选择要使用的数据:
如果我们使用变量,其格式如下
mysql_select_db($database);
如果我们使用字符串,其格式如下
mysql_select_db('phpbook');
我们必需要在每一次我们建立一个连接时选择一个数据库,这也就是至少是在每一个页面或是每一次我们更改数据后都会这样做。否则,我们就会得到一个没有选择
数据库的错误。即使我们对于每一个后台程序只创建了一个数据库,我们也必须这样做,因为MySQL默认创建了名为mysql和test的数据库,而这也许
正是我们所没有考虑的。
我们也许会发现将我们所有的连接信息放在一个自定义的连接函数中,而将这个连接函数放在我们所有的脚本都可以访问到的地方是一件很方便的事情,例如PHP的包含目录,或者是一个虚拟服务器。这个函数看起来也许是类似于下面的样子:
// Connect to a single db
function qdbconn()
{
$dbUser = "myusr";
$dbPass = "mypassword";
$dbName = "mydatebase";
$dbHost = "myhost";
if(!($link=mysql_connect($dbHost,$dbUser,$dbPass)))
{
error_log(mysql_error(),3,"/tmp/phplog.err");
}
if(!mysql_select_db($dbName,$link))
{
error_log(mysql_error(),3,"/tmp/phplog.err");
}
}
如果我们愿意,我们可以通过在同一个服务器上创建到多个数据库的连接来扩展这个函数。这段代码同时也会在PHP错误日志中记录MySQL的错误信息。
现在我们已经创建了一个指向一个特定数据库的连接了,这样我们就准备好进了数据库的查询了。
查行MySQL查询
由PHP进行的数据库查询是包将在一个名为mysql_query()的微小的PHP函数中的基本MySQL命令。这也是我们使用SELECT,
INSERT,UPDATE,DELETE等SQL命令的地方。MySQL命令如创建(CREATE)或是删除(DROP)一个表的命令也可以由PHP函
数来实现,如果我们不想使用MySQL客户端进行这些操作时,我们可以选择这样来做。
我们可以用下面最简单的方式编写一个查询语句:
msyql_query("SELECT Surname FROM personal_info WHERE ID20030702";
$result = mysql_query($query,$link_2);
正如我们所想到的那样,改进的MySQL函数为mysqli_query().他与前面我们所介绍的函数相类似,所不同的只是query和link改变了位置而且可以有第三个参数允许我们指定一个结果标记来指明PHP如何处理结果。
如查我们的查询是INSERT,UPDATE,DELETE,CREATE TABLE,DROP
TABLE并且返回TRUE,我们可以使用mysql_affected_rows来查看有多少行因为这个查询而改变了。这个函数可以选择带一个连接标
识,除非我们要使用多个连接时可以这样做。他并不会将结果作为参数。我们可以像下面的样子来调用这个函数,而没有指定结果处理:
$affected_rows = mysql_affected_rows();
如果我们的查询是一个SELECT语句,我们可以使用 mysql_num_rows($result)来查看通过一个成功的SELECT返回了多少行。
mysqli_affected_rows与mysqli_num_rows与mysql_的函数相类似。
取出数据集
经常困扰PHP新手一个问题就是从PHP中取出数据的概念。我们常常会逻辑的认为查询的结果就是我们需要的数据,但是事实这是不正确的。正如我们在前面所
讨论的那样,PHP查询的结果是一个代表成功或是失败的整数或是查询的标识符。实际上发生的事情是这样的:mysql_query()命令将数据从数据中
取出然后向PHP发送信息来报告执行的状态。此时,所取出的数据存在于一个MySQL或是PHP都不可以访问的地方。数据就在那里,但是却在等待配置的命
令。他需要mysql_fetch函数来使得这些数据可以为PHP所用。
这些取数函数如下:
mysql_fetch_row:将行作为列举数组返回
mysql_fetch_object:将行作为对象返回
mysql_fetch_array:将行作为关联数组返回
mysql_result:返回数据的一个元素
这三个取数函数之间的区别是很微小的。最一般的就是mysql_fetch_row,其用法如下:
$query = "SELECT ID,LastName,FirstName FROM users WHERE Status = 1";
$result = mysql_query($query);
while($name_row = mysql_fetch_row($result))
{
print("$name_row[0] $name_row[1] $name_row[2]
\n");
}
这段代码将会从数据库中输出指定的行,每一行包含一行或是与唯一的ID相关的信息。
函数mysql_fetch_object执行同样的任务,所不同的是数据是作为一个对象而不是一个数组返回的。很明显这对于面向对象编程是很有帮助的。
其用法如下:
$query = "SELECT ID,LastName,FirstName FROM users WHERE Status = 1";
$result = mysql_query($query);
while($row = mysql_fetch_object($result))
{
echo "$row->ID,$row->LastName,$row->FirstName
\n";
}
最常用的取数据函数为mysql_fetch_array,这个函数会提供将结果作为关联数组或是列举数,或是同时,默认为同时。这就意味着我们可以通过数据域的名字而不是数字来访问输出的数据。
$query = "SELECT ID,LastName,FirstName FROM users WHERE Status = 1";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo "$row['ID'],$row['LastName'],$row['FirstName']
\n";
}
在这里我们要知道就是mysql_fetch_array可以以与mysql_fetch_row完全相同的方法来进行使用,这时所使用的是数字索引而不
是区域名称。通过使用这个函数,我们可以用这样的选择。如果我们想指明偏移或是区域名称而不是两者,那么我们可以用下面的方法来做到:
$offset_row = mysql_fetch_array($result,MYSQL_NUM);
或是
$associative_row = mysql_fetch_array($result,MYSQL_ASSOC);
我们也可以使用MYSQL_BOTH来作来第二个参数值,而这也正是默认的情况。
在PHP的早期版本
,mysql_fetch_row曾被认为要比mysql_fetch_object与mysql_fetch_object快得多,但是到现在这已不再
是一个问题,因为他们之间的不同已经是相当的微小了。而现在的PHP小组推荐使用mysql_fetch_array。
最后一个也是最少一个使用到的取数函数为mysql_result(),只有当我们要从数据库中取出一个数据时的情况下才会考虑这个函数。如下面的一个例子:
$query = "SELECT count(*) FROM personal_info";
$db_result = mysql_query($query);
$datapoint = mysql_result($db_result,0,0);
mysql_result函数需要三个参数,结果标识,行标识,以及可选的区域。区域名称的值可以是上面的偏移,或是关联数组中的名字("Surname"),或是MySQL中的用数据表表示的名字("personal_info.Surname").
如果可能尽量使用偏移,因为这要比另外的两个快一些。更好的就是不要经常的使用这个函数。一个良好的格式化查询可以更为高效的返回查询的结果。
所有的PHP取出数据集的函数与mysqi相应的函数相同,他们传递同样的参数并返回结果。
还有一个特殊的MySQL函数可以用来与这些取数函数中的任何一个来搭配使用从而更为明确的指明所要求的行号。这个函数为
mysql_data_seek,这个函数需要一个结果标识符与一个行号作为参数,然后移动内部的行指针到指定的行数据集上。这个函数最常用的用法是通过
将行号重新置为零在结果集中循环,这与数组的重置相类似。这样就避免了到数据而进行昂贵的数据库调用。下面是一个使用mysql_data_seek例
子:
\ntitle\n");
$query = "SELECT title,publisher FROM books";
$result = mysql_query($query);
while($book_row = mysql_fetch_array($result))
{
echo ("$book_row[0]\n");
}
echo ("
\n");
echo ("\nPublishers\n");
mysql_data_seek($result,0);
while($book_row = mysql_fetch_array($result))
{
echo ("$book_row[1]\n");
}
echo ("
\n");
?>
如果没有mysql_data_seek函数,结果集的第二次使用就不会返回第0行,因为现在已经到了结果集的最末,如果我们不有显式的移动数据指针就会停在那里。这个函数对于我们格式化数据是相当有用的。
得到数据的数据
我们需要PHP函数来从已存在的数据库中取出或是将数据写入已存在的MySQL数据库中:mysql_connect,mysql_select_db,
mysql_query,mysql_fetch_array。在这一部分我们要讨论的其余的大多数函数可以得到我们放入或是从数据库取出的数据信息,或
者是得到数据本身的结构。PHP提供扩展的内建函数来得到我们将数据存放在其中的数据表名,一个特定的列所处理的数据类型,或者是我们刚插入数据的行号。
通过这些函数,我们可以更为高效的使用数据库进行工作。
MySQL的元数据函数可以分为两类:
只返回关于前一个操作信息的函数
返回关于数据库结构信息的函数
第一种类型一个常用的例子就是mysql_insert_id(),这个函数会返回一个我们刚插入数据的自增行号。第二种类型的一个常用的例子就是
mysql_field_type(),这个函数会显示出一个特定数据的数据域类型是否必须为integer,varchar,text。然而只要我们观
察一下我们就会发现这个函数的名字是一个欺骗性的名字。这个函数返回的是PHP的数据类型而不是MySQL的类型。例如,一个ENUM类型的域返回的类型
为string。使用
mysql_field_flags函数可以返回更多的域信息。很显然这个函数是作用在结果集上而不是实际的MySQL域上。如果有一个函数可以得到一个
ENUM域的可能值是相当有用的,但是在现在仍是不可能的。相反的,我们可以使用描述表查询然后使用PHP的常规表达式来分析结果可以达到这样的目的。
关于数据的数据的大多数函数都是不言自明的。但是却有一些我们内容在我们使用这些函数时应记住的。首先,这些函数中的大多数只有经过合适的组合时才会有高
效的结果,不要试着在SELECT查询后使用mysql_affected_rows函数,然后考虑哪里出现了错误。其次,要小心返回我们的数据库结构信
息的函数的安全性。知道每一个数据表的名字以及结构对于一个黑客来说是相当有价值的。最后,我们要清楚,许多函数只是一个装满了简单函数的购物篮。如果我
们需要关于某一个数据集或是数据库的一些信息,使用mysql_fetch_field函数要比mysql_field函数快得多。
所有的MySQL元数据函数都是相当容易使用的。然后,他们的效率直接依赖于数据结构设计的精巧,而不是PHP的力量。一个好的数据库例子可以很好的使用这些函数。mysqli相当的函数在每一种情况下都做了很好的分析。
多个连接
除非我们有一个特殊的原因要求我们使用多个连接,我们在每一个PHP页面中只需要一个数据库连接。即使我们多次进入某一个页面,我们连接仍然是良好的。如果我们不是不得不进行再一次的连接的话,我们完全不需要创建多个连接,因为这是大多数的数据查询中时费时的操作。
然而,并没有较为简单的办法在从一个页面进入另一个页面时保持我们的连接,因为PHP与MySQL并不知道当访问者退出时何时关闭连接。所以我们的连接会在每一个脚本的末尾时断开,除非我们使用了持久的连接。
我们需要使用不同的连接的主要原因是如果我们要两个或是多个不同的数据库上进行查询。我们要这样做的最常见的情况就是我们正在复制的情况下使用数据库。MySQL的复制是通过主从结构来实现的,我们可以从从数据库读出,然后写入主数据库。
要使用多个连接,我们只需简单的打开到所需数据库的多个连接,并且要保证将其与合适的结果集进行关联。PHP可以通过使用结果标识来帮助我们完成这些工
作。我们将结果标识作为一个可选的参数传递给MySQL函数。如果我们在移动到下一个连接之前完成了所有的查询,我们并不需要这样做。PHP会自动使用最
后打开的连接。
在下面的例子中,我们将会在不同的服务器上使用三个不同的数据库。
0 && $widgetcount > 0) {
$link3 = mysql_connect(‘host3’, ‘I’, ‘seed’);
mysql_select_db(‘salesdb’, $link3);
$query3 = “INSERT INTO saleslog (ID, date, userID, sku)
VALUES (NULL, ‘$today’, ‘$array1[0]’, ‘$array2[0]’)”;
$result3 = mysql_query($query3, $link3);
$insertID = mysql_insert_id($link3);
mysql_close($link3);
if ($insertID >= 1) {
print(“Perfect entry”);
}
else {
print(“Danger, danger, Will Robinson!”);
}
} else {
print(“Not enough information”);
}
?>
在这个例子中,我们为了我们明确的目的,我们尽可能离散的考虑了我们的数据库连接,包括在我们使用以后关闭我们的数据库连接.如果没有
mysql_close()命令,我们可以并行的运行多个数据连接,而这也正是我们要做的.并没有什么可以阻止我们这样做.我们只要记住小心的将我们的连
接值从一个函数传递到另一个函数,这样就会一切都好的.
内建的错误检查
这一部分本应该用"Die,die,die!"来作为标题的,因为主要的错误检查函数实际上就是die().
die()并不是一个MySQL函数,PHP手册页将其归为多面函数.他只是简单的结速脚本并返回我们的选择字符串.
mysql_query(“SELECT * FROM mutual_funds
WHERE code = ‘$searchstring’”)
or die(“Please check your query and try again.”);
在这里我们要注意语法格式:一个单词or(我们也可以使用||运行算符进行替换)并且第一对组合之后只有一个分号。
直到最近,MySQL依据PHP的数据库查询返回不安全的和无提示意义的错误信息。die()是经常使用的一个方法来控制当用操作失败时用户可以看到的信息。现在根本就没有返回任何的错误信息,die也许是更为必须的,除非我们将用户丢在那里迷惑发生了什么。
其他的内建的错误检查方法是错误信息。这些在开发以及高度的过程中是相当有用的,而且他们也很容易的在最后的产品发布时的最终版本中注释掉。正发我们所提
到的,MySQL的错误信息在默认的情况下不再是显而易见的了。如果我们希望看到他们,我们不得不使用mysql_errno()(这个函数会为每一个错
误类型的返回一个代码号)或是mysql_error()(这个函数会返回文本信息)来进行请求。然后我们可以使用error_log()函数将他们写入
到自定义的错误日志中。
如下面的例子:
if (!mysql_select_db($bad_db)) {
print(mysql_error());
}
然而除了die还有许多其他的数据库错误处理。服务器不可用,数据集错误等各种情况。我们已经相当自由的设置了连接然后进行查询,但是较为理想的情况是第
一次与数据库的交互都应与一个条件相嵌套,这个条件可以在成功的时候返回希望的结果集,而在失败的时候返回一个清楚的错误清理界面。这也正是die()的
用武之地。整个脚本的执行立即中断,然后离开,如果没有其他的内容,如果他们已经在我们的PHP中进行了定义,就会关闭我们的HTML标记。另外,也许会
有许多更好的脚本或是HTML来继续我我们的页面,其中的代码是不会受断开的数据连接或是失败的查询的影响。最近die并不会记让我们知道哪里发生了错
误。我们会认为我们有用户会告诉我们吗?不可能。而更为现实的他们失望地离开我们的网站然后永远不会回来。下面演示的是一个好的错误处理的例子:
function printError($errorMesg) {
printf(“%s
\n”, $errorMesg);
}
function notify($errorMesg) {
mail([email protected], “An Error has occurred at
example.com”, $errorMesg)
}
if ($link = mysql_connect(“host”, “user”, “pass”) {
// Things to do if the connection is successful
} else {
printError(“Sorry for the inconvenience; but we are unable
to process your request at this time. Please check back
later”);
notify(“Problem connecting to database in $SCRIPT_NAME at
line 12 on date(‘Y-m-D’)”);
}
更好的办法是如果我们熟悉PHP5新的OOP特征,我们可以试着使用异常处理。
使用PHP创建MySQL数据
如果我们愿意,我们可以使用PHP来创建我们的MySQL数据库而不是使用MySQL客户端工具。这个想法有着潜在的优点,对于那些认为MySQL命令难于使用的用户我们可以使用一个吸引人的前端,而这样做的最大的缺点就是安全问题。
要使用PHP来创建数据,我们的脚本的用户应在MySQL上有着完全的CREATE/DROP权限。这也就意味着控制了这个脚本的任何人也许都会将我们的
数据库清空。这从安全的角度来说这并不是一个好主意。而且,大多数的外部站点并不会允许我们在他们的服务器上作任何事情。
如果我们仍是希望使用PHP来创建我们的MySQL数据库,那我们就只能自己帮助我们自已了,至少我们不要在一个文本文件里存放我们的用户名与密码。每一
次我们要处理插入或是使用这个脚本时我们要保证我们要在一个表单中输入的我们的用户名与密码然后传递给变量。这是一个将变量保存在我们Web树之外的由
include包含的文件中也并不足够的例子。
相关的函数如下:
mysql_create_db():在一个主机上创建数据库,数据库名字作为参数传递
mysql_drop_db():删除指定的数据库
mysql_query():传递表定义
如下面的一个例子:
MySQL4.1系列的开发版本引入了一些新的特征,这些新的特征需要重写PHP中已经存在的MySQL的支持函数。这些新的PHP扩展被称之为改进的
MySQL。这必须在安装PHP时使用--with-mysqli选项构建入PHP中,他所提供的函数是以mysqli_为前缀的,而不是旧版本的以
mysql_为前缀。MySQL4.1系列和与搭配的新的PHP扩展之前一些差距,所以我们只是关注于现在的支持,这将会覆盖的以现有的
MySQL/PHP安装。
连接MySQL
初始化MySQL连接的基本命令如下:
如果我们使用变量则为
mysql_connect($hostname,$user,$password);
如果我们使用字符串则为
mysql_connect('localhost','root','sesame');
在这里密码是可选的,这取决于我们所使用的数据库。如果不需要密码,则那个变量留空。我们也可以为我们的服务器指定一个端口和套接吕($hostname:port:socket),除非我们特殊的选择了一个非标准的端口与套接口,否则我们并不需要这样做。
相应的mysqli函数为mysqli_connect,这个函数可以允许我们指定第四个参数,从而我们可以在我们用来连接的函数中指定我们选择的数据
库。函数mysqli_select_db是存在的,但是我们只是希望在同一个连接中使用多个数据库时才会使用这个函数。
在同一个脚本中,我们在每一次查询数据库时并不需要每一次都要建立一个新的数据库连接。然而对于每一个与数据库交互的脚本,我们需要再一次运行这个函数。
下面,我们需要来选择要使用的数据:
如果我们使用变量,其格式如下
mysql_select_db($database);
如果我们使用字符串,其格式如下
mysql_select_db('phpbook');
我们必需要在每一次我们建立一个连接时选择一个数据库,这也就是至少是在每一个页面或是每一次我们更改数据后都会这样做。否则,我们就会得到一个没有选择
数据库的错误。即使我们对于每一个后台程序只创建了一个数据库,我们也必须这样做,因为MySQL默认创建了名为mysql和test的数据库,而这也许
正是我们所没有考虑的。
我们也许会发现将我们所有的连接信息放在一个自定义的连接函数中,而将这个连接函数放在我们所有的脚本都可以访问到的地方是一件很方便的事情,例如PHP的包含目录,或者是一个虚拟服务器。这个函数看起来也许是类似于下面的样子:
// Connect to a single db
function qdbconn()
{
$dbUser = "myusr";
$dbPass = "mypassword";
$dbName = "mydatebase";
$dbHost = "myhost";
if(!($link=mysql_connect($dbHost,$dbUser,$dbPass)))
{
error_log(mysql_error(),3,"/tmp/phplog.err");
}
if(!mysql_select_db($dbName,$link))
{
error_log(mysql_error(),3,"/tmp/phplog.err");
}
}
如果我们愿意,我们可以通过在同一个服务器上创建到多个数据库的连接来扩展这个函数。这段代码同时也会在PHP错误日志中记录MySQL的错误信息。
现在我们已经创建了一个指向一个特定数据库的连接了,这样我们就准备好进了数据库的查询了。
查行MySQL查询
由PHP进行的数据库查询是包将在一个名为mysql_query()的微小的PHP函数中的基本MySQL命令。这也是我们使用SELECT,
INSERT,UPDATE,DELETE等SQL命令的地方。MySQL命令如创建(CREATE)或是删除(DROP)一个表的命令也可以由PHP函
数来实现,如果我们不想使用MySQL客户端进行这些操作时,我们可以选择这样来做。
我们可以用下面最简单的方式编写一个查询语句:
msyql_query("SELECT Surname FROM personal_info WHERE ID20030702";
$result = mysql_query($query,$link_2);
正如我们所想到的那样,改进的MySQL函数为mysqli_query().他与前面我们所介绍的函数相类似,所不同的只是query和link改变了位置而且可以有第三个参数允许我们指定一个结果标记来指明PHP如何处理结果。
如查我们的查询是INSERT,UPDATE,DELETE,CREATE TABLE,DROP
TABLE并且返回TRUE,我们可以使用mysql_affected_rows来查看有多少行因为这个查询而改变了。这个函数可以选择带一个连接标
识,除非我们要使用多个连接时可以这样做。他并不会将结果作为参数。我们可以像下面的样子来调用这个函数,而没有指定结果处理:
$affected_rows = mysql_affected_rows();
如果我们的查询是一个SELECT语句,我们可以使用 mysql_num_rows($result)来查看通过一个成功的SELECT返回了多少行。
mysqli_affected_rows与mysqli_num_rows与mysql_的函数相类似。
取出数据集
经常困扰PHP新手一个问题就是从PHP中取出数据的概念。我们常常会逻辑的认为查询的结果就是我们需要的数据,但是事实这是不正确的。正如我们在前面所
讨论的那样,PHP查询的结果是一个代表成功或是失败的整数或是查询的标识符。实际上发生的事情是这样的:mysql_query()命令将数据从数据中
取出然后向PHP发送信息来报告执行的状态。此时,所取出的数据存在于一个MySQL或是PHP都不可以访问的地方。数据就在那里,但是却在等待配置的命
令。他需要mysql_fetch函数来使得这些数据可以为PHP所用。
这些取数函数如下:
mysql_fetch_row:将行作为列举数组返回
mysql_fetch_object:将行作为对象返回
mysql_fetch_array:将行作为关联数组返回
mysql_result:返回数据的一个元素
这三个取数函数之间的区别是很微小的。最一般的就是mysql_fetch_row,其用法如下:
$query = "SELECT ID,LastName,FirstName FROM users WHERE Status = 1";
$result = mysql_query($query);
while($name_row = mysql_fetch_row($result))
{
print("$name_row[0] $name_row[1] $name_row[2]
\n");
}
这段代码将会从数据库中输出指定的行,每一行包含一行或是与唯一的ID相关的信息。
函数mysql_fetch_object执行同样的任务,所不同的是数据是作为一个对象而不是一个数组返回的。很明显这对于面向对象编程是很有帮助的。
其用法如下:
$query = "SELECT ID,LastName,FirstName FROM users WHERE Status = 1";
$result = mysql_query($query);
while($row = mysql_fetch_object($result))
{
echo "$row->ID,$row->LastName,$row->FirstName
\n";
}
最常用的取数据函数为mysql_fetch_array,这个函数会提供将结果作为关联数组或是列举数,或是同时,默认为同时。这就意味着我们可以通过数据域的名字而不是数字来访问输出的数据。
$query = "SELECT ID,LastName,FirstName FROM users WHERE Status = 1";
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo "$row['ID'],$row['LastName'],$row['FirstName']
\n";
}
在这里我们要知道就是mysql_fetch_array可以以与mysql_fetch_row完全相同的方法来进行使用,这时所使用的是数字索引而不
是区域名称。通过使用这个函数,我们可以用这样的选择。如果我们想指明偏移或是区域名称而不是两者,那么我们可以用下面的方法来做到:
$offset_row = mysql_fetch_array($result,MYSQL_NUM);
或是
$associative_row = mysql_fetch_array($result,MYSQL_ASSOC);
我们也可以使用MYSQL_BOTH来作来第二个参数值,而这也正是默认的情况。
在PHP的早期版本
,mysql_fetch_row曾被认为要比mysql_fetch_object与mysql_fetch_object快得多,但是到现在这已不再
是一个问题,因为他们之间的不同已经是相当的微小了。而现在的PHP小组推荐使用mysql_fetch_array。
最后一个也是最少一个使用到的取数函数为mysql_result(),只有当我们要从数据库中取出一个数据时的情况下才会考虑这个函数。如下面的一个例子:
$query = "SELECT count(*) FROM personal_info";
$db_result = mysql_query($query);
$datapoint = mysql_result($db_result,0,0);
mysql_result函数需要三个参数,结果标识,行标识,以及可选的区域。区域名称的值可以是上面的偏移,或是关联数组中的名字("Surname"),或是MySQL中的用数据表表示的名字("personal_info.Surname").
如果可能尽量使用偏移,因为这要比另外的两个快一些。更好的就是不要经常的使用这个函数。一个良好的格式化查询可以更为高效的返回查询的结果。
所有的PHP取出数据集的函数与mysqi相应的函数相同,他们传递同样的参数并返回结果。
还有一个特殊的MySQL函数可以用来与这些取数函数中的任何一个来搭配使用从而更为明确的指明所要求的行号。这个函数为
mysql_data_seek,这个函数需要一个结果标识符与一个行号作为参数,然后移动内部的行指针到指定的行数据集上。这个函数最常用的用法是通过
将行号重新置为零在结果集中循环,这与数组的重置相类似。这样就避免了到数据而进行昂贵的数据库调用。下面是一个使用mysql_data_seek例
子:
\ntitle\n");
$query = "SELECT title,publisher FROM books";
$result = mysql_query($query);
while($book_row = mysql_fetch_array($result))
{
echo ("$book_row[0]\n");
}
echo ("
\n");
echo ("\nPublishers\n");
mysql_data_seek($result,0);
while($book_row = mysql_fetch_array($result))
{
echo ("$book_row[1]\n");
}
echo ("
\n");
?>
如果没有mysql_data_seek函数,结果集的第二次使用就不会返回第0行,因为现在已经到了结果集的最末,如果我们不有显式的移动数据指针就会停在那里。这个函数对于我们格式化数据是相当有用的。
得到数据的数据
我们需要PHP函数来从已存在的数据库中取出或是将数据写入已存在的MySQL数据库中:mysql_connect,mysql_select_db,
mysql_query,mysql_fetch_array。在这一部分我们要讨论的其余的大多数函数可以得到我们放入或是从数据库取出的数据信息,或
者是得到数据本身的结构。PHP提供扩展的内建函数来得到我们将数据存放在其中的数据表名,一个特定的列所处理的数据类型,或者是我们刚插入数据的行号。
通过这些函数,我们可以更为高效的使用数据库进行工作。
MySQL的元数据函数可以分为两类:
只返回关于前一个操作信息的函数
返回关于数据库结构信息的函数
第一种类型一个常用的例子就是mysql_insert_id(),这个函数会返回一个我们刚插入数据的自增行号。第二种类型的一个常用的例子就是
mysql_field_type(),这个函数会显示出一个特定数据的数据域类型是否必须为integer,varchar,text。然而只要我们观
察一下我们就会发现这个函数的名字是一个欺骗性的名字。这个函数返回的是PHP的数据类型而不是MySQL的类型。例如,一个ENUM类型的域返回的类型
为string。使用
mysql_field_flags函数可以返回更多的域信息。很显然这个函数是作用在结果集上而不是实际的MySQL域上。如果有一个函数可以得到一个
ENUM域的可能值是相当有用的,但是在现在仍是不可能的。相反的,我们可以使用描述表查询然后使用PHP的常规表达式来分析结果可以达到这样的目的。
关于数据的数据的大多数函数都是不言自明的。但是却有一些我们内容在我们使用这些函数时应记住的。首先,这些函数中的大多数只有经过合适的组合时才会有高
效的结果,不要试着在SELECT查询后使用mysql_affected_rows函数,然后考虑哪里出现了错误。其次,要小心返回我们的数据库结构信
息的函数的安全性。知道每一个数据表的名字以及结构对于一个黑客来说是相当有价值的。最后,我们要清楚,许多函数只是一个装满了简单函数的购物篮。如果我
们需要关于某一个数据集或是数据库的一些信息,使用mysql_fetch_field函数要比mysql_field函数快得多。
所有的MySQL元数据函数都是相当容易使用的。然后,他们的效率直接依赖于数据结构设计的精巧,而不是PHP的力量。一个好的数据库例子可以很好的使用这些函数。mysqli相当的函数在每一种情况下都做了很好的分析。
多个连接
除非我们有一个特殊的原因要求我们使用多个连接,我们在每一个PHP页面中只需要一个数据库连接。即使我们多次进入某一个页面,我们连接仍然是良好的。如果我们不是不得不进行再一次的连接的话,我们完全不需要创建多个连接,因为这是大多数的数据查询中时费时的操作。
然而,并没有较为简单的办法在从一个页面进入另一个页面时保持我们的连接,因为PHP与MySQL并不知道当访问者退出时何时关闭连接。所以我们的连接会在每一个脚本的末尾时断开,除非我们使用了持久的连接。
我们需要使用不同的连接的主要原因是如果我们要两个或是多个不同的数据库上进行查询。我们要这样做的最常见的情况就是我们正在复制的情况下使用数据库。MySQL的复制是通过主从结构来实现的,我们可以从从数据库读出,然后写入主数据库。
要使用多个连接,我们只需简单的打开到所需数据库的多个连接,并且要保证将其与合适的结果集进行关联。PHP可以通过使用结果标识来帮助我们完成这些工
作。我们将结果标识作为一个可选的参数传递给MySQL函数。如果我们在移动到下一个连接之前完成了所有的查询,我们并不需要这样做。PHP会自动使用最
后打开的连接。
在下面的例子中,我们将会在不同的服务器上使用三个不同的数据库。
0 && $widgetcount > 0) {
$link3 = mysql_connect(‘host3’, ‘I’, ‘seed’);
mysql_select_db(‘salesdb’, $link3);
$query3 = “INSERT INTO saleslog (ID, date, userID, sku)
VALUES (NULL, ‘$today’, ‘$array1[0]’, ‘$array2[0]’)”;
$result3 = mysql_query($query3, $link3);
$insertID = mysql_insert_id($link3);
mysql_close($link3);
if ($insertID >= 1) {
print(“Perfect entry”);
}
else {
print(“Danger, danger, Will Robinson!”);
}
} else {
print(“Not enough information”);
}
?>
在这个例子中,我们为了我们明确的目的,我们尽可能离散的考虑了我们的数据库连接,包括在我们使用以后关闭我们的数据库连接.如果没有
mysql_close()命令,我们可以并行的运行多个数据连接,而这也正是我们要做的.并没有什么可以阻止我们这样做.我们只要记住小心的将我们的连
接值从一个函数传递到另一个函数,这样就会一切都好的.
内建的错误检查
这一部分本应该用"Die,die,die!"来作为标题的,因为主要的错误检查函数实际上就是die().
die()并不是一个MySQL函数,PHP手册页将其归为多面函数.他只是简单的结速脚本并返回我们的选择字符串.
mysql_query(“SELECT * FROM mutual_funds
WHERE code = ‘$searchstring’”)
or die(“Please check your query and try again.”);
在这里我们要注意语法格式:一个单词or(我们也可以使用||运行算符进行替换)并且第一对组合之后只有一个分号。
直到最近,MySQL依据PHP的数据库查询返回不安全的和无提示意义的错误信息。die()是经常使用的一个方法来控制当用操作失败时用户可以看到的信息。现在根本就没有返回任何的错误信息,die也许是更为必须的,除非我们将用户丢在那里迷惑发生了什么。
其他的内建的错误检查方法是错误信息。这些在开发以及高度的过程中是相当有用的,而且他们也很容易的在最后的产品发布时的最终版本中注释掉。正发我们所提
到的,MySQL的错误信息在默认的情况下不再是显而易见的了。如果我们希望看到他们,我们不得不使用mysql_errno()(这个函数会为每一个错
误类型的返回一个代码号)或是mysql_error()(这个函数会返回文本信息)来进行请求。然后我们可以使用error_log()函数将他们写入
到自定义的错误日志中。
如下面的例子:
if (!mysql_select_db($bad_db)) {
print(mysql_error());
}
然而除了die还有许多其他的数据库错误处理。服务器不可用,数据集错误等各种情况。我们已经相当自由的设置了连接然后进行查询,但是较为理想的情况是第
一次与数据库的交互都应与一个条件相嵌套,这个条件可以在成功的时候返回希望的结果集,而在失败的时候返回一个清楚的错误清理界面。这也正是die()的
用武之地。整个脚本的执行立即中断,然后离开,如果没有其他的内容,如果他们已经在我们的PHP中进行了定义,就会关闭我们的HTML标记。另外,也许会
有许多更好的脚本或是HTML来继续我我们的页面,其中的代码是不会受断开的数据连接或是失败的查询的影响。最近die并不会记让我们知道哪里发生了错
误。我们会认为我们有用户会告诉我们吗?不可能。而更为现实的他们失望地离开我们的网站然后永远不会回来。下面演示的是一个好的错误处理的例子:
function printError($errorMesg) {
printf(“%s
\n”, $errorMesg);
}
function notify($errorMesg) {
mail([email protected], “An Error has occurred at
example.com”, $errorMesg)
}
if ($link = mysql_connect(“host”, “user”, “pass”) {
// Things to do if the connection is successful
} else {
printError(“Sorry for the inconvenience; but we are unable
to process your request at this time. Please check back
later”);
notify(“Problem connecting to database in $SCRIPT_NAME at
line 12 on date(‘Y-m-D’)”);
}
更好的办法是如果我们熟悉PHP5新的OOP特征,我们可以试着使用异常处理。
使用PHP创建MySQL数据
如果我们愿意,我们可以使用PHP来创建我们的MySQL数据库而不是使用MySQL客户端工具。这个想法有着潜在的优点,对于那些认为MySQL命令难于使用的用户我们可以使用一个吸引人的前端,而这样做的最大的缺点就是安全问题。
要使用PHP来创建数据,我们的脚本的用户应在MySQL上有着完全的CREATE/DROP权限。这也就意味着控制了这个脚本的任何人也许都会将我们的
数据库清空。这从安全的角度来说这并不是一个好主意。而且,大多数的外部站点并不会允许我们在他们的服务器上作任何事情。
如果我们仍是希望使用PHP来创建我们的MySQL数据库,那我们就只能自己帮助我们自已了,至少我们不要在一个文本文件里存放我们的用户名与密码。每一
次我们要处理插入或是使用这个脚本时我们要保证我们要在一个表单中输入的我们的用户名与密码然后传递给变量。这是一个将变量保存在我们Web树之外的由
include包含的文件中也并不足够的例子。
相关的函数如下:
mysql_create_db():在一个主机上创建数据库,数据库名字作为参数传递
mysql_drop_db():删除指定的数据库
mysql_query():传递表定义
如下面的一个例子:
相关阅读 更多 +