【问题标题】:Variable out of scope when entering a while loop in php在php中进入while循环时变量超出范围
【发布时间】:2010-09-15 23:35:03
【问题描述】:

尝试在 php.ini 中填充数组时遇到问题。似乎一旦我使用 mysql_fetch_assoc 方法进入 while 循环,我就无法填充我的数组。我已经包含了下面的代码。

$params = $_REQUEST['params'];

$arr["status"]="ok";
$projects=array();
$files=array();
$titles=array();

$query = 'SELECT p.id as pid, f.fname as name, f.title FROM proj p INNER JOIN pic f ON f.projid=p.id WHERE p.catid=\'' . $params['category'] . '\' ORDER BY p.ordr, f.ordr';

require("../php/connect.php");

//select all projects from chosen category and pics from selected projects
$proj_result = mysql_query($query) or die ("Select failed");

//populate from rows
while($row = mysql_fetch_assoc($proj_result)){  
    $projects[]=$row["pid"];
    $files[]=$row["name"];
    $titles[]=$row["title"];
}

$arr["projects"]=$projects;
$arr["files"]=$files;
$arr["titles"]=$titles;

echo json_encode($arr);

结果:{"status":"ok","projects":[],"files":[],"titles":[]}

谢谢。

【问题讨论】:

  • 应该,while 循环不会在 PHP 中打开它自己的范围。您确定$proj_result 中有任何行(注释掉的mysql_num_rows()
  • 那么,$i 是做什么的?您在每次 while 循环迭代时将其设置为零。
  • 你应该解决这个问题 if($i=0){ 应该是 if($i==0){
  • mysql_num_rows() 是我计划稍后实施(暂时删除)的东西,感谢您指出这一点。我已将 $i=0 固定为 $i==0。这是循环中的第一次运行,在 html 中具有缩略图 img 将用于精美的盒子画廊。
  • 在您完成查询后尝试添加var_dump(mysql_num_rows($proj_result)) 并告诉我们您得到了什么。

标签: php scope while-loop


【解决方案1】:

while 循环不会创建新范围,如您在此处所见:http://codepad.org/H1U3wXZD
关于代码本身,这里有一些建议:

0) 我会考虑拥有一个数据库抽象层(PDO 就足够了)。

1) 了解如何使用JOIN。看起来您可以通过单个查询获取所有必要的信息,例如:

    SELECT p.id, p.proj, c.id, c.fname, c.title 
      FROM proj p 
INNER JOIN pic c ON c.projid=p.id 
     WHERE catid='<your category>' 
  ORDER BY p.ordr, c.ordr

2) 您应该将从 db 获取数据的代码与构造 HTML (?) 的代码分开。也许你可以把它放在另一种方法中。比如:

if ($cmd == 'catSelect') {
    $data = getData($params['category']);

    foreach ($data as $value) {
        // process data here
    }
}

3) 我认为您正在使用生成的 JSON 通过 AJAX 将其发送到客户端。在那种情况下,我会完全减少脂肪(例如:生成的标记)并只发送必需品(图片 id、标题、fname 和其他任何必需的东西)并在客户端生成代码。这将使您的页面加载速度更快,并为您和您的访问者节省带宽。

【讨论】:

  • 有意在每次返回外循环时将 $i 重置为 0 以生成缩略图。感谢您在顶部指出我的分配错误:S 我应该将其移至 if 范围。
  • @Adgezaza 我明白了,缩进欺骗了我。这仍然是非常丑陋的代码 IMO。让我更新我的答案。
  • 我知道 while 循环不应该存在范围问题,这就是我被卡住的原因。还有其他原因导致这种情况发生吗? MySql 中有什么可以破坏代码的吗?但我没有像之前那样收到任何失败选择警告。
  • 哦,刚刚看到您的最新回复。我会试试看。
  • 接受了您的建议,但同样的问题,这是我得到的回复。 {"status":"ok","projects":[],"files":[],"titles":[]} 我已经在后端测试了该语句,它似乎工作正常。发布新代码。
【解决方案2】:

我的 jquery/ajax 客户端脚本没有正确发送类别,因此没有选择任何行。

上面的代码可以工作。

【讨论】:

    【解决方案3】:

    在循环中尝试这样的事情:

    while($row = mysql_fetch_assoc($proj_result)){  
        $projects[]=$row["pid"];
        $files[]=$row["name"];
        $titles[]=$row["title"];
    
        echo $row["pid"]." -- ".$row["name"]." -- ".$row["title"]."\n";
    }
    

    你有什么收获吗?一旦你尝试过,我们就会从那里拿走它。我的猜测是您没有从 MySQL 获取任何数据。

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 2013-08-14
      • 1970-01-01
      • 2011-11-12
      • 2023-03-08
      相关资源
      最近更新 更多