Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我的mysqli代码有什么问题?_Php_Mysql_Forms_Mysqli_Sql Injection - Fatal编程技术网

Php 我的mysqli代码有什么问题?

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

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

我真的不知道我的问题是什么。我试着遵守表中列出的规则。有人知道我的问题是什么吗?为什么我会收到这两条错误消息?任何帮助都将不胜感激

对于
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.