【问题标题】:Only one row returned in mysql data retrievalmysql数据检索只返回一行
【发布时间】:2010-10-18 20:14:50
【问题描述】:

首先,很抱歉这个问题太长了……但这让我很头疼。任何帮助都会被极大地接受。

我编写了以下函数来从 mysql 数据库返回数据:

function injuryTable()
{
    # get all players that are injured and their injuires...
    $sql = "SELECT players.id, players.injury_id, players.pname, injuries_date.name, start_date, end_date
            FROM players INNER JOIN injuries_date
            ON injury_id = injuries_date.id";

    $result = sqlQuery($sql);

    return $result;
}

sqlQuery函数如下:

function sqlQuery($sql)
{
    $products = array();
    $link = dbConnect('localhost', 'root', '', 'umarrr');
    $result = mysqli_query($link, $sql); 

    while ($row = mysqli_fetch_array($result))
    {
        $products[] = $row;        
    }

    #   return each row:
    return $products;
    #mysqli_close($link);
}

它都连接到数据库,一切正常。 但是,当我尝试遍历结果时:它只返回一行:

$injury_table = injuryTable();

// make it more readable:
foreach ($injury_table as $table);
{
    echo $table['pname'];
    echo $table['name'];
    echo $table['start_date'];
    echo $table['end_date'];
}

我上面写的sql语句在mysql查询浏览器中完美运行,有没有人知道这里可能是什么问题?

print_r($injury_table)的输出

Array ( [0] => Array ( [0] => 1 [id] => 1 [1] => 6 [injury_id] => 6 [2] => person [pname] => person [3] => wrist [name] => wrist [4] => 2008-11-21 [start_date] => 2008-11-21 [5] => 2010-11-11 [end_date] => 2010-11-11 ) [1] => Array ( [0] => 2 [id] => 2 [1] => 5 [injury_id] => 5 [2] => woman [pname] => woman [3] => neck [name] => neck [4] => 2009-11-12 [start_date] => 2009-11-12 [5] => 2010-09-09 [end_date] => 2010-09-09 ) [2] => Array ( [0] => 3 [id] => 3 [1] => 4 [injury_id] => 4 [2] => girl [pname] => girl [3] => groin [name] => groin [4] => 2010-11-27 [start_date] => 2010-11-27 [5] => 2010-12-01 [end_date] => 2010-12-01 ) [3] => Array ( [0] => 4 [id] => 4 [1] => 1 [injury_id] => 1 [2] => boy [pname] => boy [3] => achilles [name] => achilles [4] => 2010-02-01 [start_date] => 2010-02-01 [5] => 2010-03-23 [end_date] => 2010-03-23 ) [4] => Array ( [0] => 5 [id] => 5 [1] => 2 [injury_id] => 2 [2] => man [pname] => man [3] => toe [name] => toe [4] => 2010-01-01 [start_date] => 2010-01-01 [5] => 2010-02-02 [end_date] => 2010-02-02 ) )

【问题讨论】:

  • 只是为了进行完整性检查,1) 在 mysql 查询浏览器中运行相同的查询时,您会看到多行?和 2) foreach 循环仅显示 1 次迭代?在循环之前尝试print_r($injury_table) 看看它是什么样子
  • print_r 按原样返回所有内容...

标签: php mysql row


【解决方案1】:

需要检查的一些事项:

  1. 检查mysqli_query()的返回值。您假设查询成功,并且有太多的原因导致查询无法每次都检查失败。失败时将返回布尔值 FALSE。
  2. 如果您在脚本中执行许多查询,您将为每个查询打开一个新的连接句柄。默认情况下,这些不会是持久连接,因此您可能启动的任何事务都将在查询结果被使用后自动回滚。通常最好一次连接到数据库(如果您愿意,可以将句柄存储在 sqlQUery() 函数内的静态变量中并重用它。您想要(或需要)多个的情况并不多可以同时使用手柄,或者每次使用全新的闪亮清洁手柄。
  3. 您是否尝试过对在 while() 循环中检索到的行执行 print_r()/var_dump()?尝试吐出mysqli_num_rows() 以查看查询返回了多少 PHP 版本?
  4. 您是否在浏览器中查看结果?也许第一或第二结果行中的某些内容具有 HTML 标记(或浏览器解释的内容)作为 HTML 标记,并且正在“隐藏”输出。查看页面的源代码以确保它们确实没有被输出,而不仅仅是被隐藏。
  5. 最后,在安全方面,允许面向 Web 的应用程序以“root”身份连接到数据库是非常糟糕的做法。您的代码中的任何缺陷都会使数据库服务器对任何人都开放。创建一个具有完成工作所需的最少权限的帐户(可能仅插入/更新/选择/删除)并使用它而不是根帐户。即使您只是在私人服务器上玩这个,这也是一个好习惯。

【讨论】:

  • 5.是的,我只是在我的家庭服务器上捣乱,但感谢您的建议,你是对的。我现在正在浏览你的列表的其余部分^。
  • 好的,稍微清理一下转储后,看起来你正在构建一个两级数组。顶级数组只有一行([0]),其中包含另一个具有实际查询结果的数组。
【解决方案2】:

为什么每次调用都打开一个新的数据库连接?这是执行查询的一种非常低效的方式。我会将数据库连接作为参数传递,或者由于您使用的是 mysqli,因此只需将 $link 作为参数传递。

至于为什么你的代码不工作,我不知道,但你可以尝试一些基本的错误报告,如下:

$result = mysqli_query($link, $sql) or 
                 trigger_error('Query Failed: ' . mysqli_error($link));

我还将MYSQL_ASSOC 添加到获取函数中,因为您没有使用基于索引的数组,这将使您的脚本更有效率。

希望这对您有所帮助。

【讨论】:

    【解决方案3】:

    真的很糟糕(也许是侮辱性的)答案......

    foreach ($injury_table as $table);
    {
        echo $table['pname'];
        echo $table['name'];
        echo $table['start_date'];
        echo $table['end_date'];
        echo '<br/>'; // HTML new line
    }
    

    或者

    foreach ($injury_table as $table);
    {
        echo $table['pname'];
        echo $table['name'];
        echo $table['start_date'];
        echo $table['end_date'];
        echo "\n"; // Console new line
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2018-06-16
      • 2016-04-14
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 2021-03-30
      相关资源
      最近更新 更多