最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP PDOStatement:bindParam插入數(shù)據(jù)錯誤問題分析

 更新時間:2013年11月13日 11:34:58   作者:  
PHP PDOStatement:bindParam插入數(shù)據(jù)錯誤問題分析,開發(fā)中一定要注意
廢話不多說, 直接看代碼:
復(fù)制代碼 代碼如下:

<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', "test");

$query = <<<QUERY
  INSERT INTO `user` (`username`, `password`) VALUES (:username, :password);
QUERY;
$statement = $dbh->prepare($query);

$bind_params = array(':username' => "laruence", ':password' => "weibo");
foreach( $bind_params as $key => $value ){
    $statement->bindParam($key, $value);
}
$statement->execute();

請問, 最終執(zhí)行的SQL語句是什么, 上面的代碼是否有什么問題?
Okey, 我想大部分同學(xué)會認(rèn)為, 最終執(zhí)行的SQL是:
INSERT INTO `user` (`username`, `password`) VALUES ("laruence", "weibo");
但是, 可惜的是, 你錯了, 最終執(zhí)行的SQL是:
INSERT INTO `user` (`username`, `password`) VALUES ("weibo", "weibo");
是不是很大的一個坑呢?
這個問題, 來自今天的一個Bug報告: #63281
究其原因, 也就是bindParam和bindValue的不同之處, bindParam要求第二個參數(shù)是一個引用變量(reference).
讓我們把上面的代碼的foreach拆開, 也就是這個foreach:
復(fù)制代碼 代碼如下:

<?php
foreach( $bind_params as $key => $value ){
    $statement->bindParam($key, $value);
}

相當(dāng)于:
復(fù)制代碼 代碼如下:

<?php
//第一次循環(huán)
$value = $bind_params[":username"];
$statement->bindParam(":username", &$value); //此時, :username是對$value變量的引用

//第二次循環(huán)
$value = $bind_params[":password"]; //oops! $value被覆蓋成了:password的值
$statement->bindParam(":password", &$value);

所以, 在使用bindParam的時候, 尤其要注意和foreach聯(lián)合使用的這個陷阱. 那么正確的作法呢?
1. 不要使用foreach, 而是手動賦值
復(fù)制代碼 代碼如下:

<?php
$statement->bindParam(":username", $bind_params[":username"]); //$value是引用變量了
$statement->bindParam(":password", $bind_params[":password"]);

2. 使用bindValue代替bindParam, 或者直接在execute中傳遞整個參數(shù)數(shù)組.
3. 使用foreach和reference(不推薦)
復(fù)制代碼 代碼如下:

<?php
foreach( $bind_params as $key => &$value ) { //注意這里
    $statement->bindParam($key, $value);
}

最后, 展開了說, 對于要求參數(shù)是引用, 并且有滯后處理的函數(shù), 都要在使用foreach的時候, 謹(jǐn)慎!

相關(guān)文章

  • 使用cookie實現(xiàn)統(tǒng)計訪問者登陸次數(shù)

    使用cookie實現(xiàn)統(tǒng)計訪問者登陸次數(shù)

    本篇文章是對使用cookie實現(xiàn)統(tǒng)計訪問者登陸次數(shù)的代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP生成短網(wǎng)址方法匯總

    PHP生成短網(wǎng)址方法匯總

    本文給大家匯總介紹了3種使用php生成短網(wǎng)址的方法,第一種是PHP+MySQl實現(xiàn)短網(wǎng)址的生成和讀取,第二種是php+ini方式,第三種跟第一種有些類似,各有利弊,小伙伴們可以根據(jù)自己的項目需求來選擇。
    2016-07-07
  • JavaScript實現(xiàn)滾動欄效果的方法

    JavaScript實現(xiàn)滾動欄效果的方法

    這篇文章主要介紹了JavaScript實現(xiàn)滾動欄效果的方法,涉及javascript操作html元素實現(xiàn)滾動的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • Zend Framework上傳文件重命名的實現(xiàn)方法

    Zend Framework上傳文件重命名的實現(xiàn)方法

    這篇文章主要介紹了Zend Framework上傳文件重命名的實現(xiàn)方法,結(jié)合實例形式分析了Zend Framework上傳文件重命名的具體操作步驟與配置、檢測、重命名操作的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2016-11-11
  • 簡單介紹PHP的責(zé)任鏈編程模式

    簡單介紹PHP的責(zé)任鏈編程模式

    這篇文章主要介紹了PHP的責(zé)任鏈編程模式,也是開發(fā)團(tuán)隊廣泛采用的一種編程方式約定,需要的朋友可以參考下
    2015-08-08
  • php中關(guān)于長度計算容易混淆的問題分析

    php中關(guān)于長度計算容易混淆的問題分析

    這篇文章主要介紹了php中關(guān)于長度計算容易混淆的問題,簡單分析了php關(guān)于數(shù)組及字符串長度運算的相關(guān)注意事項,需要的朋友可以參考下
    2016-05-05
  • PHP常用字符串操作函數(shù)實例總結(jié)(trim、nl2br、addcslashes、uudecode、md5等)

    PHP常用字符串操作函數(shù)實例總結(jié)(trim、nl2br、addcslashes、uudecode、md5等)

    這篇文章主要介紹了PHP常用字符串操作函數(shù),結(jié)合實例形式總結(jié)分析了PHP針對字符串操作的常用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-01-01
  • php實現(xiàn)圖片按比例截取的方法

    php實現(xiàn)圖片按比例截取的方法

    這篇文章主要介紹了php實現(xiàn)圖片按比例截取的方法,涉及php針對圖形的讀取、運算及生成相關(guān)操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • php實現(xiàn)點擊可刷新驗證碼

    php實現(xiàn)點擊可刷新驗證碼

    這篇文章主要介紹了php如何實現(xiàn)點擊即可刷新驗證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-11-11
  • php foreach、while性能比較

    php foreach、while性能比較

    foreach是對數(shù)組副本進(jìn)行操作(通過拷貝數(shù)組),而while則通過移動數(shù)組內(nèi)部指標(biāo)進(jìn)行操作,一般邏輯下認(rèn)為,while應(yīng)該比foreach快.
    2009-10-10

最新評論

长春市| 荆州市| 桐庐县| 方城县| 奈曼旗| 盐津县| 临夏县| 济南市| 正蓝旗| 萍乡市| 肃北| 梧州市| 定兴县| 光泽县| 新蔡县| 内乡县| 平利县| 栾川县| 泉州市| 佛教| 东兰县| 揭西县| 德化县| 肃北| 秭归县| 汾阳市| 浦县| 岫岩| 四会市| 大英县| 娱乐| 万安县| 奉贤区| 郑州市| 淮安市| 吴川市| 株洲市| 秭归县| 合肥市| 扬州市| 申扎县|