如何在php中創建安全的MySQL準備語句?我對用php在MySQL中使用準備好的語句很陌生。我需要一些幫助來創建一個準備好的語句來檢索列。我需要從不同的專欄中得到信息。當前,對于測試文件,我使用完全不安全SQL語句:$qry = "SELECT * FROM mytable where userid='{$_GET['userid']}' AND category='{$_GET['category']}'ORDER BY id DESC"$result = mysql_query($qry)
or die(mysql_error());有人能幫我創建一個安全MySQL語句使用從url參數(如上面)準備的輸入?額外好處:準備好的語句也會提高速度。如果我只在一頁上使用準備好的報表三、四次,它會提高總體速度嗎?
3 回答

海綿寶寶撒
TA貢獻1809條經驗 獲得超8個贊
$db = new mysqli("host","user","pw","database");$stmt = $db->prepare("SELECT * FROM mytable where userid=? AND category=? ORDER BY id DESC"); $stmt->bind_param('ii', intval($_GET['userid']), intval($_GET['category']));$stmt->execute();$stmt->store_result(); $stmt->bind_result($column1, $column2, $column3);while($stmt->fetch()){ echo "col1=$column1, col2=$column2, col3=$column3 \n";}$stmt->close();
function stmt_bind_assoc (&$stmt, &$out) { $data = mysqli_stmt_result_metadata($stmt); $fields = array(); $out = array(); $fields[0] = $stmt; $count = 1; while($field = mysqli_fetch_field($data)) { $fields[$count] = &$out[$field->name]; $count++; } call_user_func_array(mysqli_stmt_bind_result, $fields);}
$stmt->store_result();$resultrow = array();stmt_bind_assoc($stmt, $resultrow);while($stmt->fetch()){ print_r($resultrow);}

qq_花開花謝_0
TA貢獻1835條經驗 獲得超7個贊
PHP ext/mysql
不支持參數化SQL語句。 在防范SQL注入問題時,查詢參數被認為更可靠。 mysql_real_escape_string()
如果您正確地使用它,也可能是有效的,但它的代碼更冗長。 在某些版本中,國際字符集存在字符不能正確轉義的情況,從而留下微妙的漏洞。使用查詢參數可以避免這些情況。
mysql_real_escape_string()
$query = "SELECT * FROM $the_table ORDER BY $some_column";
當您使用不同的參數值多次執行準備好的查詢時,性能就會有好處。您避免了解析和準備查詢的開銷。但是,您需要在同一個PHP請求中多次執行相同的SQL查詢嗎? 即使您可以利用這一性能優勢,與您為解決性能問題所能做的許多其他事情相比,它通常也只是輕微的改進,比如有效地使用操作碼緩存或數據緩存。 甚至有些情況下,準備好的查詢 害處表演。例如,在下面的情況下,優化器不能假設它可以使用索引進行搜索,因為它必須假定參數值 強權從通配符開始: SELECT * FROM mytable WHERE textfield LIKE ?
添加回答
舉報
0/150
提交
取消