电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤

瀏覽:40日期:2023-11-30 18:06:29
; ; 6.8 其他主題 ; 本節(jié)包括幾個主題,這些主題不完全適合于本章從client1到client5 的開發(fā)中的任一小節(jié)的內(nèi)容: ; ■ 在使用結(jié)果集元數(shù)據(jù)幫助驗證這些數(shù)據(jù)適合于計算之后,使用結(jié)果集數(shù)據(jù)計算結(jié)果。 ; ■ 如何處理很難插入到查詢中的數(shù)據(jù)。 ; ■ 如何處理圖形數(shù)據(jù)。 ; ■ 如何獲得表結(jié)構(gòu)的信息。 ; ■ 常見的MySQL程序設(shè)計錯誤及如何避免。 ; 6.8.1在結(jié)果集上執(zhí)行計算 ; 迄今為止,我們集中而主要地使用了結(jié)果集元數(shù)據(jù)來打印行數(shù)據(jù),但很明顯,除打印之外,還有需要使用數(shù)據(jù)做其他事情的時候。例如,計算基于數(shù)據(jù)值的統(tǒng)計信息,應(yīng)用元數(shù)據(jù)確保數(shù)據(jù)適合它們要滿足的需求。哪種類型的需求?對于啟動程序來說,可能要校驗一下正要執(zhí)行數(shù)字計算的列實際上是否包含著數(shù)字! ; 下面的列表顯示了一個簡單函數(shù)summary _ stats ( ) ,它獲取結(jié)果集和列索引,并產(chǎn)生列值的匯總統(tǒng)計。該函數(shù)還列出缺少數(shù)值的數(shù)量,它是通過檢查NULL 來檢測的。這些計算包括兩個數(shù)據(jù)所必須滿足的需求, summary_stats() 用結(jié)果集元數(shù)據(jù)來校驗: ; ■ 指定的列必須存在(也就是說,列索引必須在結(jié)果集列值的范圍內(nèi))。 ; ■ 此列必須包括數(shù)字值。 ; 如果這些條件不滿足,則summary_stats() 只打印出錯誤消息并返回。代碼如下:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 請注意在mysql_fetch_row() 循環(huán)前面調(diào)用的mysql_ data _ seek( )。為獲得同樣的結(jié)果集,它允許多次調(diào)用summary _ stats()(假設(shè)要計算幾列的統(tǒng)計值的話)。每次調(diào)用summary _ stats( )都要“重新回到”到結(jié)果集的開始(這里假設(shè)mysql_store_result() 創(chuàng)建結(jié)果集,如果用mysql_use_result() 創(chuàng)建結(jié)果集就只能按順序處理行,而且只能處理一次)。summary_stats() 是個相對簡單的函數(shù),但它給我們一個提示,就是如何編寫一個比較復(fù)雜的計算程序,如兩個列的最小二乘回歸或者標(biāo)準(zhǔn)統(tǒng)計,如t -檢驗。 ; 6.8.2 對查詢中有疑問的數(shù)據(jù)進行編碼 ; 包括引號、空值和反斜線的數(shù)據(jù)值,如果把它們插入到查詢中,在執(zhí)行查詢時就會產(chǎn)生一些問題。下面的討論論述了這些難點,并介紹了解決的辦法。假設(shè)要建造一個SELECT 查詢,它基于由name 指向的空終結(jié)串的內(nèi)容:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤  如果name 的值類似于“0’Malley, Brian”,這時進行的查詢就是非法的,因為引號在引用的字符串里出現(xiàn):Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 需要特別注意這個引號,以便使服務(wù)器不將它解釋為name 的結(jié)尾。一種方法是在字符串內(nèi)使用雙引號,這就是ANSI SQL 約定。SQL 支持這個約定,也允許引號在反斜線后使用:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 另一個有問題之處是查詢中任意二進制數(shù)據(jù)的使用,例如,在把圖形存儲到數(shù)據(jù)庫這樣的應(yīng)用程序中會發(fā)生這種情況。因為二進制數(shù)值含有一些字符,把它放到查詢中是不安全的。為了解決這個問題,可使用mysql_ escape _ string( ),它可以對特殊字符進行編碼,使其在引用的字符串中可以使用。mysql_escape_string() 認為的特殊字符是指空字符、單引號、雙引號、反斜線、換行符、回車符和C ontrol - Z(最后一個在Windows 語言環(huán)境中出現(xiàn))。什么時候使用mysql_escape_string() 呢?最保險的回答是“始終”。然而,如果確信數(shù)據(jù)的形式并且知道它是正確的—可能因為預(yù)先執(zhí)行了確認檢查—就不必編碼了。例如,如果處理電話號碼的字符串,它完全由數(shù)字和短線組成,那么就不必調(diào)用mysql_ escape _ string( )了,否則還是要調(diào)用。 ; mysql_escape_string() 對有問題的字符進行編碼是將它們轉(zhuǎn)換為以反斜線開頭的2個字符的序列。例如,空字符轉(zhuǎn)換為‘ 0’,這里的0 是可打印的ASCII 碼0,而不是空。反斜線、單引號和雙引號分別轉(zhuǎn)換為‘ ’、‘’’和‘”’。調(diào)用mysql_escape_string() 的過程如下:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 mysql_escape_string() 對from_str 進行編碼,并把結(jié)果寫入to _ str中,還添加了空終結(jié)值,這樣很方便,因為可以利用像strcpy() 和strlen() 這樣的函數(shù)使用該結(jié)果串。from_str 指向包括將要編碼的字符串的char 緩沖區(qū),這個字符串可能包含任何內(nèi)容,其中包括二進制數(shù)據(jù)。to_str 指向一個存在的char 緩沖區(qū),在這個緩沖區(qū)里,可以寫入編碼的字符串;不要傳遞未初始化的指針或NULL 指針,希望由mysql_escape_string() 分配空間。由to_str 指向的緩沖區(qū)的長度至少是(from_len*2)+1個字節(jié)(很可能from_str 中的每個字符都需要用2 個字符來編碼;額外的字節(jié)是空終結(jié)值)。 ; from_len 和to_len 都是unsigned int 值,from_len 表示from_str 中數(shù)據(jù)的長度;提供這個長度是非常必要的,因為from_str 可能包含空值字節(jié),不能把它當(dāng)作空終結(jié)串。從mysql_escape_string() 返回的to_len 值是作為結(jié)果的編碼字符串的實際長度,沒有對空終結(jié)值進行計數(shù)。 ; 當(dāng)mysql_escape_string() 返回時, to _ str中編碼的結(jié)果就可看作是空終結(jié)串,因為from_str 中的空值都被編碼為‘ 0’。為了重新編寫構(gòu)造SELECT 的代碼,使名稱的值即使包含引號也能工作,我們進行下面的操作:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤6.8.3 圖像數(shù)據(jù)的處理mysql_escape_string() 的基本功能之一就是把圖像數(shù)據(jù)加載到一個表中。本節(jié)介紹如何進行這項工作(這個討論也適用于二進制數(shù)據(jù)的其他形式)。假設(shè)想從文件中讀取圖像,并將它們連同唯一的標(biāo)識符存儲到表中。BLOB 類型對二進制數(shù)據(jù)來講是個很好的選擇,因此可以使用下面的表說明:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 實際上,要想從文件中獲取圖像并放入images 表,利用下面的函數(shù)load_image() 可以實現(xiàn),給出一個標(biāo)識符號碼和一個指向包括這個圖像數(shù)據(jù)的打開文件的指針:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤load_image() 不會分配非常大的查詢緩沖區(qū)( 10 0 K),因此它只能處理相對較小的圖形。 ; 在實際的應(yīng)用程序中,可以根據(jù)圖形文件的大小動態(tài)地分配緩沖區(qū)。處理從數(shù)據(jù)庫中恢復(fù)的圖形數(shù)據(jù)(或任何二進制數(shù)據(jù))并不像開始把它放入時那樣問題重重,因為在變量MYSQL_ROW 中數(shù)據(jù)值的原始形式是有效的,通過調(diào)用mysql_ fetch _length ( ),這個長度也是有效的。必須將值看作是計數(shù)串,而不是空終結(jié)串。 ; 6.8.4 獲取表信息 ; MySQL允許使用下面的查詢獲取有關(guān)表結(jié)構(gòu)的信息(下面兩者是等價的):Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 與SELECT 相類似,兩個語句都返回結(jié)果集。為了在表中找出有關(guān)列,所需做的就是處理結(jié)果集中的行,從中獲取有用的信息。例如,如果從mysql客戶機上發(fā)布DESCRIBE images 語句,就會返回這樣的信息:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤  ; 如果從自己的客戶機上執(zhí)行同樣的查詢,可以得到相同的信息(沒有邊框)。如果只想要單個列的信息,則使用如下這個查詢:  ; SHOW FIELDS FROM tbl _ name LIKE “col _ name”  ; 此查詢會返回相同的列,但只是一行(如果列不存在就不返回行)。  ; 6.8.5 需要避免的客戶機程序設(shè)計錯誤  ; 本節(jié)討論一些常見的MySQLC API 程序設(shè)計錯誤,以及如何避免其發(fā)生(這些問題在MySQL郵件清單中會周期性地突然出現(xiàn))。  ; 1. 錯誤1——使用未初始化的連接處理程序指針在本章的樣例中,我們已經(jīng)通過傳遞NULL 參數(shù)調(diào)用了mysql_ i n i t ( ),這就是讓它分配并且初始化MYSQL 結(jié)構(gòu),然后返回一個指針。另外一種方法是將指針傳遞到一個已有的MYSQL 結(jié)構(gòu)中。在這種情況下, mysql_init() 會將結(jié)構(gòu)初始化并返回一個指針,而不必自己分配結(jié)構(gòu)。如果要使用第二種方法,則要小心會出現(xiàn)一些微妙的問題。下面的討論指出了需要注意的一些問題。如果將一個指針傳遞給mysql_ init( ),它應(yīng)該實際指向某些東西。看下面的代碼段:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 這個問題是,mysql_init() 得到了一個指針,但指針沒有指向所知的任何地方。conn 是一個局部變量,因此在main() 開始執(zhí)行時它是一個能指向任何地方的未初始化的存儲器,這就是說mysql_init() 將使用指針,并可在內(nèi)存的一些任意區(qū)域濫寫。如果幸運的話, conn 將指向您的程序地址空間的外部,這樣,系統(tǒng)將立即終止,使您能盡早意識到代碼中出現(xiàn)的問題。 ; 如果不幸的話, conn 將指向程序中以后才使用的一些數(shù)據(jù)的內(nèi)部,直到再次使用那個數(shù)據(jù)時才發(fā)現(xiàn)問題。因此實際出現(xiàn)問題的地方遠比執(zhí)行程序時出現(xiàn)的問題多,也更難捕捉到。下面是一段有問題的代碼:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤  ; 此時, conn 是一個全局變量,因此在程序啟動前,將它初始化為0(就是NULL)。mysql_init() 遇到NULL 參數(shù),因此初始化并分配一個新的連接處理程序。只要將conn 傳遞給需要非NULL 連接處理程序的MySQLCAPI 函數(shù),系統(tǒng)就會崩潰。這些代碼段的修改就是確保conn 有一個可知的值。例如,可以將它初始化到已經(jīng)分配的MYSQL 結(jié)構(gòu)地址中去:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 然而,推薦的(較容易的!)解決方案僅僅是將NULL 顯式地傳遞給mysql_ init( ),讓該函數(shù)分配MYSQL 結(jié)構(gòu),并將返回值賦值給conn:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 無論如何不要忘記檢驗mysql_init() 的返回值,以確保它不是NULL。 ; 2. 錯誤2——有效結(jié)果集檢驗的失敗 ; 請記住檢查希望得到的結(jié)果集的調(diào)用狀態(tài)。下面的代碼沒有做到這一點:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 不幸地是,如果mysql_store_result() 失敗,res_set 為NULL,while 循環(huán)也不執(zhí)行了,應(yīng)測試返回結(jié)果集函數(shù)的返回值,以確保實際上在進行工作。 ; 3. 錯誤3—— NULL 列值引起的失敗 ; 不要忘記檢查mysql_fetch_row() 返回的數(shù)組MYSQL_ROW 中列值是否為NULL 指針。如果row[i] 為NULL,則在一些機器上,下面的代碼就會引起崩潰:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 該錯誤危害最大的部分是,有些printf() 的版本很寬容地對NULL指針輸出了“( null )”,這就使錯誤很容易逃脫而沒有把錯誤定位。如果把程序給了朋友,而他只有不太寬容printf( )版本,程序就會崩潰,您的朋友會認為您是個無用的程序員。循環(huán)應(yīng)該寫成下面這樣:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 不需要檢查列值是否為NULL 的惟一一次是當(dāng)已經(jīng)從列信息結(jié)構(gòu)確定IS _ NOT _ NULL( )為真時。 ; 4. 錯誤4——傳遞無意義的結(jié)果緩沖區(qū) ; 需要您提供緩沖區(qū)的客戶機庫函數(shù)通常要使這些緩沖區(qū)真正存在,下面的代碼違反了這個規(guī)則:Mysql入門系列:需要避免的MYSQL客戶機程序設(shè)計錯誤 問題是什么呢?to_str 必須指向一個存在的緩沖區(qū),而在這個樣例中沒有,因此,它指向了隨意的位置。不要向mysql_escape_string 傳遞無意義的指針作為to_str 參數(shù),否則它會恣意踐踏內(nèi)存。
標(biāo)簽: MySQL 數(shù)據(jù)庫
主站蜘蛛池模板: 汽液过滤网厂家_安平县银锐丝网有限公司| 诸城网站建设-网络推广-网站优化-阿里巴巴托管-诸城恒泰互联 | 洗地机_全自动洗地机_手推式洗地机【上海滢皓环保】 | 冷却塔改造厂家_不锈钢冷却塔_玻璃钢冷却塔改造维修-广东特菱节能空调设备有限公司 | 广州昊至泉水上乐园设备有限公司| 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | 【灵硕展览集团】展台展会设计_展览会展台搭建_展览展示设计一站式服务公司 | 煤矿人员精确定位系统_矿用无线通信系统_煤矿广播系统 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 等离子空气净化器_医用空气消毒机_空气净化消毒机_中央家用新风系统厂家_利安达官网 | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | 杭州ROHS检测仪-XRF测试仪价格-百科| 定硫仪,量热仪,工业分析仪,马弗炉,煤炭化验设备厂家,煤质化验仪器,焦炭化验设备鹤壁大德煤质工业分析仪,氟氯测定仪 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 基业箱_环网柜_配电柜厂家_开关柜厂家_开关断路器-东莞基业电气设备有限公司 | 高博医疗集团上海阿特蒙医院 | 印刷人才网 印刷、包装、造纸,中国80%的印刷企业人才招聘选印刷人才网! | DWS物流设备_扫码称重量方一体机_快递包裹分拣机_广东高臻智能装备有限公司 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 5L旋转蒸发器-20L-50L旋转蒸发器-上海越众仪器设备有限公司 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 吹田功率计-长创耐压测试仪-深圳市新朗普电子科技有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 酶联免疫分析仪-多管旋涡混合仪|混合器-莱普特科学仪器(北京)有限公司 | 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | 别墅图纸超市|别墅设计图纸|农村房屋设计图|农村自建房|别墅设计图纸及效果图大全 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 亮点云建站-网站建设制作平台| 万濠投影仪_瑞士TRIMOS高度仪_尼康投影仪V12BDC|量子仪器 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 建筑资质代办-建筑资质转让找上海国信启航 | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 磁力轮,磁力联轴器,磁齿轮,钕铁硼磁铁-北京磁运达厂家 | 电动葫芦|防爆钢丝绳电动葫芦|手拉葫芦-保定大力起重葫芦有限公司 | 中央空调维修、中央空调保养、螺杆压缩机维修-苏州东菱空调 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 |