За последние 24 часа нас посетили 18962 программиста и 1617 роботов. Сейчас ищут 744 программиста ...

Возвращается пустое значение

Тема в разделе "PHP и базы данных", создана пользователем Mr. T, 24 мар 2011.

  1. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Здравствуйте, есть код примерно следующего характера:

    PHP:
    1. <?php
    2. $result1 = $db->query ('SELECT product_id FROM group WHERE client_id = 1;');
    3. $num_rows1 = $db->num_rows ($result1);
    4. for ($i = 0; $i < $num_rows1; $i++) {
    5.     $row1 = $db->fetch_array ($result1);
    6.     $result2 = $db->query ('SELECT update_id FROM update WHERE product_id = ' . $row1['product_id'] . ';');
    7.     $num_rows2 = $db->num_rows ($result2);
    8.     for ($j = 0; $j < $num_rows2; $j++) {
    9.         $row2 = $db->fetch_array ($result2)
    10.         //
    11.    }
    12. }
    13. ?>
    var_dump:

    PHP:
    1. <?php
    2. var_dump ($row1['product_id']);
    3. ?>
    возвращает только первое значение, все остальные нулы. Если не использую класс, а создаю коннект к базе и второй запрос кручу через этот коннект, то все нормально... В какую сторону смотреть, что не так?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а че за $row? тут нет роу. тут есть роу1 и роу2
     
  3. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Сорри, опечатка вышла, поправил, но проблема остается.
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а в третьей строке резалт1 или просто резалт? =)
     
  5. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Резалт1 :)

    Может быть, причина в классе? :) и какая? :)
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    запарил. что ты хочешь? чем тебя один запрос не устроит? =)
     
  7. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Структура базы кривая (не моя), поэтому одним запросом сделать это не реально, по крайней, мере я так думаю. Я имею идентификатор пользователя, по которому выбираю продукты, которые он приобрел, если для продукта есть обновления, то вывожу их, потом следующий продукт.

    Раньше в скрипте прописывалось подключение к базе, теперь, когда подключил класс для mysql, то вылазит эта лажа, вот я и думаю, что вероятно дело в классе (сам писал), возможно что-то не учел, но хз куда смотреть, могу код класса показать, если нужно.

    P.S. Мой 100-й пост на форуме :)
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я не спец в запросах, но сделать выборку такую как ты описал не проблема. left join кажется как раз тут очень кстати

    Mr. T
    Сообщения: 104
    быстро ты
     
  9. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Ок, завтра (уже сегодня), гляну еще раз код, спасибо за наводку.
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты б лучше сюда структуру обеих таблиц запостил бы
     
  11. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Не полит корректно будет, не моя база :)
     
  12. igordata

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

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

    структуру а не значения
     
  13. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Ок, структура:

    Таблица products:
    - product_id
    - product_name
    - client_id

    Таблица upgrades:
    - upgrade_id
    - upgrade_name
    - product_id

    Задача:

    Зная client_id, выбрать все продукты, которые он купил из таблицы products, если для продукта есть обновления в таблице upgrades, то вывести их, потом перейти сразу к следующему продукту и повторить проверку наличия обновления в таблице upgrades.

    Как я делаю:

    Выбираю все product_id, которые завязаны за выбранным client_id, значения product_id передаю в цикле в другой запрос и вывожу обновления.

    Как здесь через left join делать, не пойму как потом "размотать" данные... Может быть, дело в классе моем?
     
  14. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1) Есть подозрение, что пофетчить два результата на одном коннекте нельзя. Точнее у меня не получалось - возникали конфликты.
    2)
    [sql]select product_name, upgrade_name from products as p left outer join upgrades as u on p.product_id=u.product_id where client_id=1 order by product_name[/sql]
    Если для каждого продукта есть не более одного обновления все работает.
    Если для одного продукта может быть несколько обновлений, то можно замутить цикл типа:
    PHP:
    1. <?php
    2. echo "<div class='products'>Ваши продукты";
    3. $rez=$db->select($sql);
    4. $lastProduct='';
    5. while ($row=$db->fetchAssoc($rez)){
    6.     if($lastProduct!=$row['product_name']){
    7.         $lastProduct=$row['product_name'];
    8.         echo "</div>";
    9.         echo "<div class='prod'>";
    10.         echo "<p class='productName'>".$row['product_name']."</p>";
    11.     }
    12.     if($row['upgrade_name']){
    13.         echo "<p class='upgrade'>".$row['product_name']."</p>";
    14.     }
    15. }
    16. echo "</div>";
     
  15. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Для продукта может быть более одного обновления и часто так и есть, про mysql_fetch_array на одном коннекте уже тоже странности замечал. Приведенный пример относиться к приведенному запросу? Просто не понял его суть, если юзать left join, то слева будет дублироваться id продукта, в таком случае можно завести дополнительный счетчик и проверять id продукта, пока не встретиться следующий, но как-то стремно алгоритм выглядит...
     
  16. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Да.

    В выборке ничего не дублируется, там выбирается ровно 2 поля: имя продукта и имя обновления.

    Именно так и сделано.

    Согласен, но пока я не знаю как лучше можно разобрать подобные запросы.
     
  17. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Спасибо за наводку, испробую. С другой стороны, один цикл, один запрос, возможно быстрее будет работать, но нужно замерять время.
     
  18. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Volt(220),
    предложенный вариант реально рулит, но возникла маленькая проблема, не могу вкурить как лучше сделать. К примеру, код:

    PHP:
    1.  
    2. <?php
    3. $result = $db->query ('SQL-запрос');
    4. $num_rows = $db->num_rows ($result);
    5. $last_product_id = '';
    6. for ($i = 0; $i < $num_rows; $i++) {
    7.     $row = $db->fetch_array ($result);
    8.     list ($product_id, $product_name, $expiration_date, $upgrade_id, $upgrade_name) = $row;
    9.     if ($last_product_id != $product_id) {
    10.         $last_product_id = $product_id;
    11.         $date = date ('Y-m-d');
    12.         echo '<table>' . "\r\n";
    13.         if ($date > $expiration_date) {
    14.             echo ' <tr>' . "\r\n";
    15.             echo '  <td>Срок обслуживания закончился!</td>' . "\r\n";
    16.             echo ' </tr>' . "\r\n";
    17.         } else {
    18.             echo ' <tr>' . "\r\n";
    19.             echo '  <td>' . $product_name . '</td>' . "\r\n";
    20.             echo ' </tr>' . "\r\n";
    21.         }
    22.     }
    23.     if ($upgrade_id != '') {
    24.         if ($date < $expiration_date) {
    25.             echo ' <tr>' . "\r\n";
    26.             echo '  <td>' . $upgrade_name . '</td>' . "\r\n";
    27.             echo ' </tr>' . "\r\n";
    28.         }
    29.     }
    30. }
    31. ?>
    32.  
    Все хорошо, но есть одно но. Каждый продукт вместе с обновлениями выводится в одной таблице, проблема с закрывающимся тегом </table>. Шаманил, но так и не понял, как организовать проверку, чтобы вывести его. Прошу помощи :)
     
  19. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    echo '<table>' . "\r\n"; выносишь до if-а, после list(
    echo '</table>' . "\r\n"; ставишь после последнего if-а, но до закрывающей фигурной скобки for-a
     
  20. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Gromo,
    спасибо, попробую, еще вопрос остался один, зачем в примере был заюзан left join? думал, думал, но так и не понял, нуллов вроде нет в таблице.
     
  21. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    1)
    Код (Text):
    1. if ($upgrade_id != '') {
    я бы заменил на
    Код (Text):
    1. if ($upgrade_id) {
    2) Закрывающий </table> надо выводить после $last_product_id = $product_id;
    Теперь реши как НЕ выводить закрывающий </table> в первый раз. =)

    Gromo
    Хрен!
    Тогда обновления не будут в той же таблице что и продукт от них. =))
     
  22. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    А ты сравни выборку с left join и с просто join. =))
     
  23. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Volt(220),
    намек понятен, погляжу :)
     
  24. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    Почему же? Хрен как хрен :)
     
  25. Mr. T

    Mr. T Активный пользователь

    С нами с:
    10 ноя 2010
    Сообщения:
    733
    Симпатии:
    0
    Адрес:
    Украина, г. Киев
    Volt(220),
    сразу затормозил, уже понял к чему тут left join. Спасибо за помощь.