使用Inner Join和mysql_num_rows()总是返回1行

时间:2012-06-27 16:25:00

标签: php left-join mysql-num-rows

我查看了现有的主题。我已经解决了我的问题,但我知道它不是正确的解决方案,我更感兴趣的是让这项工作正确,而不是创建一个解决方法。

我有一个项目,我有3个表,诊断,访问和治疗。人们来看望,接受治疗,治疗就是诊断。

为了在页面上显示此信息,我想显示患者的诊断,然后显示他们来访的时间,然后可以点击访问信息以显示治疗信息。

要做到这一点,请在php中创建此函数:

<?
function returnTandV($dxid){
    include("db.info.php"); 
    $query = sprintf("SELECT treatments.*,visits.* FROM treatments LEFT JOIN visits ON
    treatments.tid = visits.tid WHERE treatments.dxid = '%s' ORDER BY visits.dos DESC",
    mysql_real_escape_string($dxid));

    $result = mysql_query($query) or die("Failed because: ".mysql_error()); 
    $num = mysql_num_rows($result);
    for($i = 0; $i <= $num; ++$i) {
        $v[$i] = mysql_fetch_array($result MYSQL_ASSOC);
        ++$i;
    }

    return $v;
}
?>

该功能有效,并将显示我想要的内容,即处理和访问的所有行为1个大型关联。数组问题是它总是返回比实际数据库中少一行的行,我不知道为什么。总共有3行,但msql_num_rows()只显示为2.我的工作只是添加1 ($num = mysql_num_rows($result)+1;)但我宁愿让它正确。

3 个答案:

答案 0 :(得分:2)

这部分看起来很可疑:

for($i = 0; $i <= $num; ++$i) {
    $v[$i] = mysql_fetch_array($result MYSQL_ASSOC);
    ++$i;
}
  1. 您正在递增i两次
  2. 当您最有可能$i <= $num
  3. 时,您将前往$i < $num

    这种组合可能是您获得意外结果的原因。基本上,你有三行,但你只需要第0行和第2行(跳过第1行)。

答案 1 :(得分:0)

程序员总是从0开始计数。所以,你从0开始循环。如果从2结束,你已经达到3行。

Row0,Row1,Row2。

答案 2 :(得分:0)

如果$ i = 0,并且你将它增加 BEFORE 向数组中添加内容,则跳过第一行。增加$ i循环运行后从0(第一个键)开始。

for循环对此不利:而是:

$query=mysql_query('  --mysql ---  ');


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

$v[]=$row["dbcolumn"];

}

为你的函数返回$ v then.compact和neat。你可以创建一个关联数组,只要键名是唯一的(如主要ID).. $ v [“$ priid”] = $ row [1];