Php 我的mysqli代码有什么问题?
我正在尝试将mysqli代码嵌入到我的网页中,以便消除sql注入。下面是我的代码现在的样子:Php 我的mysqli代码有什么问题?,php,mysql,forms,mysqli,sql-injection,Php,Mysql,Forms,Mysqli,Sql Injection,我正在尝试将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
$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
及
我真的不知道我的问题是什么。我试着遵守表中列出的规则。有人知道我的问题是什么吗?为什么我会收到这两条错误消息?任何帮助都将不胜感激 对于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注入,它也适用于>=PHP5.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.
它被广泛使用,如果你知道如何使用mysqli,那么它对你来说也很容易吗
不幸的是,您没有遵循这些原则;如果您的代码能够查询数据库,则可能会受到注入攻击。您将变量值直接放入SQL查询,而不是使用占位符作为参数。当MySQLi看到这个查询时,它已经(通过PHP)填写了所有的值。@user2562125是的,该示例在查询中使用了
?
,而不是变量值。除了强烈建议之外,我认为它甚至不起作用-因为它将以“
”结尾,而列名需要用反勾来引用。嗯,从技术上讲,它的工作方式与他/她最初的工作方式几乎相同,因为他/她将$gSelect
放在了准备好的语句中。因此switch语句可以直接放在我的查询代码前面,我所要做的就是说明每个位置?是的。它可以在您准备好的声明之前到达任何地方。添加了关于原始代码的说明以及失败的原因。
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.