За последние 24 часа нас посетили 16803 программиста и 1644 робота. Сейчас ищут 899 программистов ...

Не работает цикл

Тема в разделе "PHP для новичков", создана пользователем Dmit, 7 авг 2020.

  1. Dmit

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

    С нами с:
    21 дек 2018
    Сообщения:
    16
    Симпатии:
    0
    Имеем таблицу БД с 15 столбцами. Задача - посчитать одинаковые значения в каждом столбце (данные в ячейке столбца принимать только одно из трех значений "П1", "X", "П2"). Если писать отдельный запрос к каждому столбцу - проблем нет, но вод код выходит очень длинный. Пробую выводить в цикле - просто белая страница, либо ругается на превышения лимита выполнения. Помогите, кто может.
    Это код запроса к базе, который нормально работает
    Код (Text):
    1. //Запрос по Событию №1
    2.  
    3. $result=$pdo->prepare("SELECT 1 FROM tasks WHERE m1=:m1");
    4. $result->execute(array(":m1" => "П1"));
    5. echo '<div id="m1P1">П1<span id="P1"> ', $result->rowCount(), '</span></div>';
    6.  
    7.  
    8. $result=$pdo->prepare("SELECT 1 FROM tasks WHERE m1=:m1");
    9. $result->execute(array(":m1" => "Х"));
    10. echo '<div id="m1X">Х<span id="X"> ', $result->rowCount(), '</span></div>';
    11.  
    12.  
    13. $result=$pdo->prepare("SELECT 1 FROM tasks WHERE m1=:m1");
    14. $result->execute(array(":m1" => "П2"));
    15. echo '<div id="m1P2">П2<span id="P2"> ', $result->rowCount(), '</span></div>';
    А это тоже, но в цикле. Но не работает.
    Код (Text):
    1.  
    2. for($a=1; $a++; $a<=15)
    3. $a='m'.$a;
    4. $result=$pdo->prepare("SELECT 1 FROM tasks WHERE $a=:$a");
    5. $result->execute(array($a => "П1"));
    6. echo '<div id="m1P1">П1<span id="P1"> ', $result->rowCount(), '</span></div>';
    7.  
    8. $result=$pdo->prepare("SELECT 1 FROM tasks WHERE $a=:$a");
    9. $result->execute(array($a => "Х"));
    10. echo '<div id="m1P1">Х<span id="P1"> ', $result->rowCount(), '</span></div>';
    11.  
    12. $result=$pdo->prepare("SELECT 1 FROM tasks WHERE $a=:$a");
    13. $result->execute(array($a => "П2"));
    14. echo '<div id="m1P1">П2<span id="P1"> ', $result->rowCount(), '</span></div>';
    15. ?>
     
    #1 Dmit, 7 авг 2020
    Последнее редактирование: 7 авг 2020
  2. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Например:
    Код (Text):
    1. select sum(if(m1='1',1,0)), sum(case m2 when '1' then 1 else 0 end) from tasks
     
  3. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Вот решение которое сократит ваш код в 3 раза :
    Код (Text):
    1. SELECT m2, COUNT(`m2`) AS `count` FROM testtable GROUP BY(`m2`)
     
  4. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    И по одному запросу на каждый из 15 столбцов :)
     
  5. nikolaevevge

    nikolaevevge Новичок

    С нами с:
    5 июл 2020
    Сообщения:
    15
    Симпатии:
    2
    Вы пишите for($a=1; $a++; $a<=15)
    Так нужно for($a=1; $a<=15; a++) потому что второй параметр условие а третий инкремент
     
  6. twim32

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

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Никак не красиво, согласен. Но 15 запросов лучше чем 45, верно?

    Я бы взял всё одним запросом и пыхом подсчитал. Или пересмотрел структуры таблиц в бд.
     
  7. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    В один можно уложиться. Если эти данные используются часто, то имеет смысл создать в базе представление.