2013-05-02 134 views
2

好的,我看到一些類似的問題,但他們的例子都使用PHP類...我的不是。也許這就是問題所在?我不應該需要上課,因爲我的網站在這個時候非常簡單。PDO對象不在函數範圍內

無論如何,我正在嘗試使用PDO連接到MySQL數據庫。我在一個名爲config.php的文件中連接到數據庫,並在index.php中使用require_once()包含此文件。

我可以成功地從另一個名爲process.php的文件查詢數據庫,但問題在該文件中的函數內;看起來我的DBO對象超出了該功能的範圍。

下面是相關的代碼片段:

的index.php

require_once('./lib/config.php'); 

的config.php

// tested and connects fine  
$pdo = new PDO('mysql:host=' . $hostname . ';dbname=' . $dbname, $username, $password, array(
    PDO::ATTR_PERSISTENT => true 
)); 

process.php

<?php 
... 
// can call $pdo fine in this file outside of functions 
... 

function authenticate($u, $p) { 
    // can't call $pdo in here, error says $pdo is non-object 
    $que = $pdo->query('select user_id, user_pass from users where user_name = \'' . $u . '\' limit 1'); 
    ... 
} 

?> 

順便說一下,我使用的是PDO,因爲我有類似的問題mysqli,並試圖擺脫mysql,這顯然是貶值和泄氣。

編輯:我應該基於的回答,我在這個問題上得到了數首先澄清:我曾嘗試通$ PDO作爲一個參數去功能,隨着錯誤消息沒有運氣或改變。

解決方法:好的,顯然問題是我需要在我的process.php文件中添加require_once('config.php')。不知道爲什麼(當index.php首先運行時,是不是已經包含它了?)。然後,我成功地將$pdo作爲參數傳遞給我的功能,並且瞧。

+0

在您的身份驗證功能,'$ pdo'超出範圍。將其作爲參數傳入,或將其聲明爲全局。 – andrewsi 2013-05-02 15:36:15

+0

如果你確實需要,在你的函數內聲明它爲'global $ pdo;'。你最好通過它,或者把'authenticate'放在課堂上。 – Aleph 2013-05-02 15:36:28

+0

使用適當的類和對象,然後使用依賴注入。 – 2013-05-02 15:36:54

回答

3

那就是pretty basic PHP stuff。除非使用關鍵字global加載它們,否則函數內部的變量是局部變量。我想您是這樣的:

function authenticate(PDO $pdo, $u, $p) { 
    $que = $pdo->query('select user_id, user_pass from users where user_name = \'' . $u . '\' limit 1'); 
    //... 
} 

編輯:如果PHP聲稱$pdo不是一個對象,它不是一個對象,因此它並不真正的問題它是如何傳遞給函數。檢查變量的權利,你叫authenticate()前:

var_dump($pdo); 

沒有相關的代碼有沒有辦法說爲什麼。 (假設這是真的,new PDO成功。)

+0

是的。我會在這裏迴應將PDO對象傳遞給函數的方法(這被稱爲依賴注入)。它比在函數中使用'global'更清潔。 – 2013-05-02 15:39:48

+0

是的,請看我的編輯,對不起。首先應該澄清的是,傳遞'$ pdo'作爲參數是我嘗試的第一件事,但沒有成功。 – hannebaumsaway 2013-05-02 15:45:32

+0

感謝Alvaro,請參閱我的解決方案編輯。當本地需要(再次)config.php文件時,參數傳遞正如您所說的那樣工作。不知道爲什麼我不得不要求config.php兩次,但無論如何。 – hannebaumsaway 2013-05-02 16:01:16

0

你需要傳遞PDO對象作爲參數傳遞給authenticate()功能:

function authenticate(PDO $pdo, $u, $p) { 
    // ..as in the question.. 
} 

哦,你應該使用一個佔位符在查詢用戶名,而不是容易發生SQL注入攻擊的字符串連接。

+0

謝謝。你看到的查詢是爲了這個目的而被取消的,而不是我將在我的代碼中運行的實際查詢:)。別擔心,所有的東西都會在運行時被正確地轉義。 – hannebaumsaway 2013-05-02 15:46:40

0

因爲$pdo已被聲明在函數authenticate之外,所以它不在其中。你需要爲pass $ PDO在

function authenticate($u, $p, $pdo) { 
    $que = $pdo->query('...'); 
} 

或聲明它作爲函數內全球將能夠訪問它

function authenticate($u, $p) { 
    global $pdo; 
    $que = $pdo->query('...'); 
} 
+0

對不起,請參閱我的編輯。我曾嘗試將'$ pdo'作爲參數傳入,但沒有成功。 – hannebaumsaway 2013-05-02 15:45:56

+0

你不能僅僅通過'function authenticate($ u,$ p,$ pdo)'來傳遞它,你也必須在調用函數的時候這麼做。 '$ result = authenticate($ u,$ p,$ pdo)' – RMcLeod 2013-05-02 15:57:34

+0

我知道,我做了兩件。看到我的新編輯。問題在於缺少另一個'require_once()'調用來獲取數據庫連接。然後param傳遞工作。 – hannebaumsaway 2013-05-02 15:59:21

相關問題