За последние 24 часа нас посетили 20605 программистов и 1105 роботов. Сейчас ищут 809 программистов ...

Реализация поиска по тегам(категории).

Тема в разделе "MySQL", создана пользователем cadijob, 17 июл 2017.

  1. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    PHP:
    1.   $TagByPostId = $pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID = IN ('$articlesResult')");
    Так?
     
  2. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    почитайте чуть чуть про MySql http://dimonchik.com/sql-in.html
    это сильно ускорит понимание как это все работает.
     
    cadijob нравится это.
  3. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Чёрт. Это я код не правильно вставил. В начале я всё нормально написал -
    PHP:
    1. $TagByPostId=$pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID IN ('$articlesResult')");
     
  4. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    теперь еще надо почитать про конкатенацию и сложный синтаксис)
     
  5. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Вы имеете ввиду GROUP_CONCAT?
     
  6. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    нет)) именно то что я сказал))
     
  7. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    CONCAT значит. А что нужно соединять?
     
  8. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    конкатенацию и сложный синтаксис
    --- Добавлено ---
    PHP:
    1. $TagByPostId=$pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID IN (" . array_values($articlesResult) . ")");
    а вообще если через PDO работаете то лучше через плейсхолдеры данные добавляйте
     
  9. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Может так нужно?
    PHP:
    1. $TagByPostId=$pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID IN (' . array_values($articlesResult) . ')");
    (одинарные кавычки в новой части кода) Если да, то ничего не поменялось и, как я понял, мне нужно "почитать про конкатенацию и сложный синтаксис"?)
     
  10. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    так не нужно) внешние кавычки другие)
     
  11. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Тогда у меня ошибка -

    Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'where clause' in адрес\function.php:36 Stack trace: #0 адрес\function.php(36): PDO->query('SELECT * FROM `...') #1 адрес\index.php(9): getArticlesByTags(Array) #2 {main} thrown in адрес\function.php on line 36

    ('SELECT * FROM `...') - разве не из-за кавычек? Или с массивом что-то не то?
     
  12. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    е.... тысяча извинений)) в функцию IN надо не массив засылать)) а значения)) я привык что у меня в движке можно массивы отправлять)) попробуйте вот так вот)
    PHP:
    1. $TagByPostId=$pdo->query(
    2. "SELECT *
    3. FROM `articleTags` AS l
    4. LEFT JOIN `tags` AS t ON(l.tagID = t.id)
    5. WHERE l.articleID IN (" . implode(',', array_values($articlesResult)) . ")");
     
  13. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    К сожалению та же ошибка...
     
  14. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    в функцию getArticlesByTags что передаете и что она должна принимать?
     
  15. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Передаю $articlesResult - это массив который я получаю в другой функции -
    PHP:
    1. function getArticles(){
    2.     connectPDO();
    3.     global $pdo;
    4.     $articlesResult = $pdo->query("SELECT `id` FROM `article` ORDER BY `id`");
    5.     return resultToArrayArticle($articlesResult );
    6. }
    7. function resultToArrayArticle($articlesResult ){
    8.     $array = array();
    9.     while ($row = $articlesResult ->fetch( PDO::FETCH_ASSOC )){
    10.         $array[] = $row;
    11.     }
    12.     return $array;
    13. }
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    вы чета много очень про теги написали. это ж простая штука. и выборки там просые как палка. и можно даже без джоинов.
     
  17. Алекс8

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

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    с джоинами нагляднее)) можно и такую запись
    Код (Text):
    1. SELECT * FROM tags, prom WHERE tags.id  = prom.id
    но джоины красивее выглядят..

    я вот только что - что обнаружил...
    в PDO такая конструкция передачи в IN параметров не работает)
    Код (Text):
    1. $array = [0, -1];
    2. $stmt = $db->prepare("SELECT * FROM smf_membergroups WHERE min_posts IN (:myarray)");
    3. $stmt->execute(array(
    4.     'myarray' => implode(', ', array_values($array)),
    5. ));
    надо формировать или текстовую переменную и напрямую вставлять в запрос.. или генерировать динамические плесхолдеры, ставить их в запрос и биндить тоже через массив динамически созданный..
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    я имел в виду вообще без джоинов
    забрали из таблицы связей номера тегов по статье, забрали из таблицы тегов их названия. Два запроса, никто не умер. Победа.
     
  19. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    А эти два запроса можно в одну функцию поместить?
    Такого типа -
    PHP:
    1. function getArticles(){
    2.     connectPDO();
    3.     global $pdo;
    4.     $articlesResult = $pdo->query("SELECT `id` FROM `article` ORDER BY `id`");
    5.     return resultToArrayArticle($articlesResult );
    6. }
    7. function resultToArrayArticle($articlesResult ){
    8.     $array = array();
    9.     while ($row = $articlesResult ->fetch( PDO::FETCH_ASSOC )){
    10.         $array[] = $row;
    11.     }
    12.     return $array;
    13. }
     
  20. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Можете скинуть пример какой-нибудь?
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    чтоб я больше не видел такого, ладно? :D

    хоть десять. а в чем сложность?
     
  22. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    На этом же форуме подсказали, когда через pdo не мог БД подключить.
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    мало ли чего подсказали

    сделай себе синглтон и насуй в него методов типа resultToArrayArticle() и живи счастливо
    а то с этим глобалом натрахаешься потом
    --- Добавлено ---
    https://en.wikipedia.org/wiki/Singleton_pattern
     
    cadijob нравится это.
  24. cadijob

    cadijob Новичок

    С нами с:
    14 июл 2017
    Сообщения:
    35
    Симпатии:
    0
    Спасибо. А что по поводу - "я имел в виду вообще без джоинов
    забрали из таблицы связей номера тегов по статье, забрали из таблицы тегов их названия. Два запроса, никто не умер. Победа.".
    Можете пример какой нибудь скинуть, пожалуйста?
     
  25. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    просто один запрос, потом второй. Просто два запроса. =]
     
    cadijob нравится это.