2013-04-16 32 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

相关问题