簡體   English   中英

我的mysqli代碼出了什么問題?

[英]What is wrong with my mysqli code?

我試圖將mysqli代碼嵌入到我的網頁中,以便消除SQL注入。 這是我的代碼現在的樣子:

$gYear = $_POST["year"];
$gYear2 = $_POST["year2"];
$gMonth = $_POST["month"];
$gSelect = $_POST["location"];

$query = $conn->prepare("SELECT $gSelect, Year FROM unemployed WHERE year BETWEEN '$gYear' AND '$gYear2' and month='$gMonth'");
$query->bind_param('ssss', $gyear, $gYear2, $gMonth, $gSelect);

$query->execute(); 
$result = $query->get_result();

while ($row = $result->fetch_object()){


// do something with gathered rows 
}

現在,提交表單后,我得到兩個錯誤。 他們說的是:

Warning: mysqli_stmt::bind_param() [mysqli-stmt.bind-param]: Number of variables doesn't match number of parameters in prepared statement in

Fatal error: Call to undefined method mysqli_stmt::get_result() in

我真的不知道我的問題是什么。 我嘗試遵循如何防止PHP中的SQL注入中列出的規則 有誰知道我的問題是什么? 為什么會收到這兩個錯誤消息? 任何幫助將不勝感激。

對於mysqli::prepare() ,必須使用? 用於參數。 (文章中的代碼在字符串中使用了標准的PHP 變量替換 -使用占位符時,不應對值進行此操作。)

強烈建議您不要讓用戶選擇您要選擇的列。 使用switch()或類似的方法在代碼中選擇列名稱,並將其放置在$ column變量中。

switch($_POST['location']){
  case "loc1":
    $column = "location_one";
    break;
  case "loc2":
    $column = "location_two";
    break;
  // etc, etc...
}
$query = $conn->prepare("SELECT $column, year FROM unemployed WHERE year BETWEEN ? AND ? and month=?");
$query->bind_param('sss', $gyear, $gYear2, $gMonth);

您可以使用PDO防止SQL注入,它也適用於> = PHP 5.1

PDO and the PDO_SQLITE driver is enabled by default as of PHP 5.1.0. You may need to
enable the PDO driver for your database of choice;consult the documentation for 
database-specific PDO drivers to find out more about that.

PDO文檔

它使用最廣泛,如果您知道如何使用mysqli,那么對您來說也很容易

tutsplus的教程

為什么要使用PHP的PDO進行數據庫訪問

暫無
暫無

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

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