2017-03-28 62 views
0

我有一個index.php文件是這樣的:PDO變量是在MySQL的函數未定義

require_once("../resources/config.php"); 
require_once(LIBRARY_PATH . "/mysql.php"); 
... 
if(checkIfMailExists($email)) { 
    $error = true; 
    $errormsg = "This e-mail is already in use!"; 
} 

mysql.php是:

try { 
    $pdo = new PDO('mysql:host=' . $config['db']['db1']['host'] . ';dbname=' . $config['db']['db1']['dbname'], $config['db']['db1']['username'], $config['db']['db1']['password']); 
}catch(PDOException $e){ 
    echo "Cant connect to mysql DB!"; 
} 

function checkIfMailExists($email) { 
    $query = "SELECT * FROM users WHERE email = '".$email."'"; 
    $num = $pdo->query($query); 
    if($num->rowCount() > 0){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

而且它的出現,從功能$ PDO是未定義。即使我刪除try-catch。 我固定它的唯一方法 - 我發送$ pdo作爲函數的參數,但它似乎是錯誤的。任何建議傢伙?

+2

[作用域範圍](http://php.net/manual/en/language.variables.scope.php)。 – aynber

回答

0

發送PDO連接作爲參數實際上是這樣做的唯一理智的方式。這的確是很好的瞭解,您可以使用global關鍵字,但編寫的代碼,可以保持被明確地說明依賴的最佳方式,並type-hinting他們

function mailExists (PDO $pdo, $email) { 
    $sql = 'SELECT * FROM users WHERE email = :email'; 
    $stmt = $pdo->prepare($sql); 
    $stmt->bindValue(':email', $email, PDO::PARAM_STR); 
    $stmt->execute(); 
    return $stmt->rowCount() > 0; 
} 
if (mailExists($pdo, $email) {} 

閱讀PDO和準備語句的詳細here。請注意,我是如何利用命名參數來確保此代碼無法執行sql注入的。

0

PHP允許您在函數中創建局部變量,而無需做任何事情來聲明它們。剛開始使用一個變量,它被認爲是一個局部變量。

這意味着如果你訪問函數中的全局變量,你必須明確聲明它:

function checkIfMailExists($email) { 
    global $pdo; 
    . . . 
+1

或更好的是,不要使用全局,但將其作爲參數傳遞給函數。 – Qirel

+0

@Qirel,是的,我同意這一點。我只想回答OP的問題。瞭解變量作用域如何在PHP中工作是值得的。 –