我从MySQL数据库中抽取了一个包含4个字段的表:id
,postcode
,blacklist_reason
,signup_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" }
答案 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
循环遍历列而不是行,这就是它变得混乱的原因。