簡體   English   中英

在 SQL 查詢中使用 PHP 變量

[英]Using PHP variable in SQL query

我在使用帶有 SQL 查詢的 PHP 中聲明的變量時遇到了一些問題。 我已經使用了如何在 MySQL 插入語句中包含 PHP 變量中的資源,但沒有使用它們。 我意識到這很容易發生 SQL 注入,如果有人想向我展示如何防止這種情況發生,我很樂意實施。 (我認為通過使用 mysql_real_escape_string 但這可能會被棄用?)

<?php
$q = 'Hospital_Name';
$query = "SELECT * FROM database.table WHERE field_name = 'hospital_name' AND value = '$q'";

$query_result = mysqli_query($conn, $query);
while ($row = mysqli_fetch_assoc($query_result)) {
   echo $row['value'];
}
?>

我試過用$q切換'$q' ,但沒有用。 如果我將醫院名稱直接替換到查詢中,SQL 查詢和 PHP 輸出代碼將起作用,所以我知道這不是問題,除非由於某種原因它在連接到數據庫並執行查詢時使用不同的邏輯和變量。

先感謝您。

編輯:我將繼續發布更多我的實際代碼,而不僅僅是問題區域,因為不幸的是,所提供的答案都沒有奏效。 我正在嘗試打印一個“病例 ID”,它是與患者相關的主鍵。 我使用的是 REDCap 臨床數據庫,它們的表結構與普通關系數據庫略有不同。 我的代碼如下:

<?php
$q = 'Hospital_Name';
$query = "SELECT * FROM database.table WHERE field_name = 'case_id' AND record in (SELECT distinct record FROM database.table WHERE field_name = 'hospital_name' AND value = '$q')";

$query_result = mysqli_query($conn, $query);
while ($row = mysqli_fetch_assoc($query_result)) {
   echo $row['value'];
}
?>

我試過用'$q''".$q."'替換$q ,但沒有一個打印出我需要的 case_id。 我也嘗試使用mysqli_stmt_*函數,但它們也只打印空白。 如果有幫助,我們的服務器使用 PHP 5.3.3 版。

再次感謝。

這樣做

<?php
$q = 'mercy_west';
$query = "SELECT col1,col2,col3,col4 FROM database.table WHERE field_name = 'hospital_name' AND value = ?";
if($stmt = $db->query($query)){
  $stmt->bind_param("s",$q);   // s is for string, i for integer, number of these must match your ? marks in query. Then variable you're binding is the $q, Must match number of ? as well
  $stmt->execute();
  $stmt->bind_result($col1,$col2,$col3,$col4);  // Can initialize these above with $col1 = "", but these bind what you're selecting. If you select 5 times, must have 5 variables, and they go in in order. select id,name, bind_result($id,name)
  $stmt->store_result();
  while($stmt->fetch()){   // fetch the results
    echo $col1;
  }
  $stmt->close();
}

?>

是的mysql_real_escape_string()已棄用。

一個解決方案,通過類似的答案為暗示這一個在該職位你提供一個鏈接,是使用准備好的語句。 MySQLi 和 PDO 都支持使用准備好的語句綁定參數。

要繼續使用 mysqli_* 函數,請使用:

  • mysqli_prepare()獲取准備好的語句
  • mysqli_stmt_bind_param()綁定參數(例如對於WHERE條件value='$q'
  • mysqli_stmt_execute()執行語句
  • mysqli_stmt_bind_result()將輸出發送到變量。

     <?php $q = 'Hospital_Name'; $query = "SELECT value FROM database.table WHERE field_name = 'hospital_name' AND value = ?"; $statement = mysqli_prepare($conn, $query); //Bind parameter for $q; substituted for first ? in $query //first parameter: 's' -> string mysqli_stmt_bind_param($statement, 's', $q); //execute the statement mysqli_stmt_execute($statement); //bind an output variable mysqli_stmt_bind_result($stmt, $value); while ( mysqli_stmt_fetch($stmt)) { echo $value; //print the value from each returned row }

如果您考慮使用 PDO,請查看bindparam() 您將需要確定PDO 構造函數的參數,然后可以使用它通過prepare()方法獲取准備好的語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM