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

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

從 mysqli 轉換為準備好的語句

從 mysqli 轉換為準備好的語句

PHP
catspeake 2021-10-22 16:53:37
我試圖將代碼從 mysqli_* 語句轉換為準備好的語句以防止 SQL 注入。以下代碼是我正在嘗試轉換的代碼(目前它可以正常工作):$details = mysqli_query($linkDB,"SELECT * FROM ".PREFIX."Issues WHERE id='".$_POST['article']."' AND disabled='0' LIMIT 1");$detail = mysqli_fetch_assoc($details);這是我嘗試轉換為準備好的語句。任何使這更簡潔的方法都將不勝感激(因為我將從 2 行代碼變為多行):$SQL = "SELECT * FROM ".PREFIX."Issues WHERE id='?' AND disabled='0' LIMIT 1";$PRE = mysqli_stmt_init($linkDB);//if (! $PRE = mysqli_prepare($linkDB, $SQL)) {   (alt attempt)    if (! mysqli_stmt_prepare($PRE, $SQL)) {        echo "<f><msg>ERROR: Could not prepare query: ".$SQL.", ".mysqli_error($linkDB)."</msg></f>";    } else {        mysqli_stmt_bind_param($PRE, "i", $test);        $test = $_POST['article'];        if (! mysqli_stmt_execute($PRE)) {            echo "<f><msg>ERROR: Could not execute query: ".$SQL.", ".mysqli_error($linkDB)."</msg></f>";        } else{            $details = mysqli_stmt_get_result($PRE);            $detail = mysqli_fetch_assoc($details);            mysqli_stmt_close($PRE);        }}上面的代碼不會在 $detail 變量中返回/存儲 db 值,以便稍后在腳本中進行處理。我試過注釋掉 mysqli_stmt_close($PRE) 調用,但這沒有區別。我感謝您的幫助!
查看完整描述

2 回答

?
寶慕林4294392

TA貢獻2021條經驗 獲得超8個贊

代碼中的主要錯誤是'?'查詢中的拼寫錯誤。如果?是在引號內,則不會將其視為占位符,而是將其視為文字值。


使用 MySQLi 時,您應該啟用 MySQLi 異常模式。如果這樣做,則不再需要檢查每個函數的結果。您還應該使用 OOP 風格,因為它不那么冗長,而且不太可能犯下愚蠢的錯誤。


// put this line before you open the MySQLi connection

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);


$stmt = $linkDB->prepare('SELECT * FROM '.PREFIX.'Issues WHERE id=? AND disabled=0 LIMIT 1');

$stmt->bind_param('i', $_POST['article']);

$stmt->execute();

$detail = $stmt->get_result()->fetch_assoc();


查看完整回答
反對 回復 2021-10-22
?
米脂

TA貢獻1836條經驗 獲得超3個贊

如果您不是經驗豐富的編碼員,我會推薦 PDO。它是面向對象的,適合現代的 PHP 編碼方式。


在您的配置文件中,您輸入:


$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);

還有你的腳本:


$statement = $pdo->prepare('SELECT * FROM '.PREFIX.'Issues WHERE id = :id AND disabled = 0 LIMIT 1';

$statement->execute(['id' => $_POST['article']);

$result = $statement->fetch(PDO::FETCH_ASSOC);


查看完整回答
反對 回復 2021-10-22
  • 2 回答
  • 0 關注
  • 185 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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