试图从mysqli的num_rows中获取非对象的属性

时间:2017-08-02 18:06:33

标签: php object mysqli

$conn = mysqli_connect($dbhost, $dbuser, $dbpass,$Database);
$sql="Select  from Tutorial_tbl where tutorial_title=".$tutorial_title;
$res=$conn->query($sql);

if($res->num_rows!=0){
    while($row=$res->fetch_assoc()){
      echo"<tr><td>".$row["tutorial_title"];#."</td><td>".$row["tutorial_author"]."</td><td>".$row["submission_date"]."</td></tr>";
    }
}
$conn->close();

为什么我收到此错误?

  

尝试获取非对象的属性

2 个答案:

答案 0 :(得分:1)

如果$tutorial_title的值是一个字符串必须是'',就像这个"SELECT * FROM Tutorial_tbl WHERE tutorial_title= '$tutorial_title'";一样,你的查询错了,它不是{{ 1}}但SELECT FROM,您的查询失败并且不构建对象,然后当您尝试访问SELECT * FROM字段时,PHP会抛出异常。

答案 1 :(得分:0)

  • 您要使用过程语法进行连接,然后使用面向对象的语法执行所有查询过程。选择一种样式并坚持使用-我建议始终使用OO。
  • 使用全部大写的mysql关键字将提高查询的可读性,并且通常是一种好习惯。
  • 您尚未在SELECT子句中声明三个目标列。 这是一个查询杀手。
  • $tutorial_title如果可信值(不是来自用户提交的值)且不能包含单引号,则应将其包装在单引号中。如果该值可能包含单引号或来自不安全的来源,则应使用带占位符和绑定变量的预处理语句。
  • 为帮助您进行调试,请检查查询是否有错误结果。 -除非要显示一条特殊消息,指出没有找到行,否则不需要对行进行计数。
  • while循环仅在有要迭代的内容时才会迭代,因此这是一个安全的调用。
  • 回显行中的;#仅会引起麻烦,将其删除。

我推荐/未使用的代码:

if (!$conn = new mysqli($dbhost, $dbuser, $dbpass, $Database)) {
    echo "connection error";  // $conn->connect_error;
} elseif (!$stmt = $conn->prepare("SELECT tutorial_title, tutorial_author, submission_date FROM Tutorial_tbl WHERE tutorial_title = ?")) {
    echo "query syntax error";  // $conn->error;
} elseif (!$stmt->bind_param("s", $tutorial_title) || !$stmt->execute() || !$stmt->bind_result($title, $author, $date)) {
    echo "statement error"; // $stmt->error;
} else {
    echo "<table>";
        echo "<tr><th>Title</th><th>Author</th><th>Date</th></tr>";
        while ($stmt->fetch()) {
            echo "<tr><td>$title</td><td>$author</td><td>$date</td></tr>";
        }
    echo "</table>";
    $stmt->close();  // optional
    $conn->close();  // optional
}

在上面的代码片段中,我在每一个地方都进行了虚假的条件检查,以启用简单的调试。我已注释掉错误函数,以便可以复制粘贴此代码。请注意,出于安全考虑,您绝不能向公众展示实际的错误消息。

当您确切知道要返回的列时,使用bind_result()非常方便-显示语法非常简洁。