0

我正在尝试将 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 注入中列出的规则?. 有谁知道我的问题是什么?为什么我会收到这两条错误消息?任何帮助将不胜感激。

4

2 回答 2

0

您可以使用 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 进行数据库访问

于 2013-07-14T00:22:20.187 回答
0

对于mysqli::prepare(),您必须使用?for 参数。(帖子中的代码使用标准的 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);
于 2013-07-13T23:56:08.837 回答