【问题标题】:1 character only foreach loop result in PHPPHP 中只有 1 个字符的 foreach 循环结果
【发布时间】:2009-08-28 20:44:22
【问题描述】:

你好,我有这个 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');

任何信息都会有用 提前感谢和欢呼^^

【问题讨论】:

    标签: php foreach


    【解决方案1】:

    从代码中,我会说$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 和标题中,我会说;为此,您可以使用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 将循环 3 次,而 $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 ;所以,你得到了字符串的第一个字符。


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

    【讨论】:

    • 非常感谢!这解释了很多!
    • 不客气 :-) (我第一次遇到只获取字符串的一个字符的问题,这对我来说也很奇怪^^但是有一个完全理智的解释^^ ) 玩得开心!
    【解决方案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。

    【讨论】:

    • 那么,他应该使用 $data2 来做回显,而不是 $val(在你的代码示例中的任何地方都没有初始化)
    • 好的,我明白了,但为什么每个都行不通?或者我该如何编辑它才能工作? (当然我要使用while循环但是,这个奇怪的东西今晚不会让我睡觉)
    • mysql_fetch_array() 一次只返回一行,而不是整个查询结果作为一个大的多维数组
    【解决方案3】:

    您应该使用 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>';
    }
    

    【讨论】:

    • $data2 将是包含当前行数据的变量,而不是 $val => 这里不应该使用 $val 来做回显,我会说
    • 哎呀。复制粘贴的坏习惯。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 2021-09-24
      • 2015-09-18
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多