2016-05-29 32 views
-1

我對commong函數有commonFun.php;PHP使用include()變量作用域問題

<?php 

function connectDB(){ 
    $con = @mysqli_connect("localhost:3306", "root", "[email protected]", "DogSport") or die ("Couldn't connect to server"); 
} 

//check that email is not already in list 
function emailChecker($email){ 
    connectDB(); 

    $safe_email = mysqli_real_escape_string($con, $email); 
    $check_sql = "SELECT Id FROM Subscribers WHERE Email='". $safe_email. "'"; 

    $result = mysqli_query ($con, $check_sql) or die ("Couldn't execute SELECT query: ". mysqli_error($con)); 
} 
?> 

當我打電話emailChecker()函數從另一個PHP腳本,爲什麼在connectDB()$ CON變量不可用於emailChecker()函數?我已經在emailChecker()函數中調用connectDB()函數了?我究竟做錯了什麼?????

我得到以下錯誤;

Notice: Undefined variable: con in C:\xampp\htdocs\PHP\commonFun.php on line 11 

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\PHP\commonFun.php on line 11 

Notice: Undefined variable: con in C:\xampp\htdocs\PHP\commonFun.php on line 14 

Warning: mysqli_query() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\PHP\commonFun.php on line 14 

Notice: Undefined variable: con in C:\xampp\htdocs\PHP\commonFun.php on line 14 

Warning: mysqli_error() expects parameter 1 to be mysqli, null given in C:\xampp\htdocs\PHP\commonFun.php on line 14 
Couldn't execute SELECT query: 
+3

您正在''connectDB()'中定義'$ con',但沒有返回它,所以只要'connectDB()'函數執行完畢,'$ con'就停止在範圍內,並從內存中移除 –

+1

你可以在這裏閱讀更多關於它的信息:http://php.net/manual/en/language.variables.scope.php – Federkun

+1

修改'connectDB()'返回'$ con'的值並修改'emailChecker() '分配來自'connectDB()'....的響應''$ con = connectDB();' –

回答

-1

功能connectDB(){

$ CON = @mysqli_connect( 「本地主機:3306」, 「根」, 「P @ ssw0rd」, 「DogSport」)或死亡(「無法連接到服務器「);

return $ con; }

+0

這是什麼意思?我在這裏沒有上課,對吧? –

+1

使用此代碼函數總是返回值其有用,, – Bhavin

1

壞的解決方案,但它會工作:

function connectDB(){ 
    global $con; 

    $con = @mysqli_connect("localhost:3306", "root", "[email protected]", "DogSport") or die ("Couldn't connect to server"); 
} 

//check that email is not already in list 
function emailChecker($email){ 
    global $con; 

    connectDB(); 

    $safe_email = mysqli_real_escape_string($con, $email); 
    $check_sql = "SELECT Id FROM Subscribers WHERE Email='". $safe_email. "'"; 

    $result = mysqli_query ($con, $check_sql) or die ("Couldn't execute SELECT query: ". mysqli_error($con)); 
} 

另一種解決方案:

$con = @mysqli_connect("localhost:3306", "root", "[email protected]", "DogSport") or die ("Couldn't connect to server"); 

//check that email is not already in list 
function emailChecker($email){ 
    global $con; 

    $safe_email = mysqli_real_escape_string($con, $email); 
    $check_sql = "SELECT Id FROM Subscribers WHERE Email='". $safe_email. "'"; 

    $result = mysqli_query ($con, $check_sql) or die ("Couldn't execute SELECT query: ". mysqli_error($con)); 
} 

是不好的調用mysqli_connect()在每一個函數調用腳本。每次執行頁面時,您只能連接到數據庫一次。

+0

先生,我理解你的解決方案2非常好。這就是我所知道的全局關鍵字,哪些變量在任何函數之外聲明的都可以在使用全局關鍵字的函數內部訪問。但我不明白你的解決方案1它沒有任何函數以外的變量,爲什麼你提到這兩個函數中的全局關鍵字?謝謝 –

+0

如果PHP不嚴格('error_reporting^E_STRICT'),您可以全球化未定義的變量而不會出現任何錯誤。在解決方案1中,當您調用'emailChecker()'函數時,它將調用'connectDB()',其中設置已經全球化的$ con變量。測試它。 –