【问题标题】:PHP MySQL while loop not returning anythingPHP MySQL while循环不返回任何内容
【发布时间】:2011-05-25 06:21:57
【问题描述】:

我对 php 和 mysql 还很陌生,所以希望有更多经验的人能够在这里给我一些指导。

我有以下代码:

<?php

$npcname = $_GET['npcname'];
$npcinfo="SELECT * from npcs where name='$npcname'";
$npcinfo2=mysql_query($npcinfo) or die("could not get npc!");
$npcinfo3=mysql_fetch_array($npcinfo2);

$listquests = "SELECT * from quests where npcid = '$npcinfo3[npcid]'";
$listquests2 = mysql_query($listquests) or die("No Quests to list");
$listquests3=mysql_fetch_array($listquests2);

echo "<b>Quests Available for ".$npcname."</b><br>";

while($row=mysql_fetch_array($listquests2)) {

echo $row['name'];


}
?>

为此,我有一些看起来像这样的表格:

npcs
name|location|npcid

quests
name|qid|npcid

因此,任务通过 npcid 字段与 NPC 相关联。

我在每个表中都有一个条目。

Bob|Scrapyard|1
AND
Sort Scrap Metal|1|1

如您所见,任务和 Bob 共享 1 的 npcid。

在我的循环中,我试图列出 Bob 的所有任务。但是在运行代码时,我没有列出任何任务。

如果我输入代码:

  $listquests3['name'];

在我的循环之外,它按预期成功显示“Sort Scrap Metal”。我使用循环的原因是在添加多个任务时显示它们。

如果有人好心看看代码并告诉我我做错了什么,我将不胜感激。

谢谢。

【问题讨论】:

  • +1 用于为您的第一个项目(其中一个)制作涉及任务和 npc 的东西。
  • 示例代码易受SQL injection的攻击,这是一个非常严重的security risk。要修复这个漏洞,请从过时的 mysql 驱动程序切换到PDO 并使用prepared statements。如果您需要 PDO 教程,请尝试 "Writing MySQL Scripts with PHP and PDO"。您保存的站点可能只是您自己的。至于or die, don't use it when outputting HTMl
  • 确保您阅读了有关 joins 的信息,正如其他人所提到的。当一个人愿意时发出多个语句是低效的并且浪费资源。让数据库处理数据操作,让程序处理其他一切。最后,不要使用SELECT *;只选择您需要的列。
  • 感谢您的提示。我确实会阅读 PDO 文章并切换到联接以提高效率。

标签: php mysql database while-loop


【解决方案1】:

打印出 SQL 并针对您的数据库运行它以查看您得到的结果可能是个好主意。 看看这个,看起来可能只有一个结果在

$listquests3=mysql_fetch_array($listquests2);

线。由于没有更多结果,因此没有什么可循环的。

【讨论】:

  • 啊,非常感谢!我没有意识到,当我获取初始结果时,我会将其排除在进一步的获取之外。
【解决方案2】:

结果已经被获取,因为只有一个规则并且你在 $listquests3 中获取了它:)。如果您删除我认为的那条线,它将起作用。

【讨论】:

    【解决方案3】:

    您需要进行 INNER JOIN 或 LEFT JOIN。是的,再次仔细查看问题后,我发现在第一次执行“mysql_fetch_array()”代码时(就在“while”循环之前),变量“$listquests2”的值丢失了。所以“while”循环没有任何成果。

    您必须删除变量“$listquests3”的这一行。

    【讨论】:

    • 如果我给出了正确的答案,这个人(拒绝我的答案)可以纠正它吗?
    【解决方案4】:

    您只有一行,并且在您第一次调用 mysql_fetch_array 时获取了该行。当你第二次调用它时,结果集中没有更多的行要获取,函数返回 false 并且你的循环退出。

    【讨论】:

      【解决方案5】:

      这个语句:“$listquests3=mysql_fetch_array($listquests2);”已经拿到了第一个。 Sicne 你只有一个,没有什么要获取的,所以下一次调用 mysql_fetch_array 将不会返回任何内容。

      这应该可以解决问题,但是根据您自己的“经验”,这可能是开始学习 MySQL 连接(尤其是 LEFT JOIN)的好时机。您可以在互联网上轻松找到很多关于它的信息!

      【讨论】:

        猜你喜欢
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        • 2018-10-24
        • 1970-01-01
        • 1970-01-01
        • 2016-11-30
        • 2018-03-02
        • 1970-01-01
        相关资源
        最近更新 更多