站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        什么是預(yù)處理語句?又該如何使用?

        許多成熟的數(shù)據(jù)庫都支持預(yù)處理語句(Prepared Statements)的概念。它們是什么東西?你可以把它們想成是一種編譯過的要執(zhí)行的SQL語句模板,可以使用不同的變量參數(shù)定制它。預(yù)處理語句具有兩個主要的優(yōu)點:

        查詢只需要被解析(或準(zhǔn)備)一次,但可以使用相同或不同的參數(shù)執(zhí)行多次。當(dāng)查詢準(zhǔn)備好(Prepared)之后,數(shù)據(jù)庫就會分析,編譯并優(yōu)化它要執(zhí)行查詢的計劃。對于復(fù)雜查詢來說,如果你要重復(fù)執(zhí)行許多次有不同參數(shù)的但結(jié)構(gòu)相同的查詢,這個過程會占用大量的時間,使得你的應(yīng)用變慢。通過使用一個預(yù)處理語句你就可以避免重復(fù)分析、編譯、優(yōu)化的環(huán)節(jié)。簡單來說,預(yù)處理語句使用更少的資源,執(zhí)行速度也就更快。

        傳給預(yù)處理語句的參數(shù)不需要使用引號,底層驅(qū)動會為你處理這個。如果你的應(yīng)用獨占地使用預(yù)處理語句,你就可以確信沒有SQL注入會發(fā)生。(然而,如果你仍然在用基于不受信任的輸入來構(gòu)建查詢的其他部分,這仍然是具有風(fēng)險的).

        正因為預(yù)處理語句是如此有用,它成了PDO唯一為不支持此特性的數(shù)據(jù)庫提供的模擬實現(xiàn)。這使你可以使用統(tǒng)一的數(shù)據(jù)訪問規(guī)范而不必關(guān)心數(shù)據(jù)庫本身是否具備此特性。

        /* 使用預(yù)處理語句重復(fù)插入數(shù)據(jù)(1) 此示例演示了一個通過向命名占位符代入一個name和一個value值來執(zhí)行的INSERT查詢 */ 連接數(shù)據(jù)庫:$dbh = new PDO("mysql:host=127.0.0.1;dbname=dbname",'username','123'); 注:如果插入數(shù)據(jù)后出現(xiàn)亂碼的話,注意檢查各個頁面的字符集設(shè)置,尤其是關(guān)于pdo處理的php頁面僅有header頭設(shè)置為utf-8有時也不行,這時就在執(zhí)行SQL語句前設(shè)置數(shù)據(jù)庫的字符集$dbh->query("set names utf8"); $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); //插入一行 $name = 'one'; $value = 1; $stmt->execute();//使用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute();  /* 使用預(yù)處理語句重復(fù)插入數(shù)據(jù)(2) 此示例演示了一個通過向用?表示的占位符代入一個name和一個value值來執(zhí)行的INSERT查詢 */ $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // 插入一行 $name = 'one'; $value = 1; $stmt->execute(); // 使用不同的值插入另一行 $name = 'two'; $value = 2; $stmt->execute();  /* 通過預(yù)處理語句獲取數(shù)據(jù) 此示例演示使用從表單獲取的數(shù)據(jù)為關(guān)鍵值來執(zhí)行查詢獲取數(shù)據(jù)。用戶的輸入會被自動添加引號,所以這兒不存在SQL注入攻擊的危險。 */ $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?");     if ($stmt->execute(array($_GET['name']))) {         while ($row = $stmt->fetch()) {         print_r($row);     } }

        如果數(shù)據(jù)庫驅(qū)動支持,你也可以像綁定輸入?yún)?shù)那樣綁定輸出參數(shù)。輸出參數(shù)常用于存儲過程的返回值。輸出參數(shù)用起來比輸入?yún)?shù)稍微復(fù)雜一些,使用時你必須知道它返回的參數(shù)值有多大。如果它返回的參數(shù)值比你建議的大,就會發(fā)生錯誤。

        //調(diào)用一個帶有輸出參數(shù)的存儲過程 $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); //執(zhí)行存儲過程 $stmt->execute(); print "procedure returned $return_value/n";

        你也可以指定既代表輸入又代表輸出的參數(shù),語法類似于輸出參數(shù)。在下個代碼示例中,“hello”字符串被傳遞到存儲過程中,當(dāng)它返回時,hello就會被存儲過程的返回值取代。

        //調(diào)用一個帶有輸入/輸出參數(shù)的存儲過程 $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 執(zhí)行存儲過程 $stmt->execute(); print "procedure returned $value/n";   //占位符的錯誤使用 $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name LIKE '%?%'"); $stmt->execute(array($_GET['name'])); // 占位符必須用于整個值的位置(下面是正確的用法) $stmt = $dbh->prepare(”SELECT * FROM REGISTRY where name LIKE ?”); $stmt->execute(array(”%$_GET[name]%”));

        若有錯,請指出,若想了解

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 中文精品久久久久人妻不卡| 国产精品成人h片在线| 精品久久久久久| 亚洲精品国产首次亮相| 国产亚洲精品不卡在线| 2018国产精华国产精品| 亚洲精品制服丝袜四区| 久久精品亚洲男人的天堂| 亚洲精品国产成人99久久| 乱码精品一区二区三区| 无码8090精品久久一区| 国产线视频精品免费观看视频| 国产精品久久国产精品99盘| 久久精品九九亚洲精品| 最新精品国偷自产在线| 精品亚洲欧美无人区乱码| 国产国拍亚洲精品福利| 亚洲国产精品欧美日韩一区二区| 久久精品a亚洲国产v高清不卡 | 亚洲精品乱码久久久久久自慰| 精品无码综合一区| 国内精品久久久久久久coent | 999精品视频| 91久久精品91久久性色| 国产综合色在线精品| 无码精品A∨在线观看中文| 亚洲一区无码精品色| 亚洲国产精品综合久久一线| 精品久久久久久无码人妻热| 国产欧美精品一区二区色综合| 国产精品福利片免费看 | 亚洲日韩中文在线精品第一| 麻豆精品三级全部视频| 国产微拍精品一区二区| 精品国产AⅤ一区二区三区4区| 国产精品午夜无码AV天美传媒 | 国产精品美女网站| 国产福利精品视频自拍| 国产精品久久久天天影视香蕉| 国产精品成人无码久久久久久| 国产乱人伦精品一区二区在线观看|