[英]properly parameterize mysqli query and print multiple rows
我知道這個問題如果漂浮在各處,但我似乎無法將其應用於我自己的問題。 我一直在使用非參數化查詢,這使我的項目極易受到SQL注入的攻擊
情節:
我有一個表格,您可以在其中輸入日期。 PHP將獲取日期並在查詢中使用它來檢索多行信息。
如何參數化我的mysqli查詢並打印出多行? 這是我到目前為止:
HTML
<form action="#" class="form-horizontal" method="post">
<label for="fromDate" class="control-label">Date from:</label>
<input type="date" id="fromDate" class="datepicker" name="searchDate" value="<?php echo $searchDate; ?>">
<button type="submit" class="btn">Go</button>
<input type="hidden" name="formIdentifier" value="mainSearch" />
</form>
PHP
if($_POST['formIdentifier'] == "mainSearch"){
//get date from form
$searchDate = $_POST['searchDate'];
$todayDateFrom = $searchDate." 00:00:00";
$todayDateTo = $searchDate." 23:59:59";
$stmt = $conn->prepare("SELECT G.* FROM Groups AS G, Customers AS C
WHERE C.travel_Date >= '?'
AND C.travel_Date <= '?'
AND C.customer_ID = G.leader_ID");
$stmt->bind_param("si", todayDateFrom , todayDateTo );
$stmt->execute();
/* bind variables to prepared statement */
$stmt->bind_result($col1, $col2);
}
PHP循環
while ($stmt->fetch()) {
//Display copious amounts of data.
}
我根據PHP手冊編寫了我的代碼,最終變得不堪重負。 我甚至不確定我是否正在准備我的查詢,更不用說嘗試如何顯示數據了。 任何幫助,將不勝感激!
注意 - 如果有人可以解釋$stmt->bind_param("si", todayDateFrom , todayDateTo );
特別是那個太棒了的“si”。 我只是不明白它的目的是什么。
- 解 -
感謝所有的答案,我能夠讓我的第一個參數化查詢工作。
正如所建議的那樣,我在查詢中刪除了圍繞“?”的“'”。
然后我將bind_param
“si”更改為“ss”,因為我綁定了2個字符串,而不是字符串和整數。
然后我將結果綁定(在本例中我在表中有3列)
$stmt->bind_result($group_ID, $leader_ID, $gDate);
因為我目前沒有安裝第三方驅動程序,所以我必須顯示結果:
while ($stmt->fetch()) {
echo "group_ID: ".$group_ID."<br />";
echo "leader_ID: ".$leader_ID."<br />";
echo "group_Date: ".$group_Date."<br />";
}
你現有的代碼工作得很好,除了你有一個小錯誤,來自手冊PHP MySQLi bind_param手冊
我對應的變量有整數類型
d對應的變量有double類型
s對應的變量有類型字符串
因此,從上面我們可以看到,如果你想告訴MySQLi你的參數實際上是整數,則使用“i”,如果你想告訴MySQLi你的參數實際上是一個字符串,則使用“s”。
所以請更換
$stmt->bind_param("si", todayDateFrom , todayDateTo );
同
$stmt->bind_param("ss", todayDateFrom , todayDateTo );
並刪除
“
從參數占位符(即'?'應替換為?)
您發送參數化語句的代碼將正常工作
獲取結果
從手冊PHP MySQLi獲取 fetch的作用:
將預准備語句的結果提取到綁定變量中
你在尋找的是get_result 。 從手冊中:
從預准備語句中獲取結果集
因此,您可以使用以下代碼獲取數據:
$result = $stmt->get_result();
while ($row = $result->fetch_array(MYSQLI_NUM))
{
foreach ($row as $r)
{
print "$r ";
}
print "\n";
}
這是fetch_array的文檔
您需要更改以下行:
$stmt->bind_param("si", todayDateFrom , todayDateTo );
至:
$stmt->bind_param("ss", todayDateFrom , todayDateTo );
原因:如果您查看下圖,您可以看到i
是Integer
, s
是String
。
date參數應該以String
形式提供,因此使用s
。
參考:PHP mysqli_stmt :: bind_param文檔。
您還需要更新SQL語句:
$stmt = $conn->prepare("SELECT G.* FROM Groups AS G, Customers AS C
WHERE C.travel_Date >= '?'
AND C.travel_Date <= '?'
AND C.customer_ID = G.leader_ID");
至:
$stmt = $conn->prepare("SELECT G.* FROM Groups AS G, Customers AS C
WHERE C.travel_Date >= ?
AND C.travel_Date <= ?
AND C.customer_ID = G.leader_ID");
原因:參數標記不應被'
包圍。
$stmt->bind_param("si", todayDateFrom , todayDateTo );
在param綁定期間,你提到第一個變量是字符串而第二個是整數但是根據你的代碼它應該是
$stmt->bind_param("ss", $todayDateFrom , $todayDateTo );
請從查詢中刪除單引號,並且應該是這樣的
$stmt = $conn->prepare("SELECT G.* FROM Groups AS G, Customers AS C
WHERE C.travel_Date >= ?
AND C.travel_Date <= ?
AND C.customer_ID = G.leader_ID");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.