国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

PHP中的操作mysqli的預處理prepare

2020-03-22 17:17:16
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了關于PHP中的操作mysqli的預處理prepare ,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

PHP中的操作mysqli的預處理prepare1、【PHP錯誤】Cannot pass parameter 2 by reference

這個錯誤的意思是不能按引用傳遞第2個參數
出現這個錯誤的原因是bind_param()方法里的除表示數據類型的第一個參數外,
均需要用變量,而不能用直接量,因為其它參數都是按引用傳遞的

$sql = select * from tmp where myname=? or sex =? $stmt = $mysqli- conn- prepare($sql);$name = a $sex= b $stmt- bind_param( ss ,$name,$sex);//必須要這樣傳參,且在mysqli等的預處理參數綁定中,必須要指定參數的類型且只能一次性綁定全部參數,不能像PDO那樣一個個綁定//$stmt- bind_param( ss , a , b //這種方式的會報錯:Fatal error: Cannot pass parameter 2 by reference$stmt- execute();if($mysqli- conn- affected_rows){ $result = $stmt- get_result(); while($row = $result- fetch_assoc()){ var_dump($row);}

2、PHP防SQL注入不要再用addslashes和mysql_real_escape_string了

不論是使用addslashes還是mysql_real_escape_string,都可以利用編碼的漏洞來實現輸入任意密碼就能登錄服務器的注入攻擊!!!!(攻擊的原理我就不多說了,感興趣的同學可以研究下字符編碼中單字節和多字節的問題)

mysql_real_escape_string之所以能夠防注入是因為mysql_escape_string本身并沒辦法判斷當前的編碼,必須同時指定服務端的編碼和客戶端的編碼,加上就能防編碼問題的注入了。雖然是可以一定程度上防止SQL注入,但還是建議以下的完美解決方案。

完美解決方案就是使用擁有Prepared Statement機制的PDO和MYSQLi來代替mysql_query(注:mysql_query自 PHP 5.5.0 起已廢棄,并在將來會被移除):

PDO:

$pdo = new PDO( mysql:dbname=dbtest;host=127.0.0.1;charset=utf8 , user , pass $pdo- setAttribute(PDO::ATTR_EMULATE_PREPARES, false);$pdo- setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);$stmt = $pdo- prepare( SELECT * FROM employees WHERE name = :name $stmt- execute(array( name = $name));foreach ($stmt as $row) {// do something with $row

MYSQLI:

$stmt = $dbConnection- prepare( SELECT * FROM employees WHERE name = ? $stmt- bind_param( s , $name);$stmt- execute();$result = $stmt- get_result();while ($row = $result- fetch_assoc()) {// do something with $row}

PDO:

$pdo = new PDO( mysql:dbname=dbtest;host=127.0.0.1;charset=utf8 , user , pass $pdo- setAttribute(PDO::ATTR_EMULATE_PREPARES, false);$pdo- setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

MYSQLi:

$stmt = $dbConnection- prepare( SELECT * FROM employees WHERE name = ? $stmt- bind_param( s , $name);$stmt- execute();$result = $stmt- get_result();while ($row = $result- fetch_assoc()) {// do something with $row}

這個錯誤的意思是不能按引用傳遞第2個參數
出現這個錯誤的原因是bind_param()方法里的除表示數據類型的第一個參數外,
均需要用變量,而不能用直接量,因為其它參數都是按引用傳遞的

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !

相關推薦:

PHP判斷鏈接是否有效 的方法

PHP與Web頁面的交互

以上就是PHP中的操作mysqli的預處理prepare的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定边县| 蒙自县| 工布江达县| 湛江市| 柯坪县| 德昌县| 西平县| 赤峰市| 望江县| 巴中市| 张北县| 黎平县| 夹江县| 呈贡县| 防城港市| 南部县| 巴林右旗| 石林| 大方县| 宜丰县| 吐鲁番市| 韶关市| 金秀| 莒南县| 佛坪县| 图们市| 岳普湖县| 赣州市| 大埔县| 南丹县| 阳新县| 渭南市| 汪清县| 东城区| 定西市| 顺平县| 延川县| 双辽市| 绿春县| 施秉县| 贞丰县|