我有以下代码:
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()
我以前从未写过一个有查询的函数,不知道我做错了什么。
答案 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查询,仅用于知识。