在php中输入while循环时变量超出范围

时间:2010-09-15 23:35:04

标签: php scope while-loop

尝试在php中填充数组时遇到问题。看来,一旦我使用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);

$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”:[]}

谢谢。

3 个答案:

答案 0 :(得分:0)

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和其他必要的东西),并在客户端生成代码。这样可以加快页面加载速度,节省您和访问者的带宽。

答案 1 :(得分:0)

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

以上代码可以使用。

答案 2 :(得分:0)

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

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获得任何数据。