2013-04-30 57 views
1

我將我所有的mysql_ *升級到PDO。我可以處理簡單的SELECT和INSERT。但我有一個複雜的SELECT使用嵌套循環,我正在做一個狗的晚餐。我將發佈mysql_ *代碼,該代碼輸出第一列中的總計註冊量爲的兩列表格,A1級別的總註冊量爲,第二列括號內爲如何將複雜的mysql_ *重寫爲PDO?

------------------------- 
Smithsville : A1 |  | 
    10    | (7) | 
------------------------- 
Grange : A1  |  | 
    4    | (4) | 
------------------------- 
Beau Ridge : A1 |  | 
    23   | (16)| 
------------------------- 
Jonesboro : A1 |  | 
    9    | (9) | 
------------------------- 
Lexing : A1  |  | 
    3    | (1) | 
------------------------- 

在整個應用程序進一步表在頁面genertated對於其他級別。

$levels = array('A1', 'A2', 'B1', 'B2'); 

$centres = array('Smithsville', 'Grange', 'Plateau Ridge', 'Jonesboro', 'Lexing'); 

for ($j = 0; $j < 1; $j++) /* Does not loop; selects only A1 in queries below*/ 
    { 
     for ($k=0; $k<5; $k++) /* Cycles through the centres */ 
     { 
     $show_count = mysql_query("SELECT COUNT(Centre) 
              FROM exam 
        WHERE exam.Centre='".$centres[$k]."' 
        AND exam.Level='".$levels[$j]."'"); 

     $show_paid = mysql_query("SELECT COUNT(Centre) 
         FROM exam 
         JOIN personal 
         ON exam.P_ID=personal.P_ID 
         WHERE personal.Paid='1' 
         AND exam.Centre='".$centres[$k]."' 
         AND exam.Level='".$levels[$j]."'"); 


    $result_rows = mysql_num_rows($show_count); 

    $result_rows2 = mysql_num_rows($show_paid); 

     if ($result_rows == 0) 
      { echo 'No registrations';} 

       if ($result_rows2 == 0) 
      { echo 'No payments';} 


     echo '<table class="Font3White"> 
      <tr class="Title"> 
       <td class="width8">'.$centres[$k].' : '.$levels[$j].'</td> 
      <tr>'; 
while (($row = mysql_fetch_row($show_count)) && ($row2 = mysql_fetch_row($show_paid))) 
      { 
      foreach ($row as $key => $value) 
      { 
       echo '<td>'; 
       echo $value; 
        echo '</td>'; 
      } 

      foreach ($row2 as $key2 => $value2) 
      { 
        echo '<td> ('; 
       echo $value2; 
       echo ')</td>'; 
      } 

      echo '</tr>'; 
       } 
     echo '</table>'; 
      } 

     } 

我PDO嘗試

for ($j = 0; $j < 1; $j++) /* Does not loop; selects only A1 */ 
      { 
         for ($k=0; $k<5; $k++) /* Cycles through the centres */ 
        { 

      /*//////////////////////////*/ 
      /* Prepares statements */ 
      /*//////////////////////////*/ 

     $stmt1 = $db->query("SELECT COUNT(Centre) 
       FROM exam 
       WHERE exam.Centre=:centre 
       AND exam.Level=:level"); 

     $stmt2 = $db->query("SELECT COUNT(Centre) 
       FROM exam 
       JOIN personal 
       ON exam.P_ID=personal.P_ID 
        WHERE personal.Paid='1' 
       AND exam.Centre=:centre 
       AND exam.Level=:level"); 

     /*/////////////////////*/ 
     /* Binds parameters */ 
     /*/////////////////////*/ 

    $stmt1->bindParam(':centre', $centre, PDO::PARAM_STR); 
    $stmt1->bindParam(':level', $level, PDO::PARAM_STR); 

    $stmt2->bindParam(':centre', $centre, PDO::PARAM_STR); 
    $stmt2->bindParam(':level', $level, PDO::PARAM_STR); 



    /*//////////////////////////*/ 
    /* Executes statements */ 
    /*//////////////////////////*/ 

    $stmt1->execute(array($centre, $level)); 
    $stmt2->execute(array($centre, $level)); 


    echo '<table class="Font3White"> 
      <tr class="Title"> 
       <td class="width8">'.$centres[$k].' > '.$levels[$j].'</td> 
      <tr>'; 
    while (($row = $stmt1->fetch(PDO::FETCH_ASSOC)) && ($row2 = $stmt2->fetch(PDO::FETCH_ASSOC))) 
     { 
      foreach ($row as $key => $value) 
       { 
        echo '<td>'; 
        echo $value; 
         echo '</td>'; 
       } 

       foreach ($row2 as $key2 => $value2) 
       { 
         echo '<td> ('; 
        echo $value2; 
        echo ')</td>'; 
       } 
       echo '</tr>'; 
     } 
    echo '</table>'; 
     } 

    } 

我知道這是可怕的,但我希望它可以與合作。

+1

'$ stmt1->執行(陣列($中心,$級); $ stmt2->執行(陣列($中心,$級);'你在每行一個括號錯過這裏 – bwoebi 2013-04-30 15:30:15

+2

那些。 'select count(center),sum(paid = 1)etc ...' – 2013-04-30 15:34:39

+0

謝謝!我添加了括號但仍然不起作用 – Benjamin 2013-04-30 15:35:08

回答

1

我知道讓你成爲骯髒的工作是錯誤的,但就是這樣。

我對你的代碼做了一些修改,所以比較我的是你的。

希望它可以幫助你。

$levels = array('A1', 'A2', 'B1', 'B2'); 

$centres = array('Smithsville', 'Grange', 'Plateau Ridge', 'Jonesboro', 'Lexing'); 

foreach ($levels as $level) { 
    foreach ($centres as $centre) { 

     // As you said, PREPARE 
     $stmt1 = $db->prepare("SELECT COUNT(Centre) 
       FROM exam 
       WHERE exam.Centre=:centre 
       AND exam.Level=:level"); 

     $stmt2 = $db->prepare("SELECT COUNT(Centre) 
       FROM exam 
       JOIN personal 
       ON exam.P_ID=personal.P_ID 
        WHERE personal.Paid='1' 
       AND exam.Centre=:centre 
       AND exam.Level=:level"); 

     $stmt1->bindParam(':centre', $centre, PDO::PARAM_STR); 
     $stmt1->bindParam(':level', $level, PDO::PARAM_STR); 

     $stmt2->bindParam(':centre', $centre, PDO::PARAM_STR); 
     $stmt2->bindParam(':level', $level, PDO::PARAM_STR); 

     //You don't need to pass parameters here just on PDOStatement::bindParam 
     $stmt1->execute(); 
     $stmt2->execute(); 

     echo '<table class="Font3White"> 
      <tr class="Title"> 
       <td class="width8">' . $centre . ' > ' . $level . '</td> 
      <tr>'; 

     // Fetch stuffs 
     $row = $stmt1->fetch(PDO::FETCH_ASSOC); 
     $row2 = $stmt2->fetch(PDO::FETCH_ASSOC); 

     // Don't use while with PDOStatement::fetch, use fetchAll then foreach it. 
     if ($row && $row2) { 

      foreach ($row as $key /* <= Do you need it? */ => $value) { 
       echo '<td>'; 
       echo $value; 
       echo '</td>'; 
      } 

      foreach ($row2 as $key2 /* <= Do you need it? */ => $value2) { 
       echo '<td> ('; 
       echo $value2; 
       echo ')</td>'; 
      } 

      echo '</tr>'; 
     } 
     echo '</table>'; 
    } 
} 
+0

這太棒了!非常感謝。目前所有的值都是0,即使我把它連接到實時數據庫。一些調整,它應該顯示正確的數據。 – Benjamin 2013-04-30 16:26:13

+0

或者我可能有點樂觀!我提供的樣本數據有點簡化,目前有15箇中心,所以將$水平和$中心結合起來將不起作用。 – Benjamin 2013-04-30 16:34:03

+0

所以,我會編輯它以符合您的需求。 – 2013-04-30 16:34:50

0
  1. 您能告訴我們您如何設置$ center和$ level變量嗎?也許他們是數組,而不是字符串?如果它們是 - 你可能不得不創建新變量並從數組中賦值給它。就像這樣:

    $value_to_bind = $centres[$k];

  2. 執行不需要參數,如果你使用bindParam()。

  3. 我從來沒有試過用相同的參數名和綁定到它們的相同變量來運行2個查詢。也許這是一個問題?

+0

1.我認爲那裏有問題。在mysql_ *中,我以$ center [$ k]和$ levels [$ j]的形式從數組中獲取值。但我不知道如何獲得並傳遞PDO中的陣列位置 – Benjamin 2013-04-30 16:09:29

+0

@ user2304574只是在循環內創建新變量併爲其賦值。像這樣:'$ value_to_bind = $ centers [$ k]' – Kamil 2013-04-30 16:19:43