在条件下将值插入表中

时间:2014-08-30 11:58:17

标签: php sql pdo

如果满足一个条件而另一个条件不满足,我试图将两个值插入表中。

我已经找到了关于此事的教程,但我似乎无法让它发挥作用。

本教程解释了如何创建一个简单的类似PHP的按钮,并有两个表articlesarticles_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();

3 个答案:

答案 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);

从那时起一切正常!