`
逆风的香1314
  • 浏览: 1450321 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

本文讨论一些常见的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。

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( )版本,程序就会崩溃,您的朋友会认为您是个无用的程序员。循环应该写成下面这样:

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

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

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

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

 
分享到:
评论

相关推荐

    mysql网络数据库指南(中文版) part1

    6.8.5 需要避免的客户机程序设计错误 189 第7章 Perl DBI API 192 7.1 Perl 脚本的特点 192 7.2 Perl DBI 基础 193 7.2.1 DBI数据类型 193 7.2.2 一个简单的DBI脚本 193 7.2.3 处理错误 196 7.2.4 处理不返回...

    MYSQL网络数据库PDF学习资源

    6.8.5 需要避免的客户机程序设计错误 189 第7章 Perl DBI API 192 7.1 Perl 脚本的特点 192 7.2 Perl DBI 基础 193 7.2.1 DBI数据类型 193 7.2.2 一个简单的DBI脚本 193 7.2.3 处理错误 196 7.2.4 处理不返回结果集...

    生鲜社区配送小程序PHP+mysql

    【生鲜社区配送小程序PHP+MySQL】是一款专门针对生鲜配送服务设计的应用程序,它结合了PHP编程语言和MySQL数据库管理系统,旨在提高生鲜商品的社区配送效率。这款小程序允许后台管理员进行一系列操作,以优化配送...

    MySQL数据库接口的VC实现与应用(1).pdf

    - **客户机/服务器架构**:包含mysqld守护进程和各种客户端工具及库。 - **多平台支持**:可在多种操作系统上运行,包括Windows、Linux等。 - **API接口**:提供C、C++、Java、Perl、Python、PHP和TCL等多种语言...

    ssm+mysql实现的Javaweb酒店管理项目源码.pdf

    根据提供的文件信息,可以提炼出的知识点主要涉及Java Web开发、SSM框架的使用、MySQL数据库的应用以及酒店管理系统的设计与实现。 1. Java Web开发:文件标题和描述中提到的“Javaweb酒店管理项目源码”,表明项目...

    手机号码归属地查询

    在IT行业中,手机号码归属地查询是一项常见的需求,特别是在数据处理、市场营销或客户服务等领域。这个话题涉及到Java编程语言以及如何处理手机号码与地理位置之间的关联。下面将详细解释相关的知识点。 首先,我们...

    网上商城java版概要设计说明书

    运行环境包括客户机和服务器硬件配置,例如PentiumIII处理器、至少64MB内存(客户机)和512MB内存(服务器),以及必要的输入设备(鼠标、键盘)。软件环境要求包括开发工具、Java运行环境和数据库软件。 #### 四、...

    C#做的手机销售系统

    同时,使用try-catch-finally语句块来捕获和处理异常,避免程序因未预期的错误而崩溃。 总的来说,C#编写的手机销售系统是一个综合运用了多种C#技术和软件工程理念的项目。它展示了C#在企业级应用开发中的强大能力...

    数字媒体技术-基于微信小程序平台的点餐小程序.docx

    微信小程序的优势在于其无需下载安装,占用资源少,访问速度快,依托微信庞大的用户基础,能有效吸引流量,为商家带来更多的潜在客户。 在开发过程中,首先需要对炸物点餐小程序的开发背景和相关技术进行详细阐述。...

    E21714067_石月_实验二1

    【实验名称】C/S结构程序设计 【实验目标】本次实验旨在让参与者理解客户机-服务器(Client-Server,简称C/S)架构的工作原理,并掌握使用Java编程语言访问MySQL数据库,以及实现客户机与服务器之间的数据通信。...

    atm.rar_ATM机_atm_linux编写atm_linux编写atm机_银行

    3. **客户/服务器程序**:在ATM机程序中,客户/服务器架构(Client-Server Architecture)通常用于实现客户端(如ATM终端)与服务器端(如银行后台系统)之间的通信。客户端负责用户交互,服务器端则处理交易请求并...

    最新手机号码归属地数据库(sql导入+csv格式化文件)

    4. 错误处理:处理无效或不存在的电话号码,避免程序异常。 5. 安全性:保护敏感数据,遵循隐私政策,确保数据不被非法访问或滥用。 总的来说,"最新手机号码归属地数据库(sql导入+csv格式化文件)"为开发者提供了...

    java GUI应用程序一个简单的C/S模式图书管理系统

    8. **异常处理**:为了确保程序的健壮性,需要对可能出现的错误进行处理。Java的try-catch-finally语句块用于捕获和处理异常,防止程序因未预期的问题而崩溃。 9. **设计模式**:在开发过程中,可能会运用到一些...

    2021-2022计算机二级等级考试试题及答案No.17632.docx

    6. 客户机/服务器结构:在客户机/服务器(C/S)结构中,提出请求的计算机被称为客户端,而响应请求的计算机被称为服务器,题目描述错误。 7. 线程同步的目的:线程同步是为了防止多个线程同时访问同一资源引发错误...

    花卉销售系统

    【花卉销售系统】是一个专为花卉贸易设计的综合性管理软件,它涵盖了从花卉种植、库存管理、销售追踪到客户关系管理等多个环节,旨在提高花卉企业的运营效率和盈利能力。该系统通常包括以下几个核心功能模块: 1. *...

    java设计-基于ssm进销存管理系统.zip

    在实际开发过程中,开发者还需要关注安全性、性能优化、错误处理和日志记录等方面。例如,使用Spring Security进行权限管理,使用缓存技术提高数据读取速度,以及利用单元测试确保代码质量。这个基于SSM的进销存管理...

    易客CRM 安装说明

    - **安装脚本出错**:仔细检查错误日志,查找具体的错误信息并进行修正。 #### 五、总结 易客CRM是一款支持多平台的客户关系管理软件,适用于各种操作系统环境。为了确保软件能够安全稳定地运行,需要按照官方提供...

    PHP实例开发源码—PHP手机归属地查询系统.zip

    1. 错误处理:系统应具备良好的错误处理机制,对可能出现的网络问题、API调用失败等情况进行适当地反馈。 2. 性能优化:为了提高查询速度,可以采用缓存机制,将近期或频繁查询的手机号码及对应归属地信息存储起来...

    精品专题资料(2021-2022年收藏)基于Android的无线点餐系统开题报告.doc

    - 程序设计:详细解释各个功能模块的实现,包括登录、主菜单、点餐、查台、更新、转台和并台等。 **关键知识点** 1. **Android开发**:使用Android SDK创建用户友好的UI界面,实现与服务器的交互。 2. **SQLite...

Global site tag (gtag.js) - Google Analytics