【问题标题】:Passing quoted parameter to prepared statement PDO将带引号的参数传递给准备好的语句 PDO
【发布时间】:2020-09-13 20:10:53
【问题描述】:

我查看了其他问题、PHP 和 PDO 文档以及许多其他示例,但我觉得卡住了,可能是因为我刚刚开始使用 PHP 和 MySQL。

我正在尝试首先检查是否存在带有 SELECT 语句的行,然后检查是否存在行 DELETE 它。

但是,查询没有通过,我在 Ubuntu 18 上使用 MySQL 8,并且查询只能在 WHERE 子句之后使用单引号:

SELECT bookname FROM libri WHERE bookname LIKE "test.pdf";
DELETE FROM libri WHERE bookname LIKE "test.pdf";

但是似乎我无法用准备好的语句重现它:

$sql = "SELECT bookname FROM libri WHERE bookname LIKE :deleteTerm;";
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':deleteTerm', $deleteKey); 
$stmt->execute();

我将$deleteKey 设置为$deleteKey = $_POST['delete']; 并尝试将单引号附加为$stmt->bindValue(':deleteTerm', "'".$deleteKey."'"); 它不起作用。 还尝试将引号直接设置为变量名:$deleteKey = "'".$_POST['delete']."'"; 并使用上面准备好的语句,但仍然无法正常工作。

是我遗漏了什么,还是有什么问题?也许我必须使用另一个查询?

【问题讨论】:

  • 准备好的语句不需要引号,它将变量的洞内容作为字符串,这就是sql注入不起作用的原因
  • 您好 nbk,感谢您的评论和确认,在再次查看代码后,我实际上可以使用 $deleteKey = $_POST['delete'];

标签: php mysql pdo prepared-statement


【解决方案1】:

您所做的交易的“选择”部分是不必要的。因为你的意思是如果它存在就删除它。您正在尝试在下一部分中将其删除。如果你真的直接运行第二部分,如果它已经存在,它会删除它。我也建议你在爪区尝试这个。

$sql = " DELETE FROM libri WHERE bookname LIKE 'test.pdf'";

【讨论】:

  • 我认为用户的意思有所不同。除了你必须用 \ 转义引号
  • 你好,谢谢你的回复,但我不是问这些查询是否有用,问题是关于单引号转义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2020-11-26
  • 2014-07-20
相关资源
最近更新 更多