2010-10-18 3 views
1

Я работаю над сайтом и создаю этот экспериментальный скрипт, который динамически заполняет меню категорий на основе записи в базе данных.Ошибка PHP-скрипта MySQL

Это работало целый день, а затем внезапно остановилось. Я изменил мой включает в себя для требует и он дал мне это сообщение об ошибке

Fatal error: Maximum execution time of 30 seconds exceeded in /home1/advertbo/public_html/dev_area/origocloud/include/views/blog/dbget.php on line 34

function getBlogMenu(){ 
$dbhost = 'localhost'; 
$dbuser = ' '; 
$dbpass = ' '; 

$con = mysql_connect($dbhost, $dbuser, $dbpass); 
if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

mysql_select_db("ado_ocblog", $con); 

$htmlString = ""; 

$result = mysql_query(
    "SELECT * 
    FROM subCat 
    JOIN headCat ON subCat.headid = headCat.id 
    ORDER BY headid ASC;"); 

$array = mysql_fetch_array($result); 
mysql_close($con); 

$pre = NULL; 
$hc = 0; 
$sc = 1; 
while ($array) { 
    if($pre == NULL){ 
     $pre = $row["headc"]; 
     $test[0][0]=$row["headc"]; 
     $test[0][1]=$row["subc"]; 

    } 
    else 
    { 
     if($pre ==$row["headc"]){ 
      $sc++; 
      $test[$hc][$sc] = $row["subc"]; 

     } 
     else 
     { 
      $hc++; 
      $sc = 1; 
      $test[$hc][0]=$row["headc"]; 
      $test[$hc][$sc]=$row["subc"]; 
      $pre = $row["headc"]; 
     } 
    } 

} 

foreach($test as $arrays=>$cat) 
{ 
     $first = TRUE; 
     foreach($cat as $element) 
     { 
      if($first == TRUE) 
      { 
       $htmlString.= '<h3><a href="">'.$element.'</a></h3> 
         <div> 
          <ul> 
        '; 
       $first = FALSE; 
      } 
      else 
      { 
       $htmlString.= '<li><a class="sub_menu" href="#">'.$element.'</a></li>'; 
      } 

     } 
     $htmlString.= '</ul> </div>'; 
} 
return $htmlString; 


} 

Я действительно застрял, страница просто держит таймаут точку, где я вызываю функцию

+2

while ($ array) <- вот оно. Не очень умная конструкция. Вы должны изучить некоторые основы PHP, см. Урок из школ w3c о том, как обрабатывать данные из базы данных mysql. –

ответ

6

Попробуйте это:

while ($array = mysql_fetch_array($result)) {} 

Посмотрите на PHP документы http://php.net/mysql_fetch_array

Если не делает работа, ваш SQL-запрос возвращает слишком много значений и craches Казни PHP

=]

+2

Андре прав. Вы принимаете задание '$ array = mysql_fetch_array ($ result)' из выражения while(). Вы не можете этого сделать, иначе $ array никогда не изменится, и вы никогда не выйдете из цикла while. –

+1

Я думаю, что это должно быть во время ($ row = mysql_fetch_array ($ result)) {...} - просто взгляд в цикле; $ array не используется. возможно, он смешивает некоторые примеры скриптов ...? – handfix

+0

Я использую $ array в цикле, спасибо за советы, ребята, PHP не мой сильный момент, я обязательно проверю ваши предложения. Должен ли я сосредоточиться на mysql_fetch_array в этом? Я видел несколько советов по stackoverflow, который предлагает использовать mysql_fetch_assoc в этих случаях, стоит ли проверять также? – Arturski

0

Я думаю, что пришло время сделать шаг назад и посмотреть на то, что вы делаете :) Эту функцию должны делать то, что вы хотите (даже если вы исправили проблему бесконечного цикла в функции, которую вы дали, я не думаю, что она будет действовать так, как вы этого хотите.):

function getBlogMenu(){ 
    $dbhost = 'localhost'; 
    $dbuser = ' '; 
    $dbpass = ' '; 

    $con = mysql_connect($dbhost, $dbuser, $dbpass); 
    if (!$con) 
    { 
    die('Could not connect: ' . mysql_error()); 
    } 

    mysql_select_db("ado_ocblog", $con); 

    $htmlString = ""; 
    $result = mysql_query(
     "SELECT * 
     FROM subCat 
     JOIN headCat ON subCat.headid = headCat.id 
     ORDER BY headid ASC;"); 

    // arrays can have strings as keys as well as numbers, 
    // and setting $some_array[] = 'value'; (note the empty brackets []) 
    // automatically appends 'value' to the end of $some_array, 
    // so you don't have to keep track of or increment indexes 
    while ($row = mysql_fetch_assoc($result)) 
    { 
    $test[$row["headc"]][] = $row["subc"]; 
    } 

    // don't close the connection until after we're done reading the rows 
    mysql_close($con); 

    // $test looks like: array('headc1' => array('subc1', 'subc2', 'sub3'), 'headc2' => array('subc4', 'subc5'), ...) 
    // so we step through each headc, and within that loop, step through each headc's array of subc's. 
    foreach($test as $headc => $subc_array) 
    { 
    $htmlString.= '<h3><a href="">'.$headc.'</a></h3><div><ul>'; 
    foreach($subc_array as $subc) 
    { 
     $htmlString.= '<li><a class="sub_menu" href="#">'.$subc.'</a></li>'; 
    } 
    $htmlString.= '</ul></div>'; 
    } 

    return $htmlString; 
} 
+0

i nitailly это было разделено на 2 php-файла, и я объединил их вместе в усилиях по устранению этой проблемы, чтобы иметь все это в одной части. функциональность работала в конце, но, как было предложено ранее, она начала сбой :) – Arturski

+0

Правильно, но я говорю: в примере, который вы дали, есть некоторые не очень хорошие методы программирования. Я пытался помочь вам не только в этой проблеме, но и в будущем :) – catgofire

Смежные вопросы