1

我是一个初学者,并试图掌握 php。我遇到了一个似乎无法解决的语法错误。我将向您展示下面的代码以及我尝试过的一些修复。如果有人有另一个想法那就太好了。谢谢:)

$subject_set = mysql_query("SELECT * FROM subjects", $connection);
if(!$subject_set){
  die("Database query failed: " . mysql_error());
}

while($subject = mysql_fetch_array($subject_set)) {
  echo "<li> {$subject['menu_name']} </li>";
}

$page_set = mysql_query("SELECT * FROM pages WHERE id_subjects = {$subject["id"]}", $connection);
if(!$page_set){
  die("Database query failed: " . mysql_error());
}

echo "<ul class='pages'>";
while($page = mysql_fetch_array($page_set)) {
  echo "<li> {$page['menu_name']} </li>";
}
echo "</ul>";

我得到:数据库查询失败:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 " 附近使用正确的语法

我知道问题出在 {$subject["id"]} 因为我得到了内容并且当我输入“WHERE id_subjects = 1”时没有错误。我试过了:

{$subject['id']}
{$subject[\"id\"]}

但是得到了同样的错误......

4

4 回答 4

2

尝试

$page_set = mysql_query("SELECT * FROM pages WHERE id_subjects = '".$subject["id"]."'", $connection);
                if(!$page_set){
                    die("Database query failed: " . mysql_error());
                }

顺便提一句。你真的应该远离 mysql_* 函数。它们已被弃用,移至 PDO 或 mysqli_*,它们也更安全(您现在容易受到 sql 注入的攻击)

于 2012-05-23T14:42:45.680 回答
0

好吧,当 while 循环完成循环时,它将耗尽所有结果。$subject['id']不会有任何信息只是因为 $subject 不再有任何条目。

我猜您想首先列出所有主题,然后是每个主题下的所有页面。

使用 mySQL 不会很漂亮,但这就是您想要做的。(正如 Bono 所说,使用 PDO 或 mysqli,但这里有一个适用于 mySQL 的伪代码解决方案)。

loop through first query
    print subject name
    select pages using subject id
    loop through pages under that subject id
       print page names
于 2012-05-23T14:47:49.480 回答
0

如果你读回你的帖子,你可以清楚地看到这里出了什么问题。

"SELECT * FROM pages WHERE id_subjects = {$subject["id"]}"

如您所见,“id”未连接到其余部分。那是因为使用 " 你关闭了字符串。

要解决此问题,只需使用

"SELECT * FROM pages WHERE id_subjects = " . $subject["id"]

或者,如果您真的想将变量放在字符串中,您可以使用单引号字符串作为键:

"SELECT * FROM pages WHERE id_subjects = {$subject['id']}"

我个人是第一个解决方案的粉丝。但这只是我的观点。

于 2012-05-23T14:45:51.510 回答
0

在带引号的字符串中不需要任何引号,只需使用

"SELECT * FROM pages WHERE id_subjects = {$subject[id]}"
于 2012-05-23T14:51:16.477 回答