PHP函数内部的PDO查询问题

PHP函数内部的PDO查询问题,php,mysql,function,pdo,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 = $thi

我有以下代码:

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']);
例如,
$\u会话['user\u id']
1

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

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


我以前从来没有写过一个函数,其中包含一个查询,并且不确定我做错了什么。

从您如何调用它来判断,这只是一个全局函数<代码>$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));
}

构造$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查询中为knowleage执行所有这些操作。

您尝试过什么?什么不起作用?你做了什么研究来解决这个问题?您是否已在internet等上搜索错误消息?你发现了什么?是什么导致了其他人的错误?是什么解决了他们的问题?我确实四处看看了。所有其他的例子都是使用预先准备好的语句,我还没有掌握这一点。如果没有这个函数,并且在一个页面中硬编码这组代码,它工作得很好。不确定查询在函数中无法正常工作的原因。这不是查询或预处理语句的错误。是否尝试查找导致“在非对象上调用成员函数”错误的原因?是。显然,问题是我没有将$this(这是我的数据库)全球化。可能是仍在学习的准备语句的重复。所以我需要
f_id
1和2,因为1是名,2是姓。那么我会把OR改为AND吗?@JesseWilliamSzypulski:请看更新,您可以在中使用
。这一部分与PDO关系不大,与SQL关系更大;PDO部分是
:id
东西。它为ID定义了一个占位符,然后使用绑定到
$ID
:ID
执行查询。我尝试了您准备的语句。它起作用了。但出于某种原因,它返回的是最后一个。它把姓放了两次。你的修订解决了这个问题。非常感谢!:)