【问题标题】:Trying to get property of non-object from mysqli's num_rows试图从 mysqli 的 num_rows 中获取非对象的属性
【发布时间】:2017-08-02 18:06:33
【问题描述】:
$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();

为什么会出现这个错误?

试图获取非对象的属性

【问题讨论】:

标签: php object mysqli


【解决方案1】:

如果$tutorial_title的值是一个字符串必须在''中,像这样"SELECT * FROM Tutorial_tbl WHERE tutorial_title= '$tutorial_title'";也是,你的查询是错误的,不是SELECT FROM而是SELECT * FROM,你的查询失败并且不构建对象那么当你尝试访问num_rows 字段时,PHP 会抛出一个异常。

【讨论】:

  • 但是您的回答没有任何反应。我之前忘记了*,但它不起作用
【解决方案2】:
  • 您正在使用过程语法进行连接,然后使用面向对象的语法执行所有查询过程。选择一种风格并坚持下去 - 我一直推荐 OO。
  • 对 mysql 关键字使用全部大写字母会提高查询的可读性,这通常是一种很好的做法。
  • 您尚未在 SELECT 子句中声明三个目标列。 这是一个查询杀手。
  • $tutorial_title 如果一个受信任的值(不是来自用户提交的)并且不可能包含单引号,则应该用单引号括起来。如果该值可能包含单引号或来自不安全的来源,则应使用带有占位符和绑定变量的预准备语句。
  • 为了帮助您进行调试,请检查查询中的错误结果。 - 除非您要显示一条表明未找到行的特殊消息,否则您无需计算行数。
  • while 循环只会在有要迭代的内容时进行迭代,所以这是一个安全的调用。
  • echo 行中的;# 只会造成麻烦,请将其删除。

我推荐/未经测试的代码:

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
}

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

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

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多