Php 在条件下向表中插入值

Php 在条件下向表中插入值,php,sql,pdo,Php,Sql,Pdo,如果一个条件满足,另一个条件不满足,我会尝试在表中插入两个值 我已经找到了关于这件事的教程,但我似乎无法让它发挥作用 本教程介绍了如何创建一个简单的类似PHP的按钮,有两个表,articles和articles 文章有两列:id和标题 文章有三列:id、用户和文章 本教程中的代码如下所示: $db->query(" INSERT INTO articles_likes (user, article) SELECT {$_SESSION['user_id']}, {

如果一个条件满足,另一个条件不满足,我会尝试在表中插入两个值

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

本教程介绍了如何创建一个简单的类似PHP的按钮,有两个表,articles和articles

文章有两列:id和标题

文章有三列: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语句配合使用,但这一条似乎不起作用

我已经用谷歌搜索了插入的内容。。选择并解释为将值从一个表复制到另一个表中。那么这在教程中是如何工作的呢?articles具有完全不同的结构,他正在SELECT语句中插入$variables

有人能解释一下为什么这在第一时间起作用,以及它在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();

某些类型的嵌套SQL查询没有正确绑定,PDO解析器在查询处理过程中留下了一些东西。此外,也无法确定最终查询是否是由PDO生成的

我建议在这种情况下使用Mysqli库。我通常在复杂的连接或自定义触发器的执行过程中遇到这样的问题。如果您想继续使用面向对象的代码,可以使用MySQLi类,也可以使用简单的过程方法


Atul Jindal

我完全同意PDO是避免sql注入的好选择,但是,您知道,在这种情况下,您无法调试查询。但是如果您明智地使用mysqli,并在输入时正确地检查sql注入,那么就不会有问题。

我发现了问题:默认情况下,PDO使用无缓冲查询。由于某种原因,这使得请求无法解析。因此,必须为此请求更改模式:

$dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);

从那以后一切都很好

如果您需要有关SQL语法的帮助,请发布有问题的SQL查询,而不是教程中的查询。@Andomar,谢谢,添加了!谢谢,您是否可以添加一个比似乎不起作用更好的问题描述?有错误消息吗?@Andomar没有,没有错误。数据库没有得到更新。也许查询正在按预期工作?你确定存在和不存在条件都是真的吗?真的吗?我认为PDO是SQL访问的最佳和最安全的解决方案。。有人能证实这一点吗?