2010-03-11 102 views
0

什么是导致我的PHP代码冻结?我知道这是while循环的原因,但我有$ max_threads--;最后它不应该这样做。为什么我的PHP脚本被冻结?

<html> 
    <head> 
     <?php 
      $db = mysql_connect("host","name","pass") or die("Can't connect to host"); 
      mysql_select_db("dbname",$db) or die("Can't connect to DB"); 

      $sql_result = mysql_query("SELECT MAX(Thread) FROM test_posts", $db); 

      $rs = mysql_fetch_row($sql_result); 

      $max_threads = $rs[0]; 

      $board = $_GET['board']; 
     ?> 



    </head> 

    <body> 


     <?php 


      While($max_threads >= 0) 
      { 
       $sql_result = mysql_query("SELECT MIN(ID) FROM test_posts WHERE Thread=".$max_threads."", $db); 
       $rs = mysql_fetch_row($sql_result); 

       $sql_result = mysql_query("SELECT post FROM test_posts WHERE ID=".$rs[0]."", $db); 
       $post = mysql_fetch_row($sql_result); 

       $sql_result = mysql_query("SELECT name FROM test_posts WHERE ID=".$rs[0]."", $db); 
       $name = mysql_fetch_row($sql_result); 

       $sql_result = mysql_query("SELECT trip FROM test_posts WHERE ID=".$rs[0]."", $db); 
       $trip = mysql_fetch_row($sql_result); 

       if(!empty($post)) 
        echo'<div class="postbox"><h4>'.$name[0].'['.$trip[0].']</h4><hr />' . $post[0] . '<br /><hr />[<a href="http://prime.programming-designs.com/test_forum/viewthread.php?thread='.$max_threads.'">Reply</a>]</div>'; 

       $max_threads--; 
      } 

     ?> 
    </body> 
</html> 
+3

只是调试或回声$ max_threads的前后循环内进行确认或排除它导致问题的原因。 – 2010-03-11 17:06:55

+1

呃,两点建议你:1。使用'LIMIT'在SQL语句和2.不要做4'SELECT'那时你可以做一个。因为它的页面加载之前崩溃 – Felix 2010-03-11 17:08:44

+0

不能呼应max_threads的。 – William 2010-03-11 17:21:38

回答

1

我在想这是因为你每次循环触及sql数据库4次。有什么办法可以一次全部访问它,然后解析来自那里的传入数据?

$dbsql = 'SELECT * FROM my_database'; 
$result = mysql_query($dbsql); 

while($row = mysql_fetch_array($result)) { 
    // Parse information here, rather than 
    // accessing the database for individual variables... 
} 

就是这样的。

更新:

比我已经说过其他(和你被解雇)我看到的是一些在这里&有编码的怪癖:

这部分没有回音之间的空间和字符串。 'hr'元素没有起始括号。

echo '<div class="postbox"><h4>'.$name[0].'['.$trip[0].']</h4><hr>' . $post[0] . '<br /><hr />[<a href="http://prime.programming-designs.com/test_forum/viewthread.php?thread='.$max_threads.'">Reply</a>]</div>'; 

'while'不应该大写。

while($max_threads >= 0) 

同样,干净的代码是一个很好的开始,但这就是我亲身所见。最近我刚刚清理了自己的网站,这个网站正在崩溃IE(而没有其他浏览器),只是因为它有太多的标记错误。希望能帮助到你。

+0

也许这会在以后出现问题,但现在它只有两个线程完全冻结。 – William 2010-03-11 17:04:34

+2

@William:真的,这是一个问题,现在,即使它不是冻结的原因。当你只需要一个查询时发出4个查询是矫枉过正的,并且使代码更不可读。 – DisgruntledGoat 2010-03-11 17:10:31

+0

不,这不是一个问题,因为现在它并不重要,如果那该死的东西被冻结和加载页面的浏览器崩溃,咄。 – William 2010-03-11 17:21:10

0

也许你可以驱散调用在揭掉代码这个简单的功能:

function of($required) 
{ 
    $args = func_get_args(); 
    var_dump($args); 
    ob_flush(); 
    flush(); 
} 
of(__LINE__, $max_threads); 

您也可以使用这样的事情对于你的查询:

function mydb_query($query, $db = null) 
{ 
    $args = func_get_args(); 
    $result = call_user_func_array('mysql_query', $args); 
    if (!$result) { 
     of(array(__FUNCTION__), mysql_error(), $sql); 
     //return something else? 
    } 
    return $result; 
} 
$result = mydb_query("SELECT post, name, trip FROM test_posts WHERE ID = (SELECT MIN(ID) FROM test_posts WHERE Thread={$max_threads})", $db); 

您使用mysqli/PDO /框架支持准备好的陈述。

2

首先,我建议完全摆脱无关的HTML位。然后,逐行建立你的代码,看看你是否能找到违规行。因此,编写一个只连接到数据库的脚本,看看会发生什么。

如果发现例如,该代码...

<?php 
    $db = mysql_connect("host","name","pass") or die("Can't connect to host"); 
    mysql_select_db("dbname",$db) or die("Can't connect to DB"); 
?> 

...导致自身冻结,那么就可以很容易地与MySQL服务器的问题。

但是,如果浏览器本身崩溃,这听起来像你的系统,而不是东西,PHP或MySQL正在做的一个问题...

2

尝试,而不是那些1 +(4这1个SQL查询* N)查询:

SELECT MIN(ID), post, name, trip FROM test_posts GROUP BY Thread 

也许LIMIT 50(或任何最大线程数在年底返回),以及排名,这可能是大量的数据。

您可以通过while ($row = mysql_fetch_row($sql_result)) { /* echo(...); */ }来遍历此查询的结果而不是$max_threads和所有额外的数据库调用。

不知道这是究竟是是否与你想要获取但不知道更多关于数据(获取论坛中每个线程的根帖?)相同,但它应该非常接近。

(PS:如果这是一个线程化的2ch风格的论坛协议,我不确定这是一个理想的db设计,亲子adjacency list可能比维护每个线程的数量要好。 )

相关问题