在PHP中只有1个字符的foreach循环结果

时间:2009-08-28 20:44:22

标签: php foreach

你好我有这个foreach循环,它给出了奇怪的结果,它只显示了db记录的第一个字符

<?php
$result2 = mysql_query("SELECT id,fp_thumb,title FROM media") or die(mysql_error());
$data2 = mysql_fetch_array($result2) or die(Mysql_error());

foreach ($data2 as $val) {

  echo '<li><a href="media.php?id='.$val['id'].'"><img src="'.$val['fp_thumb'].'" alt="'.$val['title'].'" /></a></li>';
}
?>

这是我的数据库结构

SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for media
-- ----------------------------
CREATE TABLE `media` (
  `id` int(11) NOT NULL auto_increment,
  `thumb` varchar(500) NOT NULL,
  `url` varchar(500) NOT NULL,
  `fp_thumb` varchar(500) NOT NULL,
  `title` varchar(500) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records 
-- ----------------------------
INSERT INTO `media` VALUES ('1', '22', 'http://goeshere.com', '/images/slideshow/ctmbs.jpg', 'Test 1');
INSERT INTO `media` VALUES ('2', '2', 'http://goeshere1.com', '/images/slideshow/hitlex.jpg', 'test 2');
INSERT INTO `media` VALUES ('3', '3 ', 'http://goeshere2.com', '/images/slideshow/tsord.jpg', 'test 3');

任何信息都会有用 在此先感谢并欢呼^^

4 个答案:

答案 0 :(得分:4)

从代码中,我会说$data2代表数据库中1行的数据。

因此,它应该是$data2,其中包含您要显示的内容。

你的foreach循环没用:如果你想显示1行的数据,你可以直接使用$data2


如果你想逐行进行,你不能迭代$ data2,而是在mysql_fetch_array返回数据时循环。

这样的话,我会说:

$result2 = mysql_query("SELECT id,fp_thumb,title FROM media") or die(mysql_error());
while ($data2 = mysql_fetch_array($result2)) {
    echo '<li><a href="media.php?id='.$data2['id'].'"><img src="'.$data2['fp_thumb'].'" alt="'.$data2['title'].'" /></a></li>';
}

另外,你可能想要转义你输出的数据,以确保你没有任何类型的HTML / javascript注入 - 至少在src和title中,我会说;为此,您可以使用htmlspecialchars

那么你的回声可能看起来像这样:

echo '<li><a href="media.php?id='
    . $data2['id']
    . '"><img src="'
    . htmlspecialchars($data2['fp_thumb'])
    . '" alt="'
    . htmlspecialchars($data2['title'])
    . '" /></a></li>';

(我认为id是一个整数,自动递增或类似的东西,因此没有多大的风险)


看到其他答案的评论后进行修改

根据您的第一次使用:

$ data2是一个关联数组,如下所示:

array
  'id' => int 152
  'title' => string 'this is the title' (length=17)
  'fp_thumb' => string 'http://...../' (length=13)

这意味着foreach将循环三次,$ val将是:

int 152
string 'this is the title' (length=17)
string 'http://...../' (length=13)

(每次迭代一个值)

即,$ val不是数组是标量值。


当你这样做时:

$a = 152;
var_dump($a['id']);

你得到了

null

做的时候

$a = 'this is the title';
var_dump($a['id']);

你得到:

string 't' (length=1)

即,在字符串上使用数组访问时,您只获得第一个字符,并且键是一个字符串。


请注意,字符串上的数组访问使用数字键来访问数组中的一个字符:

$a = 'this is the title';
var_dump($a[3]);

得到你:

string 's' (length=1)


有关更多信息,请参阅有关字符串的手册页,尤其是String access and modification by character,其中说明:

  

字符串中的字符可能是   通过指定访问和修改   所需的零基偏移量   使用字符串后的字符   方阵数括号,如$ str [42]。   将字符串视为一个数组   用于此目的的字符。

并且:

  

非整数类型转换为   整数。

将'title'转换为整数得0;所以,你得到了字符串的第一个字符。


希望这会有所帮助,你理解“为什么”; - )

答案 1 :(得分:2)

我认为你要做的是:

$result2 = mysql_query("SELECT id,fp_thumb,title FROM media") or die(mysql_error());

while($data2 = mysql_fetch_array($result2)) {
    echo '<li><a href="media.php?id='.$data2['id'].'"><img src="'.$data2['fp_thumb'].'" alt="'.$data2['title'].'" /></a></li>';
}
?>

这将显示表格中的所有记录。那是你想要做的吗?

这里重要的一点是mysql_fetch_array只检索一条记录,你需要多次调用它来检索多条记录。当没有更多要记录的记录时,它最终会返回FALSE。

答案 2 :(得分:0)

您应该使用mysql_fetch_array迭代$ results,因为它只为每次调用获取一个结果:

while ($val = mysql_fetch_array($result2, MYSQL_ASSOC)) {
  echo '<li><a href="media.php?id='.$val['id'].'"><img src="'.$val['fp_thumb'].'" alt="'.$val['title'].'" /></a></li>';
}

答案 3 :(得分:0)

我遭受了同样的输出。后来发现了我做的错误。我之前已经将相同的变量初始化为字符串。使用新变量解决了问题。 在http://www.sitepoint.com/forums/showthread.php?259452-Only-outputting-first-character-of-array

上找到帮助