Mysql入门系列:MYSQL客户机程序2—增加错误检查
2006-12-31 10:51:40 来源:WEB开发网这个错误检查的逻辑是,如果失败,则mysql_init() 和mysql_real_connect() 都返回NULL。请注意,尽管这个程序检查mysql_init() 返回的值,但是,如果它失败,却不调用错误报告函数。这是因为当mysql_init() 失败时,不能假设连接处理程序包括任何有意义的信息。
相反,如果mysql_real_connect() 失败了,则连接处理程序并不反映有效的连接,但是的确包括传送给错误报告函数的错误信息(不要将该处理程序传送给任何其他的客户机例程!因为它们一般假设是一个有效连接,所以您的程序可能崩溃)。编译和连接客户机程序2,然后试着运行它:
% client2
如果客户机程序2没有别输出,则连接成功。另一方面,可能会如下所示:
这个输出表示没有创建连接,并说明为什么。或者,它还表示我们的第一个程序,即客户机程序1,没有成功地连接到服务器(毕竟客户机程序1使用同样的连接参数)!而在那时我们不知道,因为客户机程序1没有错误检查。而客户机程序2做检查,所以当出问题时,它可以告知我们。这就是应该始终测试API 函数返回值的原因。
MySQL邮件清单问题经常是与错误检查有关的。典型的问题是“当发送这个查询时,为什么我的程序崩溃了?”或“我的程序怎么没有返回任何东西?”在许多情况下,在查询发布以前,有疑问的程序不检查在发布该查询前是否成功地建立了连接,或者不检查在试着检
索结果前确保服务器成功执行该查询。不要假定每个客户机库都调用成功。
本章下面的例子完成错误检查,而且也应该这样。看起来它好像有更多的工作,但是从长远地运行来看,它的工作实际上是少的,因为您化费了更少的时间来捕获错综复杂的问题。在第7章“Perl DBI API”和第8章“PHP API”中,也使用这种检查错误的方法。
现在,当运行客户机2的程序时,假设看到拒绝访问( Access denied)的消息。如何改正这个问题呢?一种可能是将主机名称、用户名称和口令的#define 行更改为允许访问服务器的值。这是有好处的,在这个意义上,至少应该能做一个连接。但是,这些值是程序中的固定编码。所以笔者建议不要用这种方法,特别是对口令值。当将自己的程序编译为二进制格式时,您可能认为口令隐藏起来了,但是,如果有人在程序上运行strings,则它根本隐藏不住(更不用说明读取访问源文件的人根本不用做一点工作,就可以获取口令)。
在“客户机程序4—运行时获取连接参数”一节中我们将处理访问的问题。首先,笔者
想说明编写连接代码的一些其他方法。
更多精彩
赞助商链接