如果显示错误为“试图获取非对象的属性”,如何识别代码中的非对象?

Posted

技术标签:

【中文标题】如果显示错误为“试图获取非对象的属性”,如何识别代码中的非对象?【英文标题】:how to identify which is a non-object in the code if it shows error as `trying to get property of non-object`? 【发布时间】:2017-01-22 23:56:21 【问题描述】:

对现有脚本进行一些修改后,我创建了一个错误:

注意:正在尝试获取非对象的属性...

我试图弄清楚如何识别变量 $result 是否是一个对象,所以我没有收到此错误(我在此特定行上收到错误 if ($result-> num_rows > 0) )。这里有什么:

<?php 
$sql = "SELECT * FROM input WHERE id =".$_GET["id"]; 
$result = mysqli_query ($conn,$sql);

if ($result-> num_rows > 0)  
    while($row -> $result->fetch_assoc())  
        $myid = $row["id"] ;
        $sql2 = "SELECT * FROM output WHERE question_id = $myid ORDER BY date DESC";
        $result2 = $conn->query($sql2);
        $sql3 = "SELECT COUNT(*) as rowCount FROM output WHERE question_id = '".$myid."'";

        $result3 = $conn->query($sql3);
        $rowCount= $result3->fetch_assoc();
?>

如何事先判断这是否是一个对象?

【问题讨论】:

我认为您已经以程序方式运行查询,并且以面向对象的方式获取数据是问题的原因。 $result 不是对象,因为您的查询失败,您需要调试它 作为一个小建议,不要在不清理或使用准备好的语句的情况下将 GET 参数连接到查询。搜索mysql注入 【参考方案1】:

首先,在此之前,您是否在代码中的任何位置初始化了变量$conn? 其次,你想让你的 while 循环像这样:while($row = $result-&gt;fetch_assoc()) ...

【讨论】:

"Yes" ,我在脚本中包含了 $conn。并且“不”将 -> 更改为 = 没有给出任何线索.. 猜猜发生了什么变化 -> if ($result-&gt; num_rows &gt; 0) 中的 = 使 num_rows 成为常​​数.. 我不确定,但它可能是 $result-> num_rows 之后的空间,以及关于 $result = $row->fetch_assoc() 我从这里得到的:php.net/manual/en/mysqli-result.fetch-assoc.php 之前我也这么认为,num_rows 前面的 $ 符号是否可能是原因,但它没有相反,我什至将 -> 更改为 =,但它有点为新错误留出了空间..跨度> 我建议调试你的代码,尝试在执行循环之前查看它包含的 $results 变量,就像在 $result = mysqli_query($conn,$sql) 之后注释掉所有代码,检查一下,看看你的代码哪里出了问题。【参考方案2】:

你可以使用查找内容是数组还是对象:

is_object() to find object 
is_array() to find array 

$sql = "SELECT * FROM compt WHERE id =1"; 
$result = mysqli_query ($conn,$sql);

if ($result->num_rows > 0)  
    while($row = $result->fetch_assoc())  

    
    

【讨论】:

你是什么意思,.. 我认为我的代码是一个对象。 我的意思是如何检查内容是数组还是对象。 ...在您上面的代码中,您犯了错误,这就是它给出错误的原因......它可能在 $result-> num_rows 使用这个........if ($result->num_rows > 0) while($row = $result->fetch_assoc()) 而不是 $row-> 在 while($row -> $result->fetch_assoc()) 处使用 '=' 你的意思是if ($result-&gt;num_rows &gt; 0) while($row = $result-&gt;fetch_assoc())

以上是关于如果显示错误为“试图获取非对象的属性”,如何识别代码中的非对象?的主要内容,如果未能解决你的问题,请参考以下文章

试图获取非对象的属性

Blade - 试图获取非对象的属性

我该如何解决“试图获取非对象的属性”

Laravel 5.6 - “试图获取非对象的属性”

如何修复“试图获取非对象的属性”Laravel 5

Laravel:试图获取非对象的属性