PHP函数问题内的PDO查询

时间:2012-12-24 19:46:44

标签: php mysql function pdo

我有以下代码:

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)并获取用户的First($ name1)和Last($ name2)名称,然后将其输出。

我通过以下方式调用它

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

$_SESSION['user_id']1

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

  

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

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

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:0)

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

函数中没有 $ this 。您可能使用的是一个PDO类实例的全局变量。尽管是$ this,你应该使用$ GLOBALS ['varname']或者在你的函数中创建一个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查询,仅用于知识。