【问题标题】:Displaying info from MySQL - from 2 different tables... Argh! Noob in trouble显示来自 MySQL 的信息 - 来自 2 个不同的表...啊!菜鸟有麻烦
【发布时间】:2017-08-14 01:48:41
【问题描述】:

我正在尝试从游戏服务器数据库中提取一些统计数据,并将它们返回到表格中。

我已经成功地完成了第一步——拉出 10 个结果,显示在 html 中的表格中,但是……下一位让我很难过……对于每个玩家,我想从另一个表格中获取一些信息。 ..

这是我目前所掌握的……请原谅乱码,我只是在学习!

// adding ALL info from the first 10 tables 'profile' based on humanity, ascending, to     the variable 'profile_info'

$profile_info = mysql_query("SELECT * FROM profile ORDER BY humanity desc LIMIT 10");

while($row = mysql_fetch_array($profile_info))
  {
// Below I add the players unique ID into the variable $unique, to be used later for         pulling their survival time from the 2nd table, which is called 'survivor' 

  $unique = $row['unique_id'];
  echo "<tr>";
  echo "<td class=\"c1\">" . $row['name'] . "</td>";
  echo "<td class=\"c2\">" . $row['humanity'] . "</td>";
  echo "<td class=\"c3\">" . $row['total_survivor_kills'] . "</td>";
  echo "<td class=\"c4\">" . $row['total_bandit_kills'] . "</td>";
  echo "<td class=\"c5\">" . $row['total_zombie_kills'] . "</td>";
  echo "<td class=\"c6\">" . $unique . "</td>";

//In the line below, I try to get data from the 2nd table (called survivor), checking   for the unique_id for the player (extracted from the first table, called 'profile') which is common across both tables and which have a 0 in the field 'is_dead'

 $result = mysql_query("SELECT * FROM `survivor` WHERE `unique_id` ='.$unique' AND     `is_dead` = 0") or die(mysql_error());

 echo $unique;

  if (mysql_num_rows($result)) {
    $survivors_survival_time = mysql_fetch_assoc($result);
      echo "<td class=\"c7\">" . $survivors_survival_time['survival_time'] . "</td>";

}

我希望,即使上面的代码可能是垃圾,你也能看到我在做什么?

大部分工作正常,只是我尝试从第二个表中获取玩家信息的部分,基于他们在第一个表中的行中的 unique_id,它不起作用:(

有什么想法,或者上面的内容太糟糕了,我应该放弃吗?

【问题讨论】:

  • +1 给它一个很好的尝试!

标签: php mysql html-table echo


【解决方案1】:

我相信您的查询中有一个拼写错误,它会在此处提取每个玩家的信息:

mysql_query("SELECT * FROM `survivor` WHERE `unique_id` ='.$unique' AND     `is_dead` = 0")

特别是unique_id = '.$unique' 部分,其中值字段中有一个额外的.。

尝试删除它以获得以下内容:

$result = mysql_query("SELECT * FROM `survivor` WHERE `unique_id`='$unique' AND `is_dead` = 0") or die(mysql_error());

当然,这是假设您没有在 survivor 表中的每个 unique_id 值前面添加 .。

旁注(不具体回答):
如果您要更新代码以使用 MySQLi 或 PDO 库而不是已弃用的 mysql_ 函数,您将能够使用准备好的语句。使用这些可以防止像上面提到的那样的小错误,并提供更安全的代码。

【讨论】:

  • 太棒了!上面的一点(去除多余的 .)奏效了!看,告诉你我是菜鸟!!!
  • 要点回复:您的旁注。恐怕我在学习的过程中几乎是在学习,因为我无论如何都不是程序员......但是现在这正在工作,我将研究 MySQLi 和 PDO 库,并准备好语句。恐怕这对我来说没有任何意义,但听起来如果我想在未来到达任何地方,我应该开始阅读:D
  • @MikeGracia 很高兴我能帮上忙!我肯定会建议您查看它们 - 您会在网络上找到很多很棒的参考资料,并且也可以在这里帮助他们。
【解决方案2】:

嵌套您的while 循环或阅读有关 mysql LEFT JOIN 的信息并更新您的查询。

【讨论】:

    【解决方案3】:

    我不了解 MySQL,因为我一直使用 MSSQL,但我会用 PHP 和 mssql 编写它:

    'SELECT * FROM survivor WHERE unique_id="'.$unique.'" AND is_dead = 0'
    

    试试看,然后告诉我 ;)

    【讨论】:

    • 您好,感谢您的帮助。第一个建议(上面)虽然有效,但再次感谢发布帮助:D
    【解决方案4】:

    您可以使用连接来组合这些查询:

    SELECT 
        * 
    FROM 
        profile AS p
    LEFT JOIN 
        survivor AS s ON p.unique_id = s.unique_id 
    WHERE 
        s.is_dead = 0
    ORDER BY 
        humanity DESC 
    LIMIT 
        10
    

    然后简单地循环结果。使用 LEFT JOIN 可以为您提供来自 profile 的所有结果以及 survivor 中的任何匹配项。如果您将其更改为 JOIN(即删除 LEFT),它将只为您提供在 profile 和 survivor 中存在匹配的行。

    几个建议:

    1. 明确说明您想要哪些列,即“SELECT name、human、survival_time 等...”而不是 SELECT *。
    2. 使用允许您使用预准备语句的查询方法,例如 PDO。
    3. 使用单引号而不是双引号,这样您就不必转义 HTML 输出中的所有双引号。任何阅读您的代码的人都会感谢您!

    【讨论】:

    • 戴夫,感谢您的帮助!我学的越多,我就越意识到我不知道 :D 哈哈哈。船上的积分,我会根据你和 newfurniturey 的回答来清理它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多