从数组显示数据时出现非法字符串偏移

时间:2015-05-12 20:37:34

标签: php mysql

我收到了以下代码:

<?php

require('connect.php');

if(isset($_GET['region'])) {
    $region = mysql_real_escape_string($_GET['region']);
    if ($region == "eu") {
        $rows = mysql_fetch_array(mysql_query("SELECT  * FROM `daily_leaderboard_eu`"));
    } elseif ($region == "na") {
        $rows = mysql_fetch_array(mysql_query("SELECT  * FROM `daily_leaderboard_na`"));
    }
} else {
    $rows = mysql_fetch_array(mysql_query("SELECT  * FROM `daily_leaderboard_eu`"));
}

?>

<table>
    <tr>
        <td>Rank</td>
        <td>Points</td>
    </tr>
    <tr>
        <?
            if(empty($rows)){
                echo '<td colspan="5">We are unable to provide data at the moment!</td>';
            } else {
                foreach($rows as $row){?>
                    <td><?=$row['rank']?></td>
                    <td><?=$row['points']?></td>
                <?}
            }
        ?>
    </tr>
</table>

代码应该获取整个daily_leaderboard_X表,然后将数据呈现在一个简单的表中。然而,由于我收到以下错误,它无法正常工作:

警告:第29行/home/bbb/public_html/pvp/index.php中的非法字符串偏移'排名' 5
警告:第30行/home/bbb/public_html/pvp/index.php中的非法字符串偏移'点' 5

图片:http://i.gyazo.com/b1ec034e7d0d906fb81c8175300f288c.png

有人可以指出我的错误以及如何解决它吗?

2 个答案:

答案 0 :(得分:1)

当你这样做时

$rows = mysql_fetch_array(mysql_query("SELECT  * FROM `daily_leaderboard_eu`"));

您正在从查询结果中选择一行。然后当你这样做

foreach($rows as $row){?>

您正在迭代行中的值。所以当你这样做时

$row['rank']

$row不是一个数组,它是一个字符串,所以PHP期待一个数字索引。这就是为什么你看到&#34;警告:非法字符串偏移&#34;。您可以通过将查询与提取分开来解决此问题,因此在顶部您只需

$rows = mysql_query("SELECT  * FROM `daily_leaderboard_eu`");

然后,您可以将foreach循环更改为while循环,并一次获取一行。

while ($row = mysql_fetch_array($rows)) {?>

然后$row实际上是一个数组并按预期工作。

答案 1 :(得分:0)

据说这里有一个错字:
         

哪里&#34;点&#34;和&#34;排名&#34;不正确的值。

这就是你避免这种麻烦的方法:

if(isset($_GET['region'])) {
  $region = mysql_real_escape_string($_GET['region']);
  if ($region == "eu") {
      $sql = "SELECT   `rank`,`points`  FROM `daily_leaderboard_eu`");
  } 
  elseif ($region == "na") {
      $sql = mysql_query("SELECT   `rank`,`points`  FROM `daily_leaderboard_na`");
  }
  else {
    $sql = "SELECT  `rank`,`points` FROM `daily_leaderboard_eu`");
  } 
  $results = mysql_query($sql);  
  $rows = mysql_num_rows($results);
  if($rows == 1)){
    echo '<p>We are unable to provide data at the moment!</p>';
  }
  else {
    echo '<table><tr><td>Rank</td><td>Points</td></tr><tr>';
    while($row = mysql_fetch_array($results,MYSQL_NUM));
       echo "<td>$row[0]</td><td>$row[1]</td>";
    }
    echo '</tr></table>';
  }
}