1. PHP / Говнокод #14757

    +133

    1. 1
    2. 2
    3. 3
    foreach ($_REQUEST['id'] as $id) {
    $db->execute('DELETE FROM `comments` WHERE `id` = ?', $id);
    }

    удаление нескольких комментариев по id

    Запостил: dead_star, 21 Февраля 2014

    Комментарии (11) RSS

    • показать все, что скрытоАнально заминусовал.
      Ответить
    • А в чем проблема? where id in (...) и where id = 1 or id = 2 or ... через параметры же не замутишь. Вот и остается или такой код, или подготовить запрос и исполнять его в цикле...
      Ответить
      • > where id in (<some specific collection>)
        в том же оракле через jdbc можно замутить через нативные классы
        только орм это, конечно же, не будут уметь, т.к. они заточены на универсальность
        Ответить
      • вполне запустишь
        даже если не прибегать к каким-то другим фичам
        $sql = '
        	DELETE FROM
        		`comments`
        	WHERE
        		`id` IN ('.implode(',', array_fill(0, count($_REQUEST['id']), '?')).')';
        array_unshift($_REQUEST['id'], $sql);
        call_user_func_array(array($db, 'execute'), $_REQUEST['id']);

        выглядит жутко, но по крайней мере это 1 запрос
        Ответить
    • народ видно тупит
      нормальное решение:
      $db->execute('DELETE FROM `comments` WHERE `id` IN (?l)', $_REQUEST['id']);

      выполнить 1 запрос вместо 20
      Ответить
      • можно раскрыть нюансы, что такое "?l"
        и если можно, с употреблением prepare, bind_param, или что там в пыхе используется
        Ответить
        • это placeholder. немного теории есть здесь http://dklab.ru/lib/DbSimple/manual.html#cont7
          общая суть сводится к тому что над тем же PDO создается еще один уровень абстракиции в котором реализается поддержка placeholder-ов.
          ?l - позволяет делать выборку по списку параметров
          Ответить
          • что такое плейсхолдер я знаю
            также я знаю, что можно биндить целые числа, строки, дробные числа и blob
            http://php.net/manual/ru/mysqli-stmt.bind-param.php
            это не новость и сделано в угоду универсальности

            а вот что такое l - я не знаю
            и по ссылке, где есть "немного теории" такого тоже нет
            вот и спрашиваю

            как я уже выше писал, я знаю, что конкретно в oracle я могу забиндить ARRAY
            например, передав его вообще как параметр хранимой процедуры
            в такое не умеет, например, даже hibernate, потому что бинд массива как параметра - субд-специфично

            причем передать не как список ?,?,?,?,? или аналогичный, а именно как один ?, где ? - само по себе коллекция

            надеюсь, всем понятно, что select ... in (?) и select ... in (?,?) - это два разных запроса для кеша запросов?
            Ответить
            • действительно плайсхолдера ?l нет по ссылке. он был реализован в драйвере баз данных на моей предыдущей работе
              я привел его здесь как вариант псевдокода, а не как конкретная реализация.
              прошу прошения что мой псевдокод вызвал больше вопросов чем ответов

              по теме
              этот плайсхолдер передает именно список
              объясни на примере что бы было понятней
              драйверу верхнего уровня передается запрос
              select ... in (?l)
              который внутри преобразовывается в
              select ... in (?,?,?,?)
              и передается в драйвер низкого уровня который в свою очередь преобразовывает его в окончательный вид
              select ... in (1,2,3,4)
              и отправляет его базе данных

              на моей предыдущей работе драйвер бд был заточен под MySQL и сразу преобразовывал из select ... in (?l) в select ... in (1,2,3,4) без дополнительной прослойки в виде PDO
              Ответить
              • и передается в драйвер низкого уровня который в свою очередь преобразовывает его в окончательный вид
                select ... in (1,2,3,4)
                и отправляет его базе данных


                что за ерунда, движок СУБД должен принимать prepared statement, а не драйвер низкого уровня должен что-то там подставлять до отправки СУБД
                неужели mysql это не умеет? и всё, для чего вам нужны prepared - это лишь для "экранирования"
                Ответить
                • >и всё, для чего вам нужны prepared - это лишь для "экранирования"
                  Для рнр это уже неебический прогресс.
                  Ответить

    Добавить комментарий