【问题标题】:PHP retrieves the same row multiple times instead of retrieving all table's rowsPHP 多次检索同一行而不是检索所有表的行
【发布时间】:2014-11-16 16:39:16
【问题描述】:

我正在尝试以这种形式向管理员打印所有成员报告(投诉):

发件人姓名:...
被举报的用户名:...

首先我想直接从投诉表中选择每个发件人名称(使用for循环),然后找到匹配的报告用户名并以这种方式打印所有报告。 请注意,我没有将发件人姓名和报告的用户名保存在同一个表中,因此我需要执行 mysql join 才能找到报告的用户名。

<?php

$raw_results = mysql_query("SELECT * FROM complaint  "); 
$ln = mysql_num_rows($raw_results);

if($ln > 0){
$results = array();
$results = mysql_fetch_array($raw_results);

for($i=0;$i<$ln;$i++){

$SenderName = mysql_query("SELECT m_name FROM member  WHERE (`m_id`LIKE '".$results[1]."') "); 
$fetchA = mysql_fetch_array( $SenderName, MYSQL_ASSOC);
$ReportedUserId = mysql_query("SELECT r.d_id FROM ride r, complaint c WHERE  r.r_id= c.r_id"); 
$fetchB = mysql_fetch_array($ReportedUserId , MYSQL_ASSOC);
//Afer finding ID I use it to select name
$dname = mysql_query("SELECT m_name FROM member  WHERE (`m_id` LIKE '%".$fetchB['d_id']."%') "); 
$fetchDname = mysql_fetch_array($dname, MYSQL_ASSOC);?>

    <ul data-role="listview" data-divider-theme="d" data-inset="false">
            <li data-role="list-divider" role="heading">  

              <?php echo 'From:';  ?>
                <?php echo $fetchA['m_name'];  ?></li>

                 <li data-theme="c" >  
                   <?php echo 'Reported user Name: ';   ?>
                    <?php echo  $fetchDname['m_name'];  ?>

            </li>
            </ul>

我从这段代码得到的输出是表格投诉的第一行打印了多次 ($ln) 次,例如:

  • 纳达
  • 阿里
  • 纳达
  • 阿里
    ....直到 $ln

为什么我使用循环时它没有转到下一行? 我尝试了数据库中的查询,它可以工作,所以问题不是来自 db。 如果需要,我准备写更多细节:)

我的架构:

Member(m_id, m_name, ...etc)
Ride(r_id, p_id ....etc) *p_id refers to m_id
Complaint(c_id, d_id ..etc)*d_id refers to m_id
the idea is member reports member in a ride

【问题讨论】:

  • 您是否忘记关闭 For 循环的括号,或者您在此处复制粘贴时丢失了括号?
  • 因为你只在循环外调用mysql_fetch_array($raw_results)...!?
  • 不,只是在这里错过了
  • 你这样做真的很糟糕。我的猜测是,您可以通过将投诉表和乘车表加入到您的成员表中,通过单个查询获得您所追求的所有数据。暂时忘记 PHP 代码,然后返回查看查询。
  • @Najd 如果您编辑问题以更好地向您展示表架构和示例数据,我想您会是更好的查询建议,并且可以摆脱所有嵌套循环的废话。

标签: php html mysql loops data-retrieval


【解决方案1】:

在循环的第一行将 $results[1] 更改为 $results[$i]。

【讨论】:

    【解决方案2】:

    您没有迭代原始结果集。将 $results = mysql_fetch_array($raw_results); 移动到 for 循环内,您应该会开始看到所需的输出。

    不过,我想说的是,您可能希望考虑使用 JOIN 语句将您的一些逻辑卸载到您的数据库中。如果没有看到您的底层数据库架构就很难说,但是当一个能够检索您需要的数据时,进行多个数据库查询通常不是一个好主意。

    最后,mysql_fetch_array 语句已被弃用,因此您还应该考虑使用 PHP PDO 或 mysqli 扩展。

    【讨论】:

    • 我做了,它可以检索正确的发件人姓名,但报告的用户名没有改变。
    • 您需要在查询中添加 ReportedUserId 以包含类似AND c.sender_name = $SenderName 的内容。同样,如果没有看到您的底层数据库模式,很难确定。但是,要重新审视这个问题,您确实需要阅读有关连接数据库表的内容。它将使您的逻辑更简单,并且可能更快。换句话说,当迈克布兰特说你这样做的方式很糟糕时,他已经死定了。这是开始w3schools.com/sql/sql_join.asp 的好地方。 tutorialspoint.com/sql/sql-using-joins.htm
    • 感谢您的链接和完整的答案。
    【解决方案3】:

    啊,我确实找到了问题,谢谢 就是这样

    $name = mysql_query("SELECT m.m_name
    FROM member m
    INNER JOIN ride r
    on m.m_id = r.d_id
    INNER JOIN complaint c
    on r.r_id = c.r_id
     "); 
    

    现在我需要知道如何使用循环来解决它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2020-06-02
      • 2014-06-05
      • 2012-02-23
      • 2015-09-13
      相关资源
      最近更新 更多