需要避免的MYSQL客户机程序设计错误

2016-02-19 20:41 5 1 收藏

只要你有一台电脑或者手机,都能关注图老师为大家精心推荐的需要避免的MYSQL客户机程序设计错误,手机电脑控们准备好了吗?一起看过来吧!

【 tulaoshi.com - 编程语言 】

  本文讨论一些常见的MySQLC API 程序设计错误,以及如何避免其发生(这些问题在MySQL邮件清单中会周期性地突然出现)。

  1. 错误1——使用未初始化的连接处理程序指针

  我们已经通过传递NULL 参数调用了mysql_ i n i t ( ),这就是让它分配并且初始化MYSQL 结构,然后返回一个指针。另外一种方法是将指针传递到一个已有的MYSQL 结构中。在这种情况下, mysql_init() 会将结构初始化并返回一个指针,而不必自己分配结构。如果要使用第二种方法,则要小心会出现一些微妙的问题。下面的讨论指出了需要注意的一些问题。如果将一个指针传递给mysql_ init( ),它应该实际指向某些东西。看下面的代码段:

  这个问题是,mysql_init() 得到了一个指针,但指针没有指向所知的任何地方。conn 是一个局部变量,因此在main() 开始执行时它是一个能指向任何地方的未初始化的存储器,这就是说mysql_init() 将使用指针,并可在内存的一些任意区域滥写。如果幸运的话, conn 将指向您的程序地址空间的外部,这样,系统将立即终止,使您能尽早意识到代码中出现的问题。

  如果不幸的话, conn 将指向程序中以后才使用的一些数据的内部,直到再次使用那个数据时才发现问题。因此实际出现问题的地方远比执行程序时出现的问题多,也更难捕捉到。下面是一段有问题的代码:

  此时, conn 是一个全局变量,因此在程序启动前,将它初始化为0(就是NULL)。mysql_init() 遇到NULL 参数,因此初始化并分配一个新的连接处理程序。只要将conn 传递给需要非NULL 连接处理程序的MySQLCAPI 函数,系统就会崩溃。这些代码段的修改就是确保conn 有一个可知的值。例如,可以将它初始化到已经分配的MYSQL 结构地址中去:

  然而,推荐的(较容易的!)解决方案仅仅是将NULL 显式地传递给mysql_ init( ),让该函数分配MYSQL 结构,并将返回值赋值给conn:

  无论如何不要忘记检验mysql_init() 的返回值,以确保它不是NULL。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  2. 错误2——有效结果集检验的失败

  请记住检查希望得到的结果集的调用状态。下面的代码没有做到这一点:

  不幸地是,如果mysql_store_result() 失败,res_set 为NULL,while 循环也不执行了,应测试返回结果集函数的返回值,以确保实际上在进行工作。

  3. 错误3—— NULL 列值引起的失败

  不要忘记检查mysql_fetch_row() 返回的数组MYSQL_ROW 中列值是否为NULL 指针。如果row[i] 为NULL,则在一些机器上,下面的代码就会引起崩溃:

  该错误危害最大的部分是,有些printf() 的版本很宽容地对NULL指针输出了“( null )”,这就使错误很容易逃脱而没有把错误定位。如果把程序给了朋友,而他只有不太宽容printf( )版本,程序就会崩溃,您的朋友会认为您是个无用的程序员。循环应该写成下面这样:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  不需要检查列值是否为NULL 的惟一一次是当已经从列信息结构确定IS _ NOT _ NULL( )为真时。

  4. 错误4——传递无意义的结果缓冲区

  需要您提供缓冲区的客户机库函数通常要使这些缓冲区真正存在,下面的代码违反了这个规则:

  问题是什么呢?to_str 必须指向一个存在的缓冲区,而在这个样例中没有,因此,它指向了随意的位置。不要向mysql_escape_string 传递无意义的指针作为to_str 参数,否则它会恣意践踏内存。

来源:http://www.tulaoshi.com/n/20160219/1624269.html

延伸阅读
2.2.1 安装步骤 (1)出现如图2.19所示的界面。 (2)出现如图2.20所示的界面。 (3)出现同服务器安装类似的界面。 (4)在安装进程进行到99%和100%时出现同服务器安装类似的界面。 (5)出现如图2.21所示的Oracle Net Configuration Assistant(Oracle网络配置助手)的界面。 (6)出现如图2.22所示...
在本书的这部分中,我们将讨论编写自己的访问MySQL数据库的程序所需要知道的内容。MySQL有一组实用程序。例如, mysqldump 导出表的上下文和结构定义, mysqlimport将数据文件加载到表中, mysqladmin 实现管理w操作, mysql可以使用户与服务器交互来执行任意的查询。每个标准的MySQL实用程序都倾向于小巧,重点放在程序可完成特定的、有...
可用性设计 任何应用程序的可用性基本上由用户决定。界面设计是需多次反复的过程;在为应用程序设计界面时,第一步就设计出非常完美的界面的情况非常少见。用户参与设计过程越早,花的气力越少,创建的界面越好、越可用。 什么是好的界面 设计用户界面时,开始时最好是先看看Microsoft或其他公司的一些卖得很好的应用程...
一、 服 务 器 程 序 创 建 一 个 名 为“server" 的 项 目, 单 文 档 界 面。 在serverview.h 中 加 入 代 码:            #include “winsock.h"       添 加 变 量:          ...
2.3.1 服务器如何连接客户机 (1)出现如图2.34所示的界面。 (2)出现如图2.35所示的界面。 (3)出现如图2.36所示的界面。 (4)出现如图2.37所示的界面。 (5)出现如图2.38所示的界面。 (6)出现如图2.39所示的界面。 2.3.2 客户机怎样连接服务器 管理客户机的工作原理如图2.40所示。...

经验教程

832

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部