我的 mysqli 代码有啥问题?

Posted

技术标签:

【中文标题】我的 mysqli 代码有啥问题?【英文标题】:What is wrong with my mysqli code?我的 mysqli 代码有什么问题? 【发布时间】:2013-07-12 04:39:29 【问题描述】:

我正在尝试将 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

我真的不知道我的问题是什么。我尝试遵循How can I prevent SQL injection in php? 中列出的规则。有谁知道我的问题是什么?为什么我会收到这两条错误消息?任何帮助将不胜感激。

【问题讨论】:

很遗憾你没有关注他们;你的代码,如果它设法查询数据库,就会受到注入攻击。 您将变量值直接放入 SQL 查询中,而不是为参数使用占位符。当 MySQLi 看到查询时,它已经(通过 PHP)填写了所有值。 @user2562125 是的,该示例在查询中使用?,而不是变量值。 【参考方案1】:

对于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);

【讨论】:

除了强烈建议之外,我认为它甚至不会起作用 - 因为它最终会用 "" 引用,而列名需要用反引号引用。 嗯,从技术上讲,它几乎可以按照他/她最初的方式工作,因为他/她已将$gSelect 放在准备好的语句中。 所以 switch 语句可以直接放在我的查询代码前面,我所要做的就是说明每个位置? 是的。它可以在你准备好的陈述之前的任何地方。 添加了对原始代码及其失败原因的说明。【参考方案2】:

您可以使用 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 documentation

它使用最广泛,如果你知道如何使用mysqli,那么它对你来说也很容易

Tutorial from tutsplus

Why you Should be using PHP’s PDO for Database Access

【讨论】:

以上是关于我的 mysqli 代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在这段代码中在 PHP 中使用 mysqli

动态 mysqli 准备语句失败

PHP mysqli语句执行()不起作用

Mysql-> Mysqli [重复]

我的 php/mysqli 中出现错误和警告 [重复]

将数组分组 - 我的代码有啥问题?