2014-08-30 5 views
0

Im пытается вставить два значения в таблицу, если выполнено одно условие, а другое не выполнено.Вставка значений в таблицу в условиях

Я нашел учебное пособие по этому вопросу, но я не могу заставить его работать.

В учебном пособии объясняется, как создать простую кнопку, похожую на PHP, и имеет две таблицы: articles и articles_likes.

articles имеет два столбца: идентификаторов и название.

articles_likes имеет три колонки: идентификаторов, пользователь и статья.

код в учебнике выглядит следующим образом:

$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 
"); 

Теперь в первую очередь, им с помощью ПДО с $query = $pdo->prepare(" .. "); и вопросительными знаками плюс bindValue(), чтобы избежать инъекции SQL, и все, что работает нормально с другими операторами SQL , но этот, похоже, не работает.

Я искал синтаксис INSERT INTO .. SELECT .. FROM, и W3schools объясняет это как копирование значений из одной таблицы в другую. Итак, как это работает даже в учебнике? articles имеет совершенно другую структуру, и он вставляет переменные $ в оператор SELECT.

Может ли кто-нибудь объяснить, почему это работает в первую очередь и как это будет работать в PDO?

Edit:

Вот мой собственный код (я добавил $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

Если вам нужна помощь с синтаксисом SQL, отправьте проблемный SQL-запрос, а не запрос из учебника. – Andomar

+0

@Andomar Спасибо, добавлено! – JKunstwald

+0

Спасибо, не могли бы вы также добавить лучшее описание проблемы, чем «кажется, не работает»? Есть ли сообщение об ошибке? – Andomar

ответ

0

Я нашел проблему: PDO по умолчанию использует небуферизованные запросы. Это по какой-то причине делает запрос невозможным для синтаксического анализа. Поэтому для этого запроса необходимо изменить режим:

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

и все работает отлично с этого момента!

0

своего рода вложенных запросов SQL не правильно получить привязку и что-то оставлено парсером PDO во время обработки запроса. Также нет способа узнать, был ли окончательный запрос сгенерирован PDO.

Я рекомендую использовать библиотеку Mysqli для использования в таких сценариях. Обычно я сталкиваюсь с такими проблемами во время сложных объединений или выполнения пользовательских триггеров. Если вы хотите перейти к объектно-ориентированному коду, вы можете использовать MySQLi Class, или вы можете использовать простой процедурный подход.

Атула Джиндэл

+0

Действительно? Я думал, что PDO является лучшим и самым надежным решением для доступа SQL. Может ли кто-нибудь подтвердить это? – JKunstwald

0

я я полностью согласен, что PDO хороший выбор, чтобы избежать SQL инъекций, но, вы знаете, в таких ситуациях, вы не в состоянии отладки запросов. Но если вы разумно используете mysqli и правильно проверяете SQL-инъекции при вводе, тогда проблем не будет.

Смежные вопросы