За последние 24 часа нас посетили 18405 программистов и 1606 роботов. Сейчас ищут 1285 программистов ...

Динамическое создание запроса к БД

Тема в разделе "Прочие вопросы по PHP", создана пользователем Pall, 12 июл 2013.

  1. Pall

    Pall Новичок

    С нами с:
    12 июл 2013
    Сообщения:
    6
    Симпатии:
    0
    Здравствуйте, очень надеюсь на вашу помощь.. ибо вообще не могу понять суть проблемы -
    Собственно задача у меня была такая:
    есть запрос к БД вида - update ... where (условие).

    вот это самое условие я хочу - создавать динамически, исходя из входящих данных.
    условие должно выглядеть примерно так - `stat`.`uid` = 2 OR `stat`.`uid` = 1 OR ......

    но тут то и начинаются странности - скачала я написал запрос сразу, для теста, одной строчкой - он работал.

    затем разделил на две части - основа и условие. склеил их динамически - все работает.

    Но! когда я попробовал склеивать условия в цикле:
    Код (Text):
    1.  
    2. for ($i = 0; $i < count($ids); $i++)
    3.     {
    4.         if(i > 0)
    5.         {
    6.             //$subreq = "".$subreq." OR  `stat`.`uid` = ".$ids[i]."";
    7.         }
    8.         else
    9.         {
    10.             //$subreq = "".$subreq." `stat`.`uid` = ".$ids[i]."";
    11.         }
    12.     }
    работать код перестал. (нужные значения в бд не меняются)

    САМОЕ удивительное что казалось бы аналогичный код но без цикла - работает(предположим что в цикле тоже было два элемента):
    Код (Text):
    1.  
    2. $subreq = "".$subreq." `stat`.`uid` = ".$ids[0]."";
    3. $subreq = "".$subreq." OR `stat`.`uid` = ".$ids[1]."";
    Как такое вообще возможно, господа? О.о

    заранее благодарен.
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А вы вообще понимаете, что такое цикл и как он работает?
     
  3. Pall

    Pall Новичок

    С нами с:
    12 июл 2013
    Сообщения:
    6
    Симпатии:
    0
    эмм вообще-то да.. если только в php он не работает каким-то совершенно особенным образом(я то флешер, в пхп новичок еще))) что врятли))


    а в чем собственно ваша мысль?)
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Почему у тебя код в первом примере ЗАКОМЕНТАРЕН? Естественно он не выполняется.
     
  5. GHarut

    GHarut Новичок

    С нами с:
    12 июл 2013
    Сообщения:
    4
    Симпатии:
    0
    сделай
    Код (Text):
    1. print_r($ids)
    и посмотри что в массиве..
    а вообще что за извращение? почему for?
    Код (Text):
    1.  
    2. foreach($ids as $id){
    3. $add="stat.uid = ".$id;
    4. $subreq=(empty($subreq)) ? $add : $subreq." OR ".$add;
    5. }
    потом когда сформулируешь весь запрос сделай
    Код (Text):
    1. echo $query
    и посмотри что у тебя вышло..
     
  6. Pall

    Pall Новичок

    С нами с:
    12 июл 2013
    Сообщения:
    6
    Симпатии:
    0
    мдаа.. echo конечно сделаю.. но не думаю что что-то из этого выйдет...=(

    а про "закоментарен" я вообще молчу...

    Добавлено спустя 23 минуты 55 секунд:
    ээмм.. про echo - при способе через цикл оно возвращает следующее - `stat`.`uid` = `stat`.`uid` =

    а значит элементы из массива не берутся.. но как??? ведь когда я обращаюсь к ним по индексу без цикла - все работает.(как я уже писал выше)
    то есть: $ids[0] - работает, а

    for ($i = 0; $i < count($ids); $i++)
    {
    $ids
    }
    не работает! че за бред ???) как это вообще?

    Добавлено спустя 8 минут 42 секунды:
    вот это действительно помогло, спасибо! правда совсем не понимаю почему! и меня это смущает. в чем разница то?
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Покажите весь скрипт с запросом.
     
  8. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Еще один программист осчастливил реляционный мир своим появлением. :)

    Не пойму зачем добавлять пустые строки в начало и конец выражения?

    $subreq = "".$subreq." `stat`.`uid` = ".$ids."";

    Если вы хотели включить кавычки в запрос то надо примерно так

    $subreq = "\"".$subreq." `stat`.`uid` = ".$ids."\"";

    Тогда еще менее понятно в контексте сбора условий.

    Теперь самая мякотка. На кой член вам собирать все условия через OR, если мотор БД это может сделать за вас по временной таблице которую вы и сформируете прямо в запросе.

    Специально для нубов http://www.tutorialspoint.com/mysql/mysql-in-clause.htm

    "Суть такова". SELECT возвращает не только данные из БД, но и вообще что угодно, на что способен мотор (engine) БД. Например SELECT 2*2; вернет таблицу состоящую из одной колонки под названием 2*2 и одной строки со значением 4. Сделали открытие?

    Логично предположить что можно сделать и такой запрос, в котором построить некую таблицу вручную. Например SELECT 1, 2, 3, 4; вернет таблицу
    поля: 1 2 3 4
    значения: 1 2 3 4

    Теперь осталось ввести отношения которые делаются кляузой (clause) IN

    SELECT 1 IN ( 1, 2, 3, 4 ); Получаем значение 1 в поле с именем "1 IN ( 1, 2, 3, 4 )". Может показаться что смысла нет, но если написать SELECT 8 IN (1, 2, 3, 4) то получим 0. Следовательно смысл есть, все работает.

    Осталось достроить отношения с данными в БД что и делается как в примере на сайте по урлу выше.

    SELECT * FROM sometable WHERE somevar IN (1, 2, 3, 4);

    Таким образом никакие цЫклы и рекурсии вам не нужны. На входе массив, да? Значит

    $query = "SELECT something FROM somebody WHERE stat.uid IN (" . implode(",", $ids) . ");";

    Все одной строкой.

    Добавлено спустя 2 минуты 1 секунду:
    Однако хочу предупредить не пытаться применять кляузу NOT IN. Это общее место всех программистов. Они в принципе не хотят понимать что такое БД. Общий принцип проектирования БД в части отношений таков - если у вас появилась потребность искать неизвестное, или неравенство - значит вместо БД у вас строится биде.
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7


    deblogger, и чем вы защитили свою бд? В прочем как и у автора темы, бд не защищена от инъекций.
    Если вы так утверждаете и не понимаете зачем цикл, стоит хотя бы подумать логически, а если потребуются дополнительные проверки данных из массива(ов) ? Приведения типов и экранирований, точно убедиться, что при работе с базой, будут приниматься безопасные данные.

    Можно конечно сделать как одна строка и экранировать.
    Но есть и другие фишки и прочее... И утверждать, что цикл-это для не удачников не правильно.

    Вот придет игорка за нарушения правил выставит вам предупреждение, а то и большее...
     
  10. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Я против анальных методов в принципе и поэтому обсуждать инъекции в задницу не собираюсь.

    Более того, в целях защиты культуры хотел бы попросить сделать инъекцию в данный пример. А то блин ходят всякие страшилки пересказывают, а сами поди не бельмеса.

    Впрочем, вы уже сделали одну инъекцию - процитировав мою телегу целиком и подписавшись под ней. Защита делается элементарно - бб-парсер выделяет все что между кодами quote и замеряет длину в символах. Если больше - пишет гневный еррор на станции пересадки.

    Добавлено спустя 9 минут 15 секунд:
    Какой-то ebalighten. Я могу прямо в ссылке написать write.php?query=DELETE+*+FROM+users" и что мне за это будет?

    Добавлено спустя 17 минут 15 секунд:
    Да, теперь стало понятно почему объект mysqli такой ублюдочный.

    Потому что его сделали программисты.
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    чувак, ты не в том положении чтобы изображать сарказм. обижайся или нет, но ты ламер. хочешь научиться -- прислушивайся к любому совету как к божественному откровению.



    потому что надо так: $ids[$i]

    Добавлено спустя 3 минуты 29 секунд:
    включи вывод ошибок и предупреждений. про эту ошибку тебе должно было выскочить сообщение
     
  12. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Крутотень, пхп по-русски ботает оказыца.

    Меня тоже пунктуация задрала, не езыг, а сплошные закорючки. После явы бесконечно забывал обаксить что-нибудь и даже не пытался прочитать что там написано, поскольку иногда большими буквами выскакивает нечто типа ALABERDY-BALANERDY-T on line 12,... числа я понимаю - смотрю вокруг указанной строки. :)
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    что?

    ты можешь перестать курить?
     
  14. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ну вот зачем сравнивать "php" и "java".
    Это бессмысленность. Это не правильно.
    Почему некоторые считают себя умнее разработчиков и с высказыванием о языке, что-то банальное и одновременно глупое.
    deblogger,
    Ты в какой степени сравниваешь языки? И для какой цели?
    Ведь они же разные в синтаксисе и для разных целей. И отличить их очень, и очень просто.
    И уж "java" точно не для "web", "php" будет удачнее для "web".
     
  15. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Спорный вопрос. Спросите у админов ЛОР-а, на чем у них сервер крутится.
     
  16. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Спорный вопрос, был бы, если бы "php" работал медленее.
    "Java", не для этого придумана, да не спорю сделать можно.
    Язык конечно хороший, кроссплатформенный.
    Минусы конечно есть, но они есть везде, так-же как и погрешности.
     
  17. shelestov

    shelestov Активный пользователь

    С нами с:
    25 авг 2011
    Сообщения:
    148
    Симпатии:
    0
    Адрес:
    Россия, Арзамас
    Писать надо на том, что лучше знаешь. :)
    Если человек всю жизнь писал на Java, ему проще взять Grails или Play framework и забацать сайт, нежели осваивать синтаксис php, ruby... и т.д.
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Если бы только синтаксис. Другая философия.
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Так Жаба Жабе рознь. J2SE десктопная это одно, а вот J2EE - это чисто серверная такая Жаба. Для того и создавалась.
    Видимо, с Java, вы не работали. Это сиподобный язык, как и C, C++, C#, MEL, JS, PHP и хз сколько их еще. Как раз с синтаксисом проблем вообще нет при переходе.
    Вот это уже более в тему. Но опять же, это если речь идет о переходе с десктопного программирования на серверное. Разницы же между серверной Жабой и РНР особой не почувствуется в плане философии.

    Ладненько, что-то тема поползла не в ту сторону :)
     
  20. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Java серверный язык и все это к SE относится, только для этого используются надстройки EE еще и другие.
    Синтаксис разный.
    Языки разные.
    php - динамическая типизация
    java - строгая типизация
    Дальше думаю сравнения ни к чему. После этого и так уже понятно.
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Объекты по-разному вызываются, потому что в PHP "." исторически уже занята? :) Ну да, знак $ в Java не надо писать к переменным, там он немного для другого служит. Да, это фундаментально разделяет синтаксис двух си-подобных языков :)

    Мелочевка. Никак не определяющая "серверность" платформы. Просто это вот все звучит как "у этого молотка красная ручка, он лучше подоходит для забивания гвоздей, а у того молотка ручка совсем другого цвета. Другой молоток, сравнивать бесполезно, и так все понятно". Тут уже как-то было сказано, что на самом деле нет никаких языков программирования - на низком уровне все они к одному сводятся. Есть лишь задачи, есть инструменты для выполнения. Хороший программист не тот, который хорошо знает язык, а тот, который может кодить на любом языке после некоторого периода ознакомления, потому что он хорошо знает программирование. В том и соль. И плевать, что "этот язык не такой, как тот, с которым я работал ранее". Плохие программисты учат языки, хорошие - учат программирование, а языки...это просто промежуточное звено между мозгом и процессором.
     
  22. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Я так долго писал сообщение, что-от него осталось только это:
    Код (PHP):
    1. final class ClassName {
    2.     private $array=array();
    3.     public function __construct(array $array) {
    4.         $this->array=$array;
    5.     }
    6.     public function getArray() {
    7.         if(!empty($this->array) && is_array($this->array)) {
    8.             return $this->array;
    9.         }
    10.     return;
    11.     }
    12. }
    13.  
    14. function methodName(ClassName $className,array $array) {
    15.     return array_merge($className->getArray(),$array);
    16. }
    17. print_r(methodName(new ClassName(array(
    18.     'key1'=>'value1',
    19.     'key2'=>'value2',
    20.     'key3'=>'value3'
    21. )),array(
    22.     'int1'=>1,
    23.     'int2'=>2,
    24.     'int3'=>3
    25. ))); 
    Потому, что после нажатия отправить у меня попросило войти когда я вернулся его уже не было.

    Поправьте, если вдруг вышло, и отправляешь, после входа, чтобы сообщение отправилось.
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    CTRL+A,CTRL+C перед отправкой, бро. Не только тут. На любом форуме/сайте, ибо проблема ужасна и вездесущща. А что касательно "поправьте" - это phpBB, тут нельзя просто что-то взять и поправить :(
     
  24. shelestov

    shelestov Активный пользователь

    С нами с:
    25 авг 2011
    Сообщения:
    148
    Симпатии:
    0
    Адрес:
    Россия, Арзамас
    Я на java пишу уже 2 года.
    Новый язык это не только синтаксис. Как уже подметили выше это другая философия.

    Добавлено спустя 2 минуты 34 секунды:
    Для чего тратить время на ознакомления работы с красным молотком, если все можно сделать черным?
     
  25. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да, php это совсем не java