2012-12-24 81 views
-1

我有以下代码:PHP函数问题中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),并获取第一个($名1)和去年($名2)名称然后输出它。

我通过执行以下操作

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

$_SESSION['user_id']1,例如调用它。

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

PHP Fatal error: Call to a member function query() on a non-object

我没写过一个函数,它有一个查询之前,不知道我做错了什么。

+0

你试过了什么?什么都没有奏效?你已经做了什么研究来解决这个问题?你是否在互联网上搜索了这条错误消息?你发现了什么?什么导致了他人的错误?什么解决了他们的问题 – Charles

+0

我确实环顾四周。所有其他的例子都使用了准备好的语句,我还没有掌握它。没有这个功能,并且在一个页面中对这组代码进行硬编码就可以正常工作。不知道为什么查询在函数中无法正常工作。 –

+0

这不是您的查询或准备好的语句错误。您是否尝试寻找导致“调用成员函数...在非对象”错误的原因? – Charles

回答

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)); 
} 
+0

仍在学习准备好的陈述所以我需要'f_id' 1和2,因为1是名字,2是姓。所以我会将OR更改为AND? –

+0

@JesseWilliamSzypulski:看到更新,你可以使用'IN'。这部分与PDO有关,与SQL有关更多; PDO部分是':id'的东西。它为ID定义了一个占位符,然后使用绑定到'$ id'的':id'执行查询。 – Ryan

+0

我试过你准备好的声明。有用。但由于某种原因,它返回第一个最后。它的名字是两次。 –

0

将构建$这个 - >应内物体用于指示“自我”的实例引用。

有没有$这里面的一个函数。您可能使用了一个全局变量,它是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查询中,以获取知识。