【问题标题】:PDO bindValue does not work when value from $_GET当来自 $_GET 的值时,PDO bindValue 不起作用
【发布时间】:2015-03-13 16:31:33
【问题描述】:

我正在尝试使用 PHP、SQL、PDO 创建一个基本评分函数,它将用户给出的评分值添加到字段“recipe_rating”,然后将 1 添加到字段“recipe_ratingcounter”。

但是,我下面的代码有些地方不太对劲!这两行 $query1->bindValue(2, $recipename);和 $query2->bindValue(1, $recipename);无法正常工作,因为它们实际上没有将任何内容绑定到 SQL 语句中的相应占位符。 SQL 语法是正确的,因为当上面的 $recipename 变量被替换为像“tuna pasta”或“spag bol”这样的单个字符串而不是 $_GET['name'] 时,整个函数可以完美运行。

Var_dump 将 $recipename 显示为字符串:

  • $recipename = $_GET['name'];

  • $recipename = "金枪鱼意大利面";

...因此我不知道下一步该做什么,因为我已经尝试了所有我能想到的!

这行得通 -

if (isset($_POST["Submit"])) {
$selectedrating = $_POST["rating"];
$recipename = "tuna pasta";

global $con;
$query1 = $con->prepare("UPDATE emptyfridge SET recipe_rating = recipe_rating + :recipe_rating WHERE recipe_name = :recipe_name1");
$query1->bindValue(':recipe_rating', $selectedrating);
$query1->bindValue(':recipe_name1', $recipename);
$query1->execute();

$query2 = $con->prepare("UPDATE emptyfridge SET recipe_ratingcounter = recipe_ratingcounter + 1 WHERE recipe_name = :recipe_name2");
$query2->bindValue(':recipe_name2', $recipename);
$query2->execute();
}

但这不起作用 -

if (isset($_POST["Submit"])) {
$selectedrating = $_POST["rating"];
$recipename = $_GET['name'];

global $con;
$query1 = $con->prepare("UPDATE emptyfridge SET recipe_rating = recipe_rating + :recipe_rating WHERE recipe_name = :recipe_name1");
$query1->bindValue(':recipe_rating', $selectedrating);
$query1->bindValue(':recipe_name1', $recipename);
$query1->execute();

$query2 = $con->prepare("UPDATE emptyfridge SET recipe_ratingcounter = recipe_ratingcounter + 1 WHERE recipe_name = :recipe_name2");
$query2->bindValue(':recipe_name2', $recipename);
$query2->execute();
}

任何帮助将不胜感激。

【问题讨论】:

  • 这两种情况($_GET 与 $_POST)之间只有一个区别 - 因此很可能使用无效的查询字符串(不包含“名称”或预期的值)。
  • 很少见,但如果表单操作包含值,则完全有可能。这是一个巨大的安全风险。提示:不要使用 GET 进行数据库写入。
  • @iamgory POST 不再安全.. 唯一的作用是将数据保留在 URL 之外(并且 URL 经常被记录,因此 YMMV 用于“敏感”信息,但它与保存数据的安全性/完整性)。
  • 嗯,它稍微安全一点,因为它至少可以对普通用户隐藏。理想情况下,他至少应该使用 SESSION 变量 IMO。
  • @iamgory 这不是“安全”。

标签: php mysql pdo


【解决方案1】:

bindValue 用于原始值。示例:

$sql->bindValue(":val1", "tuna pasta");
$sql->bindValue(":val2", 1234);

对于变量中的值,您必须使用 bindParam。示例:

$var1 = "tuna pasta";
$var2 = 1234;
$sql->bindParam(":val1", $var1);
$sql->bindParam(":val2", $var2);

【讨论】:

  • 这是不正确的。您可以在bindValue 中使用变量,它们只是不会被引用绑定。
猜你喜欢
  • 2013-01-03
  • 2011-02-11
  • 1970-01-01
  • 2016-01-28
  • 2015-06-10
  • 2016-04-22
  • 2017-01-18
  • 2015-05-12
相关资源
最近更新 更多