2013-04-16 56 views
0

我有一個表從MySQL數據庫正在制定4個領域:idpostcodeblacklist_reasonsignup_attempts最後一個MySQL結果數組的行闖入怪陣

然後我有以下類輸出和處理這個,$MySQL是一個MySQL類,ExecuteSQL返回一個數組,而不是MySQL資源。如預期

class Blacklist { 

private $MySQL = null; 
private $rowsPerPage = 6; 

public function __construct($MySQL) { 

    $this->MySQL = $MySQL; 

} 

public function displayBlacklistList($page = 1) { 

    ($page == 1) ? $start = 0 : $start = $this->rowsPerPage*($page-1); 

    $finish = $this->rowsPerPage;   

    $sql = "SELECT * FROM blacklist LIMIT $start, $finish"; 
    $res = $this->MySQL->ExecuteSQL($sql); 

    echo ' 
    <p><a href="#" class="btn btn-success">Add row</a></p> 
    <table class="table table-hover table-bordered table-striped"> 
     <thead> 
      <tr> 
       <th>ID</th> 
       <th>Postcode</th> 
       <th>Blacklist reason</th> 
       <th>Signup attempts</th> 
       <th>Actions</th> 
      </tr> 
     </thead> 
    <tbody>'; 

    foreach($res as $k => $v) { 
     echo ' 
     <tr> 
      <td>'.$v['id'].'</td> 
      <td>'.$v['postcode'].'</td> 
      <td>'.$v['blacklist_reason'].'</td> 
      <td>'.$v['signup_attempts'].'</td> 
      <td><a href="#" class="btn btn-primary">Edit</a> <a href="#" class="btn btn-danger">Remove</a></td> 
     </tr>'; 
    } 

    echo ' 
    </tbody> 
    </table>'; 

    echo $this->_displayPagination($page, $res); 
} 
} 

一切正常,並顯示除非我有,例如,6行中的DB,並設置$this->rowsPerPage = 5,因爲這將導致第二頁(顯示最後一個行)中循環,並顯示爲有儘可能多的行字段,每個單元格中的數據是預期結果的第一個字符。如果我在表10行顯示9每頁,同樣的情況,等

例如,我得到這個:

ID Postcode Blacklist reason Signup attempts 
7 7   7     7 
B B   B     B 
A A   A     A 
6 6   6     6 

當我期望:

ID Postcode Blacklist reason Signup attempts 
7 BH233SF  A reason   6 

的問題顯然與foreach()循環,我習慣於在這裏使用while(mysql_fetch_assoc())循環,但在這個例子中我使用返回數組的類,而不是對象,我不知道爲什麼會發生這種情況。

- 問題的答案 -

executeSQL返回關聯數組:

Array ([id] => 7 [postcode] => BH233SF [blacklist_reason] => A reason [signup_attempts] => 6) 

什麼它返回是好的,爲的var_dump也證明:

array(4) { ["id"]=> string(1) "7" ["postcode"]=> string(7) "BH233SF" ["blacklist_reason"]=> string(8) "A reason" ["signup_attempts"]=> string(1) "6" } 
+0

它顯示了..你試過'的var_dump($水庫)'每列的第一個字符? – BlitZ

+0

ExecuteSQL方法返回什麼? – bwoebi

+0

增加了額外的信息到問題的底部。謝謝。 – artparks

回答

1

去解決它,你想你應該有

array(
    0 => array(
     "id" => "7", 
     "postcode" => "BH233SF", 
     "blacklist_reason" => "A reason", 
     "signup_attempts" => "6") 
); 

否則你foreach遍歷列沒有迭代行的方式,這就是爲什麼它會混亂。

+0

是的,我認爲這是問題。 MySQL類只返回一個數組,如果它只有一個結果,而不是返回多行結果的多維數組。謝謝 - 讓我做更多的挖掘 – artparks

2

解決方案

顯然你的Mysql對象直接返回一個關聯數組,只有一個結果執行查詢。因此,在只有一個頁面的情況下,您應該直接避免foreach循環,並打印出結果值。或者你可以聲明$res是一個單一值的數組的情況下$page == 1

if ($page == 1) 
    $res = array($res); 

爲什麼有人表現得像是

$res陣列是成對的鍵值的哈希值。這意味着foreach ($res as $a => $b)將遍歷數組中具有$b的數組中的每個鍵(4個鍵= 4次)爲對應於$a鍵的值。在你的情況下,$b始終是一個字符串,因此b[...]被認爲是從字符串中選擇單個字符。例如,$v['id']被轉換爲$v[0](因爲(int) 'id' = 0),返回第一個字符。

+0

如果使用'foreach($ res作爲$ k => $ v)'或'foreach($ res作爲$ v),foreach循環中的$ v'具有完全相同的值'兩者之間的唯一區別是'$ k'這是價值的指數http://php.net/manual/en/control-structures.foreach.php – moranjk

+0

@moranjk,是的,你是對的。謝謝。 – Shoe

+0

感謝您的幫助,數組缺少維度是問題..我剛剛刪除了以不同格式返回結果的類的一部分,似乎比它的價值更麻煩。 – artparks

2

當你有多個行時,你的數據庫類似乎正在返回一個數組數組,但只有一個時,只有一個unnested行。

因此,在第一頁上,foreach循環返回$ v中的一行,而一個只有值的最終頁面則循環遍歷行本身。

如果指定它返回該位置的字符的字符串索引,因爲文字「身份證」是不是轉換到零(假)有效數字,所以$v['id']實際上被視爲$v[0],因此返回字符串的第一個字符。其他值也一樣。

如果您不能修改該類以始終返回數組中的單行以保持一致性(這將是理想的解決方案),那麼您需要檢查是否有一行已經返回,然後自己嵌套結果。如果類沒有返回再行計數的方式,你可以只是這樣做:

if (isset($res['id'])) 
    $res = array($res); 
+0

這可以將單個數組轉換爲多個數組,然而,我得到一個「未定義的抵消:0」的通知 - 任何想法我可以刪除這個? – artparks

+1

對不起,我忘了你只有一個關聯數組,所以當返回單行時沒有編號的元素。我更新了使用'isset($ res ['id'])''測試的答案。如果它不存在,這將錯誤而沒有任何錯誤,但如果它確實存在,那麼您知道它是單行數據而不是嵌套數組。 – Michael

+0

這就解釋了未定義的索引...謝謝! – artparks

相關問題