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

时间:2014-04-01 10:53:32

标签: php mysqli

我已经建立了一个用户注册广告的表格。提交广告的所有人都将成为该广告的所有者。所以现在我尝试通过提供所有者的用户名来获取与这些广告相关的所有信息。

我构建了这个功能:

function get_ad_info_by_username($username,$table_name) {

    $ad_info = array();
    $db = new mysqli("localhost", "root", "", "bazar-rooz") or die ('db connection issue!');
    $query = $db->query("SELECT * FROM `$table_name` WHERE `username` = '$username'");
    $db->query("set names 'UTF8'");
    if ($query->num_rows) { // here I get the error ... property of non-object
        while ($row = $query->fetch_object()) {
            $ad_info[] = $row;
        }
    }
    return $ad_info;
}

我在其他功能中使用相同的结构来获取不同的信息。它们工作正常,但是当我尝试运行页面向最终用户显示广告信息时,这个一直都会出错。

有什么问题。你能帮助我吗?我是PHP和MySQLi的新手

faintsignal:它实际上不是一个错误。它只是一个通知,但无论如何查询都没有返回任何行。它说:

  

注意:尝试获取非对象的属性   第261行第261行的C:\ wamp \ www \ site \ functions \ functions.php是   我在代码中注释了一行。

是的,我认为查询存在问题,但我找不到。

2 个答案:

答案 0 :(得分:1)

你正在使用mysqli错误的方式。用许多错误的方式说实话。

然而,与原始mysqli一样,它将需要太多的额外代码,我将向您展示使用PDO的正确方法。尽管如此,以下所有指南对于两个驱动因素都很常见:

  • 首先,仅连接到您的数据库一次,然后一直使用此唯一连接。
  • 然后你永远不应该使表名具有动态性。在查询中写下来
  • 另外,你应该使用占位符而不是直接在查询中添加变量
  • 最后但并非最不重要 - 您必须始终为启用的查询提供错误报告,这样可以减轻所有好撒玛利亚人的猜测。

在这里

$dsn = "mysql:host=localhost;dbname=bazar-rooz;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'root','', $opt);

function get_ad_info_by_username($username)
{
    global $pdo;
    $stmt = $pdo->prepare("SELECT * FROM table_name WHERE `username` = ?");
    $stmt->execute([$username]);
    return $stmt->fetchAll();
}
$ads = get_ad_info_by_username('joe');

答案 1 :(得分:-1)

可能是您传递给函数的表名

get_ad_info_by_username($username,$table_name)错误或数据库中不存在。

因为那个

$db->query("SELECT * FROM `$table_name` WHERE `username` = '$username'");

返回值FALSE,因此您收到错误/警告。