2012-12-24 96 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查詢中,以獲取知識。