MySQL结果数组的最后一行分成奇怪的数组

时间:2013-04-16 11:55:02

标签: php mysql

我从MySQL数据库中抽取了一个包含4个字段的表:idpostcodeblacklist_reasonsignup_attempts

然后我输出以下类来处理它,$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行并设置$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() )循环,但在这个例子中我使用的是返回数组的类,而不是对象,我可以&# 39;弄清楚为什么会这样。

- 对问题的回答 -

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" }

3 个答案:

答案 0 :(得分:2)

<强>解决方案

显然,当您只使用一个结果执行查询时,您的Mysql对象会直接返回关联数组。因此,在只有一个页面的情况下,您应该直接避开foreach循环并打印出结果值。或者,您可以将$res声明为$page == 1中的单个值的数组:

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

为什么表现得那样

您的$res数组是具有成对键值的哈希值。这意味着foreach ($res as $a => $b)将迭代数组中的每个键(4个键= 4次),$b$a键对应的值。在您的情况下,$b始终是字符串,因此b[...]被视为从字符串中选择单个字符。 $v['id']例如转换为$v[0](因为(int) 'id' = 0),返回第一个字符。

答案 1 :(得分:2)

当您有多个行时,您的数据库类似乎返回了一个数组数组,但只有一行时,只返回一个unnested行。

所以在第一页上,foreach循环返回$ v中的一行,而最后一页只返回值,而不是循环遍历行本身。

如果在字符串上指定索引,则返回该位置的字符,因为文字“id”不是有效数字,而是转换为零(false),因此$v['id']实际上被视为{ {1}}并返回字符串的第一个字符。其他值也是如此。

如果您不能修改类以始终返回数组中的单行以保持一致性(这将是理想的解决方案),那么您需要检查是否已返回一行,然后自己嵌套结果。如果该类没有返回行计数的方法,那么您可以这样做:

$v[0]

答案 2 :(得分:1)

按照你想要的方式工作

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

否则你的foreach循环遍历列而不是行,这就是它变得混乱的原因。