欢迎来到天天文库
浏览记录
ID:9492435
大小:63.00 KB
页数:9页
时间:2018-05-01
《mysql入门系列:需要避免的mysql客户机程序设计错误--》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Mysql入门系列:需要避免的MYSQL客户机程序设计错误>> 6.8其他主题 本节包括几个主题,这些主题不完全适合于本章从client1到client5的开发中的任一小节的内容: ■在使用结果集元数据帮助验证这些数据适合于计算之后,使用结果集数据计算结果。 ■如何处理很难插入到查询中的数据。 ■如何处理图形数据。 ■如何获得表结构的信息。 ■常见的MySQL程序设计错误及如何避免。 6.8.1在结果集上执行计算 迄今为止,我们集中而主要地使用了结果集元数据来打印行数据,但很明显,除打印之外,还有需要使用数据做其他事情的时候。例如,计算基于数据值的统计信息,应用元数据确
2、保数据适合它们要满足的需求。哪种类型的需求?对于启动程序来说,可能要校验一下正 要执行数字计算的列实际上是否包含着数字! 下面的列表显示了一个简单函数summary_stats(),它获取结果集和列索引,并产生列值的汇总统计。该函数还列出缺少数值的数量,它是通过检查NULL来检测的。这些计算包括两个数据所必须满足的需求,summary_stats()用结果集元数据来校验: ■指定的列必须存在(也就是说,列索引必须在结果集列值的范围内)。 ■此列必须包括数字值。 如果这些条件不满足,则summary_stats()只打印出错误消息并返回。代码如下: 请注意在mysq
3、l_fetch_roysql_data_seek()。为获得同样的结果集,它允许多次调用summary_stats()(假设要计算几列的统计值的话)。每次调用summary_stats()都要重新回到到结果集的开始(这里假设mysql_store_result()创建结果集,如果用mysql_use_result()创建结果集就只能按顺序处理行,而且只能处理一次)。summary_stats()是个相对简单的函数,但它给我们一个提示,就是如何编写一个比较复杂的计算程序,如两个列的最小二乘回归或者标准统计,如t-检验。 6.8.2对查询中有疑问的数据进行编码 包括引号、空值和反斜线的数
4、据值,如果把它们插入到查询中,在执行查询时就会产生一些问题。下面的讨论论述了这些难点,并介绍了解决的办法。假设要建造一个SELECT查询,它基于由name指向的空终结串的内容: 如果name的值类似于0Malley,Brian,这时进行的查询就是非法的,因为引号在引用的字符串里出现: 需要特别注意这个引号,以便使服务器不将它解释为name的结尾。一种方法是在字符串内使用双引号,这就是ANSISQL约定。SQL支持这个约定,也允许引号在反斜线后使用: 另一个有问题之处是查询中任意二进制数据的使用,例如,在把图形存储到数据库这样的应用程序中会发生这种情况。因为二进制数值含有
5、一些字符,把它放到查询中是不安全的。为了解决这个问题,可使用mysql_escape_string(),它可以对特殊字符进行编码,使其在引用的字符串中可以使用。mysql_escape_string()认为的特殊字符是指空字符、单引号、双引号、反斜线、换行符、回车符和Control-Z(最后一个在dash;可能因为预先执行了确认检查就不必编码了。例如,如果处理号码的字符串,它完全由数字和短线组成,那么就不必调用mysql_escape_string()了,否则还是要调用。 mysql_escape_string()对有问题的字符进行编码是将它们转换为以反斜线开头的2个字符的序列。例如,
6、空字符转换为0,这里的0是可打印的ASCII码0,而不是空。反斜线、单引号和双引号分别转换为、和。调用mysql_escape_string()的过程如下: mysql_escape_string()对from_str进行编码,并把结果写入to_str中,还添加了空终结值,这样很方便,因为可以利用像strcpy()和strlen()这样的函数使用该结果串。from_str指向包括将要编码的字符串的char缓冲区,这个字符串可能包含任何内容,其中包括二进制数据。to_str指向一个存在的char缓冲区,在这个缓冲区里,可以写入编码的字符串;不要传递未初始化的指123下一页>>>>这篇
7、文章来自..,。针或NULL指针,希望由mysql_escape_string()分配空间。由to_str指向的缓冲区的长度至少是(from_len*2)+1个字节(很可能from_str中的每个字符都需要用2个字符来编码;额外的字节是空终结值)。 from_len和to_len都是unsignedint值,from_len表示from_str中数据的长度;提供这个长度是非常必要的,因为from_str可能包含空值字节,不能把它当
此文档下载收益归作者所有