PHP: mysql_fetch_array () в цикле while занимает слишком много времени - PullRequest
0 голосов
/ 04 мая 2009

Я создаю онлайн-календарь для клиента с использованием PHP / MySQL.

Я инициировал <table> и <tr>, и после этого у меня есть цикл while, который создает новый <td> для каждого дня, вплоть до максимального количества дней в месяце.

Строка после <td>, PHP ищет в базе данных MySQL любые события, происходящие в этот день, сравнивая значение $i (счетчик) со значением отформатированной метки времени Unix в этой строке базы данных. , Чтобы увеличить счетчик внутренней строки ТОЛЬКО при совпадении, я сделал еще один цикл while, который выбирает новый массив для результата. Это значительно замедляет время загрузки.

Вот код, сокращенный, чтобы вам не приходилось читать ненужные вещи:

$qry = "SELECT * FROM events WHERE author=\"$author\"";
$result = mysql_query($qry) or die(mysql_error());

$row = mysql_fetch_array($result);

for ($i = 1; $i <= $max_days; $i++) {

    echo "<td class=\"day\">";

    $rowunixdate_number = date("j", $row['unixdate']);

    if ($rowunixdate_number == $i) {
        while ($rowunixdate_number == $i) {
            $rowtitle = $row['title'];
            echo $rowtitle;
            $row = mysql_fetch_array($result);
            $rowunixdate_number = date("j", $row['unixdate']);
        }
    }

    echo "</td>";

    if (newWeek($day_count)) {
        echo "</tr><tr>";
    }
    $day_count++;

}

Ответы [ 4 ]

2 голосов
/ 04 мая 2009

Медлительность, скорее всего, связана с тем, что вы выполняете 31 запрос, вместо 1 запроса до вы строите таблицу HTML, как указывал Наэль Эль-Шава - если вы пытаетесь получить все предстоящие события для данного автора за месяц, вы должны выбрать это в одном запросе SQL, а затем выполнить итерацию по набору результатов, чтобы фактически сгенерировать таблицу. Э.Г.

$sql = "SELECT * FROM events WHERE author = '$author' ORDER BY xdate ASC";
$rsEvents = mysql_query($sql);
echo("<table><tr>");
while ($Event = mysql_fetch_array($rsEvents)) {
    echo("<td>[event info in $Event goes here]</td>");
}
echo("</tr></table>");

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

1 голос
/ 04 мая 2009

Кроме их комментариев выше, также попробуйте оптимизировать свой SQL-запрос, так как это один из наиболее распространенных источников проблем с производительностью.

допустим, у вас есть таблица новостной статьи с полями "Заголовок", "Дата", "Свернуть", "Содержимое", и вам нужно только извлечь заголовок и отобразить его в виде списка на HTML-странице,

, чтобы сделать " ВЫБРАТЬ * ИЗ ТАБЛИЦЫ " означает, что вам требуется, чтобы сервер базы данных извлекал все данные поля при выполнении цикла (включая Blurb и Content, которые вы не собираетесь использовать).

если вы оптимизируете что-то вроде:

" SELECT Title, Date FROM TABLE " будет извлекать только необходимые данные и будет более эффективным с точки зрения использования сервера.

Надеюсь, это поможет вам.

1 голос
/ 04 мая 2009

Запускали ли вы этот запрос в инструменте MySQL, чтобы узнать, сколько времени это займет?

Есть ли у вас индекс по столбцу автора?

В вашем PHP нет ничего плохого. Я подозреваю, что запрос является проблемой, а индекс не является причиной.

0 голосов
/ 04 мая 2009

Является ли 'author' идентификатором? или строка? В любом случае, индекс поможет вам.

Запрос не медленный, это цикл for, вызывающий проблему. Это не завершено; отсутствует условие цикла $ i и приращение. Или это опечатка?

Почему бы вам просто не заказать запрос по дате?

SELECT * FROM events WHERE author=? ORDER BY unixdate ASC

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

Предполагая, что дата является меткой времени Unix, которая не учитывает время события, вы можете сделать это:

$currentDate = 0;
while(mysql_fetch_array($result)){
    if($currentDate == $row['unixdate']){
         //code to present an event that is on the same day as the previous event
    }else{
        //code to present an even on a date that is past the previous event
        //you are sorting events by date in the query
    } 

    //update currentDate for next iteration
    $currentDate = $row['unixdate'];
}

если unixdate включает время события, то вам нужно добавить логику, чтобы просто извлечь временную карту даты unix, исключая часы и минуты.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...