代码之家  ›  专栏  ›  技术社区  ›  Nikola Sivkov

PHP中foreach循环结果仅1个字符

  •  3
  • Nikola Sivkov  · 技术社区  · 17 年前

    你好,我有一个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 回复  |  直到 17 年前
        1
  •  4
  •   Pascal MARTIN    17 年前

    $data2 表示来自DB的1行数据。

    所以,应该是 $数据2 它包含您想要显示的内容。

    你的foreach循环是无用的:如果你想显示1行的数据,你可以使用 $数据2 直接。


    如果你想逐行执行,你不能迭代$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>';
    


    使用您最初使用的内容:

    $data2是一个关联数组,看起来像这样:

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

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

    (每次迭代一个值)


    当你这样做时:

    $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]。 为此目的的字符。

    非整数类型转换为 整数。


        2
  •  2
  •   Rob Knight    17 年前

    我认为你想做的是:

    $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。

        3
  •  0
  •   Zed    17 年前

    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>';
    }
    
        4
  •  0
  •   A B S    8 年前

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

    推荐文章