<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >数据库问题</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="FAQ:常见问题" HREF="faq.html"><LINK REL="PREVIOUS" TITLE="获取 PHP" HREF="faq.obtaining.html"><LINK REL="NEXT" TITLE="安装常见问题" HREF="faq.installation.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="faq.obtaining.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="faq.installation.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="faq.databases" >章 52. 数据库问题</A ></H1 ><P > 本节包括 PHP 和数据库之间关系的常见问题。是的,PHP 事实上可以访问如今现有的任何数据库。 </P ><DIV CLASS="qandaset" ><DL ><DT >1. <A HREF="faq.databases.html#faq.databases.mssql" > 听说 PHP 有可能访问 Microsoft SQL Server,怎样访问? </A ></DT ><DT >2. <A HREF="faq.databases.html#faq.databases.access" >能访问 Microsoft Access 数据库吗?</A ></DT ><DT >3. <A HREF="faq.databases.html#faq.databases.upgraded" > 我升级到了 PHP 4,结果 MySQL 不断报告“Warning: MySQL: Unable to save result set in ..”,这是怎么回事? </A ></DT ><DT >4. <A HREF="faq.databases.html#faq.databases.mysql.php5" > PHP 5 不再绑定 MySQL 客户端库,这对我意味着什么?我还能在 PHP 中使用 MySQL 吗?我试着使用 MySQL 结果得到“function undefined”错误,怎么办? </A ></DT ><DT >5. <A HREF="faq.databases.html#faq.databases.shared-mysql" > 在安装共享 MySQL 支持之后,只要一加载 libphp4.so,Apache就会 core dump。这个问题能解决吗? </A ></DT ><DT >6. <A HREF="faq.databases.html#faq.databases.mysqlresource" > 为什么我得到类似如下的错误:“Warning: 0 is not a MySQL result index in <file> on line <x>”或者“Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>”? </A ></DT ></DL ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.databases.mssql" ></A ><B >1. </B > 听说 PHP 有可能访问 Microsoft SQL Server,怎样访问? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 在 Windows 机器中,可以简单地使用内置的 ODBC 支持和正确的 ODBC 驱动程序。 </P ><P > 在 Unix 机器中,可以用 Sybase-CT 驱动程序来访问 Microsoft SQL Server,因为它们的协议是(至少大部分)兼容的。Sybase 做了一个 <A HREF="http://www.php.net/extra/ctlib-linux-elf.tar.gz" TARGET="_top" >Linux 系统下所需库的免费版本</A >。对于其它 Unix 操作系统,需要和 Sybase 联系来得到正确的库。同样也看看下一个问题的回答。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.databases.access" ></A ><B >2. </B >能访问 Microsoft Access 数据库吗?</P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 可以。如果完全在 Windows 9x/Me/NT/2000 下运行,那已经有了所有所需的工具,可以用 ODBC 和 Microsoft's ODBC drivers for Microsoft Access database。 </P ><P > 如果在 Unix 下运行 PHP 而想访问 Windows 中的 MS Access,那需要 Unix ODBC 驱动程序。<A HREF="http://www.openlinksw.com/" TARGET="_top" >OpenLink Software</A > 有一个基于 Unix 的 ODBC 驱动程序可以做这件事。 </P ><P > 另外一个替代方案是用带 Windows ODBC 驱动的 SQL Server 并用它来储存数据,可以通过 Microsoft Access(用 ODBC)和 PHP(用内置驱动)来访问,或者用一个 Access 和 PHP 都识别的中间文件格式,例如 flat 文件或者 dBase 数据库。关于这一点 OpenLink Software 的 Tim Hayes 写道: <A NAME="AEN288074" ></A ><BLOCKQUOTE CLASS="BLOCKQUOTE" ><P > 当可以通过 ODBC 直接从 PHP 访问数据库时――例如用 OpenLink 的驱动程序,使用其它数据库做中间媒介不是一个好主意。如果确实需要一个中间文件格式,OpenLink 已经发布了对应于 Windows NT,Linux 和其它 Unix 平台的 Virtuoso(一个虚拟数据库引擎)。请访问我们的<A HREF="http://www.openlinksw.com/" TARGET="_top" >网站</A >来免费下载。 </P ></BLOCKQUOTE > </P ><P > 还有一个已被证实有效的选择是在 Windows 下用 MySQL 和它的 MyODBC 驱动来同步数据库。Steve Lawrence 写道: </P ><P > <P ></P ><UL ><LI ><P > 根据 MySQL 的说明在你的平台上安装 MySQL。可以从 <A HREF="http://www.mysql.com/" TARGET="_top" >http://www.mysql.com/</A > 得到最新版。除了设定数据库和配置用户帐号以外不需要特殊的配置,应该在 host 字段中放一个 % 或者要用来访问 MySQL 的 Windows 机器名。记下自己的服务器名,用户名和密码。 </P ></LI ><LI ><P > 从 MySQL 网站下载 MyODBC for Windows 驱动程序。在你的 Windows 机器中安装它。可以用此程序中包括的工具来测试其操作。 </P ></LI ><LI ><P > 用控制面板中的 ODBC 管理器新建一个用户或系统 dsn,设定 dsn 名称,输入你在第一步中配置的 MySQL 数据库的主机名,用户名,密码,端口等。 </P ></LI ><LI ><P > 完整安装 Access,这样可以确保得到适当的插件 ... 至少需要 ODBC 支持和连接表管理器。 </P ></LI ><LI ><P > 新建一个 Access 数据库。在 Table 窗口点击右键并选择 Link Tables,或者在 File 菜单下选择 Get External Data -> Link Tables。当文件浏览窗口打开后,选择文件类型为:ODBC。接着选择 System dsn 以及在第三步建立的 dsn 的名字。再选择要连接的表,点击 OK。现在你可以在你的 MySQL 服务器中打开表并新建/删除/编辑数据了!也可以构造查询,导入/导出表到 MySQL,构造表单和报告等。 </P ></LI ></UL > </P ><P > 提示与技巧: <P ></P ><UL ><LI ><P > 可以在 Access 中构造表并导出到 MySQL 中,再把它们连接回来。这样可以使表的建立更快。 </P ></LI ><LI ><P > 在 Access 中建立表时,必需定义一个基本键名来取得表的写权限。确认在把表连接到 Access 之前在 MySQL 中建立了基本键名。 </P ></LI ><LI ><P > 如果在 MySQL 中修改了表,必须重新连接到 Access。打开 Tools>Add-ins>Linked table manager,找到你的 ODBC DSN,然后在这里选择要重新连接的表。也可以在这里移动 dsn 源,在点击 OK 之前选中 always prompt for new location。 </P ></LI ></UL > </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.databases.upgraded" ></A ><B >3. </B > 我升级到了 PHP 4,结果 MySQL 不断报告“Warning: MySQL: Unable to save result set in ..”,这是怎么回事? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 看上去最有可能的是,PHP 4 在编译时使用了 <CODE CLASS="option" >--with-mysql</CODE > 选项但没有指定 MySQL 的路径。这意味着 PHP 使用了它自己内置的 MySQL 客户端库。如果你的系统运行了使用其它版本的 MySQL 客户端库的应用程序,例如作为 Apache 模块的 PHP 3,那么在两个不同版本的客户端之间有冲突。 </P ><P > 重新编译 PHP 4,并在标记中加上 MySQL 的路径“<A HREF="ref.mysql.html#mysql.configure" >--with-mysql=/your/path/to/mysql</A >”通常会解决此问题。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.databases.mysql.php5" ></A ><B >4. </B > PHP 5 不再绑定 MySQL 客户端库,这对我意味着什么?我还能在 PHP 中使用 MySQL 吗?我试着使用 MySQL 结果得到“function undefined”错误,怎么办? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 是的。PHP 总是支持 MySQL 的,不是这种方法就是那种方法。在 PHP 5 中唯一的改变就是不再绑定客户端库本身了。部分原因是(无特定顺序): </P ><P ></P ><UL ><LI ><P > 现今大多数系统已经安装了客户端库了。 </P ></LI ><LI ><P > 由于以上原因,保持多个版本的库文件会导致混乱。例如,如果把 mod_auth_mysql 连接到某个版本,但把 PHP 连接到了另一个版本,然后在 Apache 中同时激活了它们,会得到无数错误。此外,绑定的库文件也不总是能和服务器端的版本很好地配合。对此最明显的症状是上哪里去找 UNIX 域套接字文件 mysql.socket。 </P ></LI ><LI ><P > 维护有些松懈,并且已经越来越落后于发行的版本了。 </P ></LI ><LI ><P > 未来的库版本是基于 GPL 的,因此我们没有升级的途径了,因为我们不能将基于 GPL 的库和 BSD/Apache 风格许可证的项目绑定到一起。因此具有一个干净的 PHP 5 是最好的选择。 </P ></LI ></UL ><P > 事实上这并不会影响到太多人。UNIX 用户,起码是那些知道自己在做什么的人,往往会在编译 PHP 时通过 <CODE CLASS="option" >--with-mysql=/usr</CODE > 将其绑定到自己系统中的 libmyqlclient 库上。Windows 用户可以在 <TT CLASS="filename" >php.ini</TT > 中激活 <TT CLASS="filename" >php_mysql.dll</TT > 扩展库。更多细节见 <A HREF="ref.mysql.html" >MySQL 函数</A >中的安装指南。此外,确认 <TT CLASS="filename" >libmysql.dll</TT > 在系统路径中。具体怎样做的详情,请阅读 FAQ 中的<A HREF="faq.installation.html#faq.installation.addtopath" >设定 Windows 系统路径</A >。因为 <TT CLASS="filename" >libmysql.dll</TT >(以及很多其它 PHP 有关文件)存放于 PHP 目录中,可能需要将 PHP 目录加入到系统路径中。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.databases.shared-mysql" ></A ><B >5. </B > 在安装共享 MySQL 支持之后,只要一加载 libphp4.so,Apache就会 core dump。这个问题能解决吗? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 如果你的 MySQL 库依靠 pthreads 连接就会这样。检查是否使用了 ldd。如果有的话,下载 MySQL 源程序编译,或者从源 rpm 的 spec 文件中去掉打开 threaded client 的选项然后重新编译。以上任一建议会解决此问题。然后再加上新的 MySQL 库重新编译 PHP。 </P ></DIV ></DIV ><DIV CLASS="qandaentry" ><B ><DIV CLASS="question" ><P ><A NAME="faq.databases.mysqlresource" ></A ><B >6. </B > 为什么我得到类似如下的错误:“Warning: 0 is not a MySQL result index in <file> on line <x>”或者“Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>”? </P ></DIV ></B ><DIV CLASS="answer" ><P ><B > </B > 你试图用一个值为 0 的结果资源号。0 表示你的查询由于某原因失败了,需要在提交查询之后和在使用返回结果资源号之前检查错误。正确的方法是用类似如下的代码: <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /><br />$result </font><font color="#007700">= </font><font color="#0000BB">mysql_query</font><font color="#007700">(</font><font color="#DD0000">"SELECT * FROM tables_priv"</font><font color="#007700">);<br />if (!</font><font color="#0000BB">$result</font><font color="#007700">) {<br /> echo </font><font color="#0000BB">mysql_error</font><font color="#007700">();<br /> exit;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > 或者 <TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /><br />$result </font><font color="#007700">= </font><font color="#0000BB">mysql_query</font><font color="#007700">(</font><font color="#DD0000">"SELECT * FROM tables_priv"</font><font color="#007700">)<br /> or die(</font><font color="#DD0000">"Bad query: " </font><font color="#007700">. </font><font color="#0000BB">mysql_error</font><font color="#007700">());<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE > </P ></DIV ></DIV ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="faq.obtaining.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="faq.installation.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >获取 PHP</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="faq.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >安装常见问题</TD ></TR ></TABLE ></DIV ></BODY ></HTML >