php - 我的 mysqli 代码有什么问题?

标签 php mysql forms mysqli sql-injection

我正在尝试将 mysqli 代码嵌入到我的网页中,这样我就可以消除 sql 注入(inject)。这是我的代码现在的样子:

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

最佳答案

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

关于php - 我的 mysqli 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635208/

相关文章:

php - 如何在手机上通过网站上传文件?

php - 重置多维数组中的数组键

php - 使用 imagick PHP 在 png 图像周围添加边框

php - 表示数据库及其关系

html - 如何在 HTML 中引用标记值

javascript - 拖放后对表中的行重新编号

mysql - 我可以通过mysql特殊功能存储我自己的sql查询并稍后执行存储的查询吗?

php - body 错误中的空行数据包,图像结果集很大

html - 使用 window.location.href 重定向表单提交

javascript - Angular 2.0 表单回调和逻辑问题