如何修复 PHP 中的“Notice: Undefined variable”错误?

13

代码:

Function ShowDataPatient($idURL)
{
    $query =" select * from cmu_list_insurance,cmu_home,cmu_patient where cmu_home.home_id = (select home_id from cmu_patient where patient_hn like '%$idURL%')
                     AND cmu_patient.patient_hn like '%$idURL%'
                     AND cmu_list_insurance.patient_id like (select patient_id from cmu_patient where patient_hn like '%$idURL%') ";

    $result = pg_query($query) or die('Query failed: ' . pg_last_error());

    while ($row = pg_fetch_array($result))
    {
        $hn = $row["patient_hn"];
        $pid = $row["patient_id"];
        $datereg = $row["patient_date_register"];
        $prefix = $row["patient_prefix"];
        $fname = $row["patient_fname"];
        $lname = $row["patient_lname"];
        $age = $row["patient_age"];
        $sex = $row["patient_sex"];
    }
    return array($hn, $pid, $datereg, $prefix, $fname, $lname, $age, $sex);
}

错误:

Notice: Undefined variable: hn in C:\xampp\htdocs\...
Notice: Undefined variable: pid in C:\xampp\htdocs\...
Notice: Undefined variable: datereg in C:\xampp\htdocs\...
Notice: Undefined variable: prefix in C:\xampp\htdocs\...
Notice: Undefined variable: fname in C:\xampp\htdocs\...
Notice: Undefined variable: lname in C:\xampp\htdocs\...
Notice: Undefined variable: age in C:\xampp\htdocs\...
Notice: Undefined variable: sex in C:\xampp\htdocs\...

我该如何修复这个问题?


您没有进入while()块,因此在尝试返回它们时没有设置任何变量。 - fedorqui
没有获取到任何行,循环无法启动,如果找不到行,您可能需要返回。 - Fabio
如果您的查询没有返回任何结果,那么$row将不存在,随后您的本地变量副本也将未定义。因此,请检查查询语句。 - mario
我猜测你的查询没有按预期运行,而且你到达返回行时得到了未定义的变量。 - Mike Brant
看起来您只期望返回最多一行数据,因此您可以简单地使用 return pg_fetch_array($result) 并且摆脱所有变量。 - Dr. McKay
6个回答

26

在函数开始处定义变量,这样如果没有记录,变量就存在了,你就不会出现错误。检查返回的数组中是否有空值。

$hn = null;
$pid = null;
$datereg = null;
$prefix = null;
$fname = null;
$lname = null;
$age = null;
$sex = null;

完成此操作后,还有另一个查询,它选择先前填写的表单数据,并且这些数据必须在正确的部门标题下显示,因为有些人可能有多个部门。 - BRoebie
没关系,我已经解决了问题。问题出在我声明的查询语句上。 - BRoebie

10

在while循环之前声明它们。

$hn = "";
$pid = "";
$datereg = "";
$prefix = "";
$fname = "";
$lname = "";
$age = "";
$sex = "";

您收到此通知是因为变量在循环内部被声明和赋值。


4
我猜测你的查询结果并不符合预期,而且可能会在返回行时出现未定义的变量。此外,根据你的变量赋值方式,每次循环迭代都会覆盖相同的变量,因此你不会返回完整的结果集。
最后,返回数值键的结果集似乎有些奇怪,最好返回关联键的结果集。考虑仅命名SELECT中所需的字段并保留键分配。例如:
```ruby SELECT field1,field2 FROM table WHERE condition; ```
希望以上翻译能够满足您的要求。
Function ShowDataPatient($idURL){
       $query =" select * from cmu_list_insurance,cmu_home,cmu_patient where cmu_home.home_id = (select home_id from cmu_patient where patient_hn like '%$idURL%')
                 AND cmu_patient.patient_hn like '%$idURL%'
                 AND cmu_list_insurance.patient_id like (select patient_id from cmu_patient where patient_hn like '%$idURL%') ";

   $result = pg_query($query) or die('Query failed: ' . pg_last_error());

   $return = array();
   while ($row = pg_fetch_array($result)){
       $return[] = $row;
   }          

   return $return;
}

你可能还需要提出一个关于如何改进你的查询的问题,因为当前它的效率非常低。

是的,这更接近一个真正的答案。 - Peter Mortensen

4

你应该在 while 循环外初始化变量。在 while 循环外,它们当前没有作用域。你只是依靠 PHP 的良好特性来让这些值在循环外传递。

           $hn = "";
           $pid = "";
           $datereg = "";
           $prefix = "";
           $fname = "";
           $lname = "";
           $age = "";
           $sex = "";
           while (...){}

另外,看起来你只是希望返回单行数据。因此,你可以只写:

$row = pg_fetch_array($result);
if(!row) {
    return array();
}
$hn = $row["patient_hn"];
$pid = $row["patient_id"];
$datereg = $row["patient_date_register"];
$prefix = $row["patient_prefix"];
$fname = $row["patient_fname"];
$lname = $row["patient_lname"];
$age = $row["patient_age"];
$sex = $row["patient_sex"];

return array($hn,$pid,$datereg,$prefix,$fname,$lname,$age,$sex) ;

1

看起来您没有任何符合查询条件的记录,因此如果行数等于0,则应返回一个空数组(或null或其他内容)。


2
那可能是一条注释。 - Fabio
@Fabio 我回答了这个问题...? - Dr. McKay
1
不返回数组将避免这里的通知,但很可能只是将问题转移到更高的范围。 - mario

0

XAMPP。我猜你在使用MySQL

mysql_fetch_array($result);

确保 $result 不为空。


2
他很明显在使用Postgres。 - Dr. McKay
在示例代码中使用的pg_fetch_array()函数位于“PHP手册”→“函数参考”→“数据库扩展”→“供应商特定的数据库扩展”→“PostgreSQL”→“PostgreSQL函数”下。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接