2011-01-08 22 views
1

我想獲得關於構建一些(基本)php代碼的建議。我應該去數據庫一次並獲取所有數據或兩次,並獲得我所需要的每一次

我需要顯示不同地方的表中的數據。需要在每個部分中顯示的行可以通過標誌來標識。

我不確定是否最好的方法是去數據庫一次,並將數據分成兩個變量,因爲我循環它或如果我應該去數據庫兩次,使用SQL來調用只我每次需要的數據。

對於那些誰希望看到它在代碼:

方法A:

// Create and execute a MySQL query 
function tasks_not_done(){ 
     // Open a PDO dtabase connection 
     $link = new PDO(DB_INFO, DB_USER, DB_PASS); 

     $sql = " SELECT title, created_date 
       FROM todos 
       WHERE list_id = ? AND checked = '0' 
       ORDER BY created_date DESC"; 
     $stmt = $link->prepare($sql); 
     $stmt->execute(array($_REQUEST['list_id'])); 

     // loop throught all the rows 
     while($row = $stmt->fetch()) { 
      $date = strtotime($row['created_date']); 
      $date = date('d/m/y' , $date); 
      echo '<div class="task">' . "\n"; 
      echo '<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n"; 
      echo '</div>'; 

      } 
     $stmt->closeCursor(); 
} 

方法B

function tasks_all(){ 
     // Open a PDO dtabase connection 
     $link = new PDO(DB_INFO, DB_USER, DB_PASS); 

     $sql = " SELECT title, created_date, checked 
       FROM todos 
       WHERE list_id = ? 
       ORDER BY created_date DESC"; 
     $stmt = $link->prepare($sql); 
     $stmt->execute(array($_REQUEST['list_id'])); 

     // loop throught all the rows 
     $tasks['not_done'] = ""; 
     $tasks['done'] = ""; 

     while($row = $stmt->fetch("FETCH_ASSOC")) { 
      $date = strtotime($row['created_date']); 
      $date = date('d/m/y' , $date); 

      if($row['checked'] =='0'){ 
       $tasks['not_done'] .= '<div class="task">' . "\n"; 
       $tasks['not_done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n"; 
       $tasks['not_done'] .='</div>'; 
       } elseif ($row['checked'] =='1') { 
       $tasks['done'] .= '<div class="task">' . "\n" . 
       $tasks['done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n"; 
       $tasks['done'] .='</div>'; 
       } 

      } 
     $stmt->closeCursor(); 
     return $tasks; 
} 

感謝

+0

你的方法都醜陋地獄。第一個意思是2串等於2個蛋的代碼。這在編碼風格方面是一個罪過。第二個稍微好一些,但仍然使用直接從業務邏輯回顯HTML的醜陋方法。數據庫連接在應用程序中的功能是無稽之談。等 – 2011-01-08 10:33:06

回答

4

這種問題沒有正確的答案,但我可以給你一些指導。

我的一般規則是:在需要時獲取所需的數據。但是有很多事情可能會影響到這一點。

  1. 你會一直使用這兩個查詢中的數據嗎?如果是的話,你應該全部在一個查詢中。如果從不,意味着他們互相排斥,答案是否定的。
  2. 如果您始終需要查詢1,並且有時需要查詢,則必須進行一些考慮。如果包含查詢2,查詢1是否需要更多時間?多長時間需要查詢2,幾乎總是或幾乎從不。
  3. 如果有人在同一時間更新數據會發生什麼情況。假設您同時獲得兩個數據,而其他人則更新影響查詢2的數據。這意味着您使用的是過時的數據。如果您在需要時獲取數據,則可能會得到正確的更新數據。
0

我看不到第二個查詢這裏,但你可能會使用JOIN來引入額外的數據。

例如,如果我有一個用戶表,和會員卡的表,但不是所有的客戶可能有會員卡,我可以這樣做:

SELECT c.CustomerID, c.CustomerName, l.LoyaltyCardType, l.LoyaltyCardBalance 
FROM Customers c 
    LEFT JOIN LoyaltyCardInformation l 
    ON c.CustomerID = l.CustomerID 

對於MySQL聯接語法是在這裏: http://dev.mysql.com/doc/refman/5.0/en/join.html

+0

所有的數據都在一個表中。其中一些標記爲checked = 1,一些checked = 2。我試圖弄清楚是否應該在一個查詢中全部得到它,並將其分離爲變量並在需要時使用它,或者如果我應該使用兩個查詢。 – ntc 2011-01-08 07:30:33

+0

如果這些值全部在一張表中,那麼是的,一定要立即全部獲取。唯一的例外(我能想到的)應該是如果它是一個BLOB或其他非常大的列,你只是偶爾使用它。 – 2011-01-08 10:24:45

-1

爲什麼不這樣做?

$sql = " SELECT title, created_date 
      FROM todos 
      WHERE list_id = ? AND checked = '$filterValue' 
      ORDER BY created_date DESC"; 
1

方法A是我的選擇。

我認爲菲內斯有一些最好的答案,到目前爲止,但這裏有一些其他的事情要考慮...

  1. 從我可以告訴你...代碼不是那麼複雜首先 - 你是否真的擔心這段代碼的性能?

  2. 利用他人的代碼通常會導致更好的性能,靈活性和長期可擴展性。少一些自己的代碼是件好事。如果您選擇將工作委託給數據庫,那麼您可以直接在其中進行大量優化,而不像您依賴自己的代碼。例如,將索引添加到要查詢的表中可能會比選擇要採用哪種編程路線更有用。

  3. 如果你仍然想知道絕對最有效的方法...爲什麼不時間/配置代碼?使用您自己的數據集使用具體指標而不是玩理論遊戲,查看哪種方法更快。

0

爲什麼不這樣做更優雅:

$sql = " SELECT title, created_date 
     FROM todos 
     WHERE list_id = ? AND checked = ? 
     ORDER BY created_date DESC"; 
$stmt = $link->prepare($sql); 

$stmt->execute(array($_REQUEST['list_id'], '0')); 
# do stuff 

# and later... 
$stmt->execute(array($_REQUEST['list_id'], '1')); 

這樣就避免了重複代碼和(取決於DB後端)應該快了。

相關問題