亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在php中創建安全的MySQL準備語句?

如何在php中創建安全的MySQL準備語句?

ABOUTYOU 2019-06-21 15:54:18
如何在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個贊

下面是一個使用mysqli的示例(對象語法-如果您愿意的話,可以很容易地轉換為函數語法):

$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();

此外,如果您希望找到一種簡單的方法來獲取關聯數組(用于select*),而不必指定要綁定到哪些變量,那么這里有一個方便的函數:

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);}

要使用它,只需調用它,而不是調用BIND_RE結局:

$stmt->store_result();$resultrow = array();stmt_bind_assoc($stmt, $resultrow);while($stmt->fetch()){
    print_r($resultrow);}


查看完整回答
反對 回復 2019-06-21
?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

我同意其他幾個答案:

  • PHP

    ext/mysql

    不支持參數化SQL語句。
  • 在防范SQL注入問題時,查詢參數被認為更可靠。
  • mysql_real_escape_string()

    如果您正確地使用它,也可能是有效的,但它的代碼更冗長。
  • 在某些版本中,國際字符集存在字符不能正確轉義的情況,從而留下微妙的漏洞。使用查詢參數可以避免這些情況。

您還應該注意,即使使用查詢參數,仍然必須對SQL注入保持謹慎,因為參數僅取代SQL查詢中的文字值。如果動態生成SQL查詢,并將PHP變量用于表名、列名或SQL語法的任何其他部分,則查詢參數和mysql_real_escape_string()幫我處理這個案子。例如:

$query = "SELECT * FROM $the_table ORDER BY $some_column";

關于業績:

  • 當您使用不同的參數值多次執行準備好的查詢時,性能就會有好處。您避免了解析和準備查詢的開銷。但是,您需要在同一個PHP請求中多次執行相同的SQL查詢嗎?
  • 即使您可以利用這一性能優勢,與您為解決性能問題所能做的許多其他事情相比,它通常也只是輕微的改進,比如有效地使用操作碼緩存或數據緩存。
  • 甚至有些情況下,準備好的查詢害處表演。例如,在下面的情況下,優化器不能假設它可以使用索引進行搜索,因為它必須假定參數值強權從通配符開始:

    SELECT * FROM mytable WHERE textfield LIKE ?


查看完整回答
反對 回復 2019-06-21
  • 3 回答
  • 0 關注
  • 519 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號