2009-08-28 60 views
3

你好,我有这样的foreach循环,让怪异的结果,它显示的第一个字符组成的数据库记录1个字符只有foreach循环结果在PHP

<?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

从代码中,我会说$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>'; 
} 

此外,您可能想逃离你的outputing的数据,以确保你没有任何类型的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]所述。 为此目的,可以将字符串看作为 个字符的数组。

和:

非整数类型被转换为 整数。

并转换 '标题' 的整数给出0;所以,你得到了字符串的第一个字符。


希望这有助于你理解“为什么” ;-)

+0

非常感谢您!这解释了很多! – Aviatrix 2009-08-28 21:15:20

+1

不客气:-)(我第一次遇到只有一个字符串的问题时,我也觉得很奇怪^^但是有一个完全理智的解释^^)玩得开心! – 2009-08-28 21:17:14

0

你应该遍历$结果与mysql_fetch_array因为它仅取一个RESU LT每个呼叫:

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>'; 
} 
+0

$ data2将是包含当前行数据的变量,而不是$ val =>这里不应该使用$ val来做回显,我会说 – 2009-08-28 20:50:38

+0

oops。复制粘贴的坏习惯。 – Zed 2009-08-28 20:52:05

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。

+0

然后,他应该使用$ data2做回显,而不是$ val(未在代码示例中的任何位置初始化) – 2009-08-28 20:49:56

+0

好点。编辑! – 2009-08-28 20:50:29

+0

好吧,我得到这个,但为什么每个不会工作?或者我该如何编辑它才能工作? (afcourse即时通讯将使用while循环,但是,这种奇怪的事情不会让我今晚睡) – Aviatrix 2009-08-28 20:54:50