站長資訊網
        最全最豐富的資訊網站

        什么是預處理語句?又該如何使用?

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

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

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

        正因為預處理語句是如此有用,它成了PDO唯一為不支持此特性的數據庫提供的模擬實現。這使你可以使用統一的數據訪問規范而不必關心數據庫本身是否具備此特性。

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

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

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

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

        //調用一個帶有輸入/輸出參數的存儲過程 $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); // 執行存儲過程 $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)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品一区二区av不卡| 日韩精品中文字幕无码一区| 无码日韩精品一区二区三区免费| 91久久精品国产91性色也| 久久精品中文无码资源站 | 亚洲精品国产字幕久久不卡 | 精品视频一区二区三区在线观看| 亚洲精品国产精品乱码不卡 | 无码精品人妻一区二区三区影院 | 亚洲精品综合一二三区在线 | 日韩一区二区三区精品| 91久久精品国产免费直播| 55夜色66夜色国产精品视频| 四虎国产精品永久免费网址| 免费观看四虎精品成人| 国产精品青草视频免费播放| 欧美亚洲精品在线| 久久99国产精品一区二区| 国产精品丝袜一区二区三区| 日韩人妻精品无码一区二区三区 | 亚洲精品A在线观看| 无码人妻精品一区二区蜜桃AV| 久久精品亚洲乱码伦伦中文| 国产精品免费在线播放| 亚洲精品理论电影在线观看| 久久精品国产精品国产精品污| 91麻豆国产福利精品| 国产精品内射后入合集| 国产在线精品无码二区| 精品无码AV一区二区三区不卡| 无码国内精品久久人妻蜜桃| 亚洲动漫精品无码av天堂| 亚洲日韩精品一区二区三区 | 久久精品国产99国产精品| 久久99亚洲综合精品首页| 精品欧美一区二区在线看片 | 你懂的国产精品| 色综合久久综精品| 56prom精品视频在放免费| 2021国产精品视频网站| 国产精品熟女福利久久AV|