簡體   English   中英

MySQLi動態創建的預處理語句失敗:“在預處理語句中沒有為參數提供數據”

[英]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.

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