За последние 24 часа нас посетили 22044 программиста и 989 роботов. Сейчас ищут 662 программиста ...

Как правильно создать функцию с двумя запросами к БД к разным таблицам

Тема в разделе "PHP для новичков", создана пользователем AlexsaiL, 27 фев 2017.

  1. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Делаю страницу товаров, пытаюсь вывести с БД инфу с товаром объединив две таблицы в одном запросе выбрав нужные столбцы и перегнав в ассоциативный массив:
    Код (Text):
    1. function getProductsByCat($itemId) {
    2.     $sql = "SELECT t1.ID,
    3. t1.NAME as NAME,
    4. t1.PICTURE as PICTURE,
    5. t1.PRICE_RUS as PRICE_RUS,
    6. t1.ARCHIVE as ARCHIVE,
    7. t1.GROUP_NAME as GROUP_NAME,
    8. t1.ID_PRODUCT as ID_PRODUCT1,
    9. t2.ID_PRODUCT as ID_PRODUCT2,
    10. t2.ID_GROUP_OF_PRODUCTS as ID_GROUP_OF_PRODUCTS FROM `product` t1 LEFT JOIN `link_gr-of-prod_with_prod` t2 ON t1.ID_PRODUCT = t2.ID_PRODUCT  WHERE `ID_GROUP_OF_PRODUCTS` = '{$itemId}' ";
    11.  
    12.     $rs = mysql_query($sql);
    13.  
    14.     return createSmartyRsArray($rs);
    15. }
    Код (Text):
    1. function createSmartyRsArray($rs) {
    2.     if(!$rs) return false;
    3.  
    4.     $smartyRs = array();
    5.     while ($row = mysql_fetch_assoc($rs)) {
    6.         $smartyRs[] = $row;
    7.     }
    8.  
    9.     return $smartyRs;
    10. }
    получилось вывести данные, НО мне необходимо теперь с другой таблице добавить главное изображение товара так, чтобы оно соответсвовало id продукта в таблице имеется имя продукта, id продукта поле с изображением. Мне нужно добавить в ассоциативный массив новое значение с изображением.
    немного запутался, подскажите.
     
  2. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    изображение хранится в бд?
    но так или иначе нужно всего лишь добавить
    t13.IMAGE as IMAGE `ТАБЛИЦА_С_КАРТИНКОЙ`
     
  3. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    в БД храниться имена изображений, а изображения он подтягивает уже с папки img
     
  4. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @AlexsaiL ну просто измени образец в соответствии с условиями да и всё в масиве будет урл
     
  5. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    я пишу отдельную функцию, где обращаюсь к таблице изображений продукта, по id_product должен выбрать товар и с колонки изображений взять название файла если оно отсутствует подставить другое изображение по умолчанию пример:
    Код (Text):
    1. function give_big_picture($object_id){
    2. $sql= 'SELECT * FROM `pictures` WHERE  ID_PRODUCT='.$object_id.'  ORDER BY `ORDERA` DESC ';
    3.  
    4.     $rs = mysql_query($sql);
    5.     if (mysql_num_rows($rs)!=0){  
    6.         while($row = mysql_fetch_assoc($rs)) {
    7.             return $row[PICTURE_BIG];
    8.         }
    9.     }
    10.     else{
    11.         return "img_default.jpg";  
    12.     }
    13. }
    и подставить его в карточку с товаром, но эта функция возвращает false, мне нужно этот запрос связать с запросом продуктов которые выводятся на странице
     
  6. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @AlexsaiL неверный код
    PHP:
    1.   $rs = mysql_query($sql);
    2.     if (mysql_num_rows($rs)!=0){
    3.         while($row = mysql_fetch_assoc($rs)) {
    4. if($row[PICTURE_BIG]!=null){ return $row[PICTURE_BIG];}
    5.  }
    6. return default;
    7. }
    8. }
    --- Добавлено ---
    хотя это довольно таки не оптимально
     
  7. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    в общем мне надо сделать чтобы этот вот запрос к бд, был связан с самым первым запросом в первом моем сообщении, получал Id товара от первого запроса и в функции function give_big_picture ... выбирал нужное изображение и возвращал
     
  8. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @AlexsaiL ид в таблицах совпадают?
     
  9. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    id продукта совпадают, но дело в том, что у одного Id продукта могут быть несколько изображений в бд, поэтому с помощью такого запроса
    Код (Text):
    1. SELECT * FROM `pictures` WHERE  ID_PRODUCT='.$object_id.'  ORDER BY `ORDERA` DESC
    такой сортировки он возвращает нужное изображение
    --- Добавлено ---
    мне надо с первого запроса БД брать id продукта и по этому id во втором запросе подбирать изображение, после возвращать, а так как я уже выше упоминал, такой запрос возвращает false(0) так как он не получает id передаваемого продукта и не знает что возвращать с бд
     
  10. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @AlexsaiL
    SELECT * FROM `pictures` WHERE ID_PRODUCT=(select id from first table where...
    это?
     
  11. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    ну надо тестить, смотреть как работать запрос будет. Я встречал как в одной функции обращаются к бд и внутри идет обращение к другой функции которая принимает какое то свойство от первой функции и на её основе , тоже обрабатывает запрос к бд и возвращает результат добавляя его в ассоциативный массив первого запроса, вот в таком плане бы реализовать.
     
  12. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @AlexsaiL ну ты в принципе можешь написать типа 'select ..... id=my_func('select..)..' но зачем тебе такие сложности если просто нужно получить ячейку из таблицы, при том что к этой таблице ты уже обращаешся?
    не проще ли поместить все полученные данные в массив а затем просто проверить получено ли изображение а если нет то заменить на дефолтное
     
  13. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    объединял я три таблицы с помощью JOIN выводил нужный массив, вот только он мне выводил столько товаров с одним именем, сколько фото в бд указано, возможно из-за того, что Id_product в каждой таблице присутствует, хз...
    --- Добавлено ---
    вот этот запрос :
    Код (Text):
    1. SELECT t1.ID_PRODUCT,
    2. t1.NAME as NAME,
    3. t1.PICTURE as PICTURE,
    4. t1.PRICE_RUS as PRICE_RUS,
    5. t1.ARCHIVE as ARCHIVE,
    6. t1.GROUP_NAME as GROUP_NAME,
    7. t2.ID_PRODUCT,
    8. t2.ID_GROUP_OF_PRODUCTS as ID_GROUP_OF_PRODUCTS,
    9. t3.ID_PRODUCT,
    10. t3.PICTURE_BIG as PICTURE_BIG,
    11. t3.ID as ID,
    12. t3.ORDERA as ORDERA
    13. FROM `product` t1
    14. LEFT JOIN `link_gr-of-prod_with_prod` t2 ON t1.ID_PRODUCT = t2.ID_PRODUCT
    15. RIGHT JOIN `pictures` t3 ON t1.ID_PRODUCT = t3.ID_PRODUCT WHERE  ID_GROUP_OF_PRODUCTS = '{$itemId}'  ORDER BY `ORDERA` DESC";
    16.  
    17.     $rs = mysql_query($sql);
    18.    
    19.     return createSmartyRsArray($rs);
    --- Добавлено ---
    Но из-за малого знания и практики, не знаю как сделать правильно
     
  14. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    @AlexsaiL ну есть вариант отсортировать полученый массив, но это не рационально,- будет лишний трафик..
    и LIMIT здесь не поможет...
    разве что както
    HAVING MIN(ID)

    здесь и мои навыки иссякли. я бы делал вторым запросом
     
    AlexsaiL нравится это.
  15. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    спасибо за помощь, дальше что нить придумаю