2012-10-12 46 views
0

我有以下几块代码来完成以下几件事之一,最重要的是设置主循环,我们将从中抓取数据库内容(取决于条件)。PHP/MYSQL查询优化

这些条件是:我们是否正在查看某个类别 - 是否查看ID - 是否我们不查看(首页) - 管理员密码/用户名组合被使用(用于删除/编辑目的)。

$回复正在抓取(如果我们正在查看ID)所有具有被调用ID的PARENT的条目。 $ quickinfo用于设置meta标签(标题,关键字等)

我唯一的(当前)问题是:这是否有效?如果没有,为什么不。

$selection = "ID,CONTENT,IP,SUBJECT,CATEGORY,APPROVED,DATE,PARENT, 
       PASSWORD,USERNAME,THANKS,DISAPPROVE,IPS,BUMPS"; 

$id = strip_tags($id); 
$category = strip_tags($category); 
$threads = mysql_query("SELECT COUNT(*) FROM $board") or die(); 
list($threadsTotal) = mysql_fetch_row($threads); 
$threadsTotal_pages = ceil($threadsTotal/$POSTSPERPAGE); 
$threadsPage = intval(@$_GET["page"]); 

if (0 == $threadsPage) 
{ 
    $threadsPage = 1; 
} 

$threadsStart = $POSTSPERPAGE * ($threadsPage - 1); 
$threadsMax = $POSTSPERPAGE; 

if ($category > "" && $id == "" 
    && $passw != <ONE MISTAKE HERE> $adminPass 
    && $username != <ANOTHER MISTAKE HERE> $adminID) 
{ 
    $threads = mysql_query("SELECT $selection FROM $board WHERE PARENT=0 
          AND CATEGORY='$category' 
          ORDER BY ID DESC LIMIT $threadsStart, $threadsMax"); 
} 

if ($category == "" && $id == "" && 
    $passw !== <NOT EQAULS DOES NOT REQUIRE TWO EQUAL SIGNS AGAIN> 
    $adminPass && $username != <AND AGAIN> $adminID) 
{ 
    $threads = mysql_query("SELECT $selection FROM $board WHERE PARENT=0 
           ORDER BY ID DESC LIMIT $threadsStart, $threadsMax"); 
} 

// PLEASE CHECK THE NOT EQUALS FUTHER ON.... 

if ($id > "" && $passw != $adminPass && $username != $adminID) 
{ 
    $threads = mysql_query("SELECT $selection FROM $board WHERE PARENT=0 
          AND ID=$id LIMIT 1"); 

    $quickinfo = mysql_query("SELECT COUNT(*) FROM $board") or die(); 
    $quickinfo = mysql_query("SELECT ID,CONTENT,SUBJECT,CATEGORY,USERNAME FROM 
           $board WHERE PARENT=0 AND ID=$id LIMIT 1"); 

    $replies = mysql_query("SELECT COUNT(*) FROM $board") or die(); 
    $replies = mysql_query("SELECT $selection FROM $board WHERE PARENT=$id 
          ORDER BY ID ASC"); 

    while (list($ID, $CONTENT, $SUBJECT, $CATEGORY, $USERNAME) = 
      mysql_fetch_row($quickinfo)) 
    { 
     $threadID = $ID; 
     $threadContent = $CONTENT; 
     $threadSubject = $SUBJECT; 
     $threadCategory = $CATEGORY; 
     if ($USERNAME > "") 
     { 
      $threadAuthor = $USERNAME; 
     } 
     elseif ($USERNAME == "") 
     { 
      $threadAuthor = "Anonymous"; 
     } 
    } 

} // That is the end of your if 

if ($passw == $adminPass && $username == $adminID) 
{ 
    $threads = mysql_query("SELECT $selection FROM $board ORDER 
          BY APPROVED DESC LIMIT $threadsStart, 
                $threadsMax"); 
} 
+0

请使用空格键和一些战略输入键让代码更具可读性。即我可以读取它将使用水平滚动条。 –

+0

希望这比原来的要好一些。 – Matt

回答

1

Matt-重新格式化代码,同时也发现了,你使用 '!==' ' - !'

你也应该考虑使用库MySQLi或POD。用于PHP的mysql库已被弃用。

+0

PS:格式不完美。 –

+0

无论如何,当涉及到!==问题时,我可能会有点心不在焉。 (看看我的一些其他代码,在一些地方,我使用!=而在其他地方!==显示出来。) – Matt

+0

请注意一下,给出格式化和发现潜在问题的+1。 –

0

我想我看到一个问题。 我相信你真的想这样

if ($category > "" && $id == "" 
    && $passw != <ONE MISTAKE HERE> $adminPass 
    && $username != <ANOTHER MISTAKE HERE> $adminID) 

{

是这个

if ($category > "" && $id == "" 
    && ($passw != <ONE MISTAKE HERE> $adminPass 
    || $username != <ANOTHER MISTAKE HERE> $adminID)) 

{

或可能的话,你可能希望再||代替另一个& &,我不完全确定类别和ID的逻辑。

否则,您只会在页面上查询一次数据库,这似乎是一个非常高效的设置。

+0

由于我有一个管理员ID和管理员通行证的组合,我想确保两者都存在并且正确。否则,任何人都可以使用管理员ID作为登录凭据,它会说“哦,嗨,管理员,你想做什么?” 因此,在这种情况下,我们检查是否满足两个参数。现在,因为我已经有一个专门用于管理员/密码组合的循环,所以我想排除上面的那个循环(否则它会显示两次。) – Matt

+0

正确,所以这应该是如果两者不匹配,如果两者都不不要,所以或不,和? –