首頁  >  問答  >  主體

如何在 MySQL 語句中包含 PHP 變量

<p>我正在嘗試在內容表中插入值。如果我在 VALUES 中沒有 PHP 變量,它就可以正常工作。當我將變數 <code>$type</code> 放入 <code>VALUES</code> 中時,這不起作用。我做錯了什麼? </p> <pre class="brush:php;toolbar:false;">$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");</pre> <p><br /></p>
P粉738248522P粉738248522445 天前584

全部回覆(2)我來回復

  • P粉949848849

    P粉9498488492023-08-24 16:07:56

    為避免 SQL 注入,插入語句有 be

    $type = 'testing';
    $name = 'john';
    $description = 'whatever';
    
    $con = new mysqli($user, $pass, $db);
    $stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
    $stmt->bind_param("sss", $type , $name, $description);
    $stmt->execute();

    回覆
    0
  • P粉883223328

    P粉8832233282023-08-24 15:43:16

    在任何 MySQL 語句中加入 PHP 變數的規則都是簡單明了的:

    1。使用準備好的語句

    此規則涵蓋 99% 的查詢,特別是您的查詢。任何表示SQL 資料文字的變數(或者,簡單來說 - SQL 字串或數字)都必須透過準備好的語句來添加。 沒有例外

    此方法涉及四個基本步驟

    • 在 SQL 語句中,將所有變數替換為佔位符
    • 準備結果查詢
    • #將變數綁定到佔位符
    • 執行查詢

    以下是如何使用所有流行的 PHP 資料庫驅動程式執行此操作:

    使用mysqli新增資料文字

    目前的 PHP 版本可讓您在一次呼叫中完成準備/綁定/執行:

    $type = 'testing';
    $reporter = "John O'Hara";
    $query = "INSERT INTO contents (type, reporter, description) 
                 VALUES(?, ?, 'whatever')";
    $mysqli->execute_query($query, [$type, $reporter]);

    如果您的 PHP 版本較舊,則必須明確完成準備/綁定/執行:

    $type = 'testing';
    $reporter = "John O'Hara";
    $query = "INSERT INTO contents (type, reporter, description) 
                 VALUES(?, ?, 'whatever')";
    $stmt = $mysqli->prepare($query);
    $stmt->bind_param("ss", $type, $reporter);
    $stmt->execute();

    程式碼有點複雜,但是所有這些運算子的詳細解釋可以在我的文章中找到,如何使用 Mysqli 運行 INSERT 查詢,以及顯著簡化該過程的解決方案。

    對於 SELECT 查詢,您可以使用與上面相同的方法:

    $reporter = "John O'Hara";
    $result = $mysqli->execute_query("SELECT * FROM users WHERE name=?", [$reporter]);
    $row = $result->fetch_assoc(); // or while (...)

    但是,如果您的PHP 版本較舊,您將需要執行準備/綁定/執行例程,並添加對get_result() 方法的調用,以獲得熟悉的< code>mysqli_result 您可以透過通常的方式從中取得資料:

    $reporter = "John O'Hara";
    $stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
    $stmt->bind_param("s", $reporter);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc(); // or while (...)
    使用 PDO 新增資料文字
    $type = 'testing';
    $reporter = "John O'Hara";
    $query = "INSERT INTO contents (type, reporter, description) 
                 VALUES(?, ?, 'whatever')";
    $stmt = $pdo->prepare($query);
    $stmt->execute([$type, $reporter]);

    在PDO中,我們可以將bind和execute部分結合起來,非常方便。 PDO 也支援命名佔位符,有些人覺得這非常方便。

    2。使用白名單過濾

    任何其他查詢部分,例如 SQL 關鍵字、表格或欄位名稱或運算子 - 必須透過白名單進行篩選。

    有時我們必須新增一個代表查詢另一部分的變量,例如關鍵字或識別碼(資料庫、表格或欄位名稱)。這種情況很少見,但最好做好準備。

    在這種情況下,必須對照腳本中明確寫入的值清單檢查您的變數。我的另一篇文章根據使用者的選擇在 ORDER BY 子句中新增欄位名稱對此進行了解釋:

    這是一個例子:

    $orderby = $_GET['orderby'] ?: "name"; // set the default value
    $allowed = ["name","price","qty"]; // the white list of allowed field names
    $key = array_search($orderby, $allowed, true); // see if we have such a name
    if ($key === false) { 
        throw new InvalidArgumentException("Invalid field name"); 
    }
    $direction = $_GET['direction'] ?: "ASC";
    $allowed = ["ASC","DESC"];
    $key = array_search($direction, $allowed, true);
    if ($key === false) { 
        throw new InvalidArgumentException("Invalid ORDER BY direction"); 
    }

    在這樣的程式碼之後,$direction$orderby 變數都可以安全地放入SQL 查詢中,因為它們要麼等於允許的變體之一,要麼將會拋出一個錯誤。

    關於標識符最後要提到的是,它們也必須根據特定的資料庫語法進行格式化。對於 MySQL,它應該是標識符周圍的反引號字元。因此,我們的訂單範例的最終查詢字串將是

    $query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";

    回覆
    0
  • 取消回覆