-1

我有以下代码:

function user_name($id) {
    $eqpt_name1 = $this->sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 1");
    $eqpt_name1_2 = $eqpt_name1->fetch();
    $name1 = $eqpt_name1_2['f_val'];

    $eqpt_name2 = $this->sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 2");
    $eqpt_name2_2 = $eqpt_name2->fetch();
    $name2 = $eqpt_name2_2['f_val'];

    $name3 = $name1 . " " . $name2;

    return $name3;
}

它所做的是获取提供的用户 ID ($id) 并获取用户的名字 ($name1) 和姓氏 ($name2),然后输出它。

我通过执行以下操作来调用它

$username = user_name($_SESSION['user_id']);

$_SESSION['user_id']1,例如。

当我手动将代码放入 PHP 文件时,它工作正常。但是当我使用一个函数以便可以在整个站点上全局使用它时,我不必在每个页面上都有那么长的查询代码,Apache 给了我这个错误:

PHP 致命错误:在非对象上调用成员函数 query()

我以前从来没有写过一个有查询的函数,也不知道我做错了什么。

4

2 回答 2

2

从你如何称呼它来看,这只是一个全局函数;$this不会被定义,所以你不能使用$this->sql. 如果您有一个名为 的全局变量$sql,请告诉 PHP 您正在使用它:

function user_name($id) {
    global $sql;

    $eqpt_name1 = $sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 1");
    $eqpt_name1_2 = $eqpt_name1->fetch();
    $name1 = $eqpt_name1_2['f_val'];

    $eqpt_name2 = $sql->query("SELECT `f_val` FROM `profiles` WHERE `u_id` = $id AND `f_id` = 2");
    $eqpt_name2_2 = $eqpt_name2->fetch();
    $name2 = $eqpt_name2_2['f_val'];

    $name3 = $name1 . " " . $name2;

    return $name3;
}

另外,您正在使用 PDO,那么为什么不使用准备好的语句呢?你也可以进一步简化一些事情:

function user_name($id) {
    global $sql;

    $query = $sql->prepare('SELECT `f_val` FROM `profiles` WHERE `u_id` = :id AND `f_id` IN (1, 2) ORDER BY `f_id`;');
    $query->execute(array(':id' => $id));

    return implode(' ', $query->fetchAll(PDO::FETCH_COLUMN));
}
于 2012-12-24T19:50:26.337 回答
0

构造$this->应该在对象内部使用以指示对“self”实例的引用。

函数内部没有$this。您可能使用作为 PDO 类实例的全局变量。您应该使用 $GLOBALS['varname'] 尽管 $this 或在您的函数中创建 PDO 的本地实例。

function name()
{
    $pdo = new PDO( /* args */ ); // or use a global one 
    //$pdo = $GLOBALS['pdo'];
    $statement = $pdo->sql->query( "SELECT `f_val` FROM `profiles` WHERE `u_id` = ".$pdo->quote( $id )." AND `f_id` = 1" );
    $statement->execute();
    return $statement->fetchColumn(); // return first column
}

还注意到你做了两个语句来连接一个名字。您可以将所有这些事情直接放入一个 SQL 查询中,以获取知识。

于 2012-12-24T20:11:37.100 回答