[英]MySQLi dynamically created prepared statement fails: “No data supplied for parameters in prepared statement”
我有一段代碼,可以從MySQL數據庫讀取崩潰日志和其他元數據,然后再將其作為JSON發送回請求者(此代碼在另一頁上由AJAX函數調用)。 (可選)可以使用GET指定過濾器,該過濾器會更改Prepared語句以僅過濾指定的結果-例如,僅顯示一個應用程序版本的結果。 這是有問題的代碼:
$conn = new mysqli($sql_servername, $sql_username, $sql_password, "Crashes");
if ($conn->connect_error) {
//failed
die();
}
$sql="
SELECT ID,phone,appver,osver,user_agent,username,message,app_name,date_received FROM Crashes WHERE ";
$params="";
$params2="";
if (isset($_GET["filter_phone"])) {
$sql .= "phone = ? AND "; //i.e "WHERE phone = ? AND (...osver = ? AND appver = ? etc)"
$params.="s";
$params2.=', $_GET["filter_phone"]';
}
if (isset($_GET["filter_appver"])) {
$sql .= "appver = ? AND ";
$params.="s";
$params2.=', $_GET["filter_appver"]';
}
if (isset($_GET["filter_osver"])) {
$sql .= "osver = ? AND ";
$params.="s";
$params2.=', $_GET["filter_osver"]';
}
if (isset($_GET["filter_user_agent"])) {
$sql .= "user_agent = ? AND ";
$params.="s";
$params2.=', $_GET["filter_user_agent"]';
}
if (isset($_GET["filter_username"])) {
$sql .= "username = ? AND ";
$params.="s";
$params2.=', $_GET["filter_username"]';
}
if (isset($_GET["filter_message"])) {
$sql .= "message = ? AND ";
$params.="s";
$params2.=', $_GET["filter_message"]';
}
if (isset($_GET["filter_app_name"])) {
$sql .= "app_name = ? AND ";
$params.="s";
$params2.=', $_GET["filter_app_name"]';
}
$sql.="1";
//echo "\$params: ".$params."<br>";
//echo "\$params2: ".$params2."<br>";
//echo "<br>\$stmt->bind_param(\$params$params2);<br>";
//echo var_dump($_GET);
$stmt = $conn->prepare($sql);
exec("\$stmt->bind_param(\$params$params2);");
if ($stmt->execute()) {
//echo "<br>Success!";
} else {
//echo "<br>Failure: ".$stmt->error;
}
$result = $stmt->get_result();
$out = array();
while ($row = $result->fetch_assoc()) {
array_push($out, $row);
}
echo json_encode($out);
在未指定過濾器的情況下,此代碼可以完美地工作-但是,在指定任何過濾器的情況下,該語句將失敗,並顯示錯誤, No data supplied for parameters in prepared statement
。 我已經驗證exec()
中的代碼應該是(例如,如果設置了user_agent過濾器) $stmt->bind_param($params, $_GET["filter_user_agent"]);
此外,當我使用查詢但僅手動替換?
時,SQL查詢可以完美地工作?
包含過濾器,因此初始查詢似乎不是問題,而是預准備語句。 幫助將不勝感激。
注意:注釋掉的echo
出於調試目的,通常被禁用,但是我將其留給我看以顯示我如何獲得當前的信息。
編輯:下面回答了我自己的問題-錯誤是我正在使用exec()
- 執行外部外殼命令的函數,而我想要的是eval()
,它評估字符串輸入並將其作為PHP執行腳本。
原來我只是被誤認為exec()
的功能。 (太多的Python?) exec()
運行一個外部shell命令 ,而我正在尋找的是eval()
,它評估並運行任何以PHP代碼輸入的字符串。
看起來您從未真正使用過$params
和$params2
值。 您將它們串聯起來,但是$stmt->bind_param()
哪里? 被評論了嗎?
我也沒有看到$conn->prepare("")
。 您是否省略了一些代碼?
$conn
被定義為mysqli對象,然后再也不使用。 這里不對勁。
編輯:
試試exec(“ \\ $ stmt-> bind_param(\\ $ params \\ $ params2);”); 我假設您以某種方式執行代碼並轉義了變量-遵循該邏輯,也許應該轉義params和params2呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.