如果满足一个条件而另一个条件不满足,我试图将两个值插入表中。
我已经找到了关于此事的教程,但我似乎无法让它发挥作用。
本教程解释了如何创建一个简单的类似PHP的按钮,并有两个表articles
和articles_likes
。
articles
有两列: id 和 title 。
articles_likes
有三列: id ,用户和文章。
教程中的代码如下所示:
$db->query("
INSERT INTO articles_likes (user, article)
SELECT {$_SESSION['user_id']}, {$id}
FROM articles
WHERE EXISTS (
SELECT id
FROM articles
WHERE id = {$id})
AND NOT EXISTS (
SELECT id
FROM articles_likes
WHERE user = {$_SESSION['user_id']}
AND article = {$id})
LIMIT 1
");
现在首先,我使用PDO $query = $pdo->prepare(" .. ");
和问号加bindValue()
来避免SQL注入,并且所有这些都适用于其他SQL语句,但这个似乎不起作用
我用Google INSERT INTO .. SELECT .. FROM
语法搜索,W3schools将其解释为将值从一个表复制到另一个表。那么这在教程中是如何工作的呢? articles
具有完全不同的结构,他将$变量插入SELECT
语句。
任何人都可以解释为什么这首先起作用,以及它如何在PDO中起作用?
编辑:
这是我自己的代码(我添加了$value
,因为我的代码是二进制评级而不是类似代码):
global $pdo;
$query = $pdo->prepare("
INSERT INTO quote_ratings (user_ip, quote_id, value)
SELECT ?, ?, ?
FROM posts
WHERE EXISTS (
SELECT id
FROM posts
WHERE id = ?)
AND NOT EXISTS (
SELECT id
FROM quote_ratings
WHERE user_ip = ?
AND quote_id = ?)
LIMIT 1
");
$query->bindValue(1, $user_ip);
$query->bindValue(2, $quote_id);
$query->bindValue(3, $rating);
$query->bindValue(4, $quote_id);
$query->bindValue(5, $user_ip);
$query->bindValue(6, $quote_id);
$query->execute();
答案 0 :(得分:0)
某些嵌套的SQL查询未正确绑定,并且在处理查询期间PDO解析器会留下一些内容。此外,无法查看PDO是否生成了最终查询。
我建议在这种情况下使用Mysqli库。我经常在复杂的连接或自定义触发器的执行过程中遇到这样的问题。如果你想继续使用面向对象的代码,你可以使用MySQLi Class,也可以使用简单的程序方法。
Atul Jindal
答案 1 :(得分:0)
我完全同意PDO是避免sql注入的不错选择,但是,您知道在这种情况下您无法调试查询。但是如果您在输入时明智地使用mysqli并正确检查sql注入,那么就不会有问题。
答案 2 :(得分:0)
我发现了问题:默认情况下,PDO使用无缓冲的查询。这由于某种原因使得请求无法解析。因此,必须为此请求更改模式:
$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
从那时起一切正常!