2013-10-27 37 views
-1

我正在製作一個腳本來檢查用戶給出的憑據是否有效(用戶存在)。我是一個PHP noob,我不明白爲什麼我的腳本不起作用。PHP - 如果通過函數調用查詢不執行

所以,你能解釋一下我爲什麼如果我這樣做它的工作原理:

<?php 
// include database constants 
include_once("../config/config.php");     

// create db connection 
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 

/* check connection */ 
if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
} 

$mysqli->set_charset("utf8"); 

$email = $_POST['email']; 
$password = $_POST['password']; 

$stmt = $mysqli -> prepare("SELECT * FROM mytable WHERE email=? AND password=?"); 
$stmt -> bind_param("ss", $email, $password); 
$stmt -> execute(); 
$stmt-> store_result(); 
printf(" Number of rows: %d.\n", $stmt->num_rows); 
$stmt -> close(); 
$mysqli->close(); 
?> 

但如果我這樣做是不?

<?php 
// include database constants 
include_once("../config/config.php");     

// create db connection 
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 

/* check connection */ 
if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
} 

$mysqli->set_charset("utf8"); 

$email = $_POST['email']; 
$password = $_POST['password']; 


function check() { 
    printf("check called\n"); //debug 
    $stmt = $mysqli -> prepare("SELECT * FROM mytable WHERE email=? AND password=?"); 
    $stmt -> bind_param("ss", $email, $password); 
    $stmt -> execute(); 
    $stmt -> store_result(); 
    printf(" Number of rows: %d.\n", $stmt->num_rows); 
    $stmt -> close(); 
} 
check(); 

$mysqli->close(); 
?> 

在第一版本的輸出 - >行數:1(或0依賴於輸入)

但在第二版本的輸出僅僅是 - >檢查調用。爲什麼作爲函數

+0

db變量不是全局變量,它需要是參數 –

+0

Jari,Cristian Bitoi感謝你的答案。爲了決定我接受誰的答案,我翻了一枚硬幣,因爲我認爲他們同樣好。 –

回答

0

因爲你不及格的功能check()變量$email$password。如果您的函數中沒有使用全局關鍵字,則該變量僅在函數範圍外可見。

如果你願意,你可以使用全局關鍵字來使用它從全局範圍變量在你的函數:

function check() { 

    global $email; // from gloabl scope 
    global $password; // from global scope 
    global $mysqli; // from global scope 

    printf("check called\n"); //debug 
    $stmt = $mysqli -> prepare("SELECT * FROM mytable WHERE email=? AND password=?"); 
    $stmt -> bind_param("ss", $email, $password); 
    $stmt -> execute(); 
    $stmt -> store_result(); 

    printf(" Number of rows: %d.\n", $stmt->num_rows); 

    $stmt -> close(); 
} 

查看更多here有關變量的作用域和全局的關鍵字。

+0

我認爲他們是全球性的。我不知道他們必須明確宣佈爲全球。謝謝。 –

4

使用時因爲,$mysqli變量不是內部check()訪問不執行此部分

$stmt = $mysqli -> prepare("SELECT * FROM mytable WHERE email=? AND password=?"); 
$stmt -> bind_param("ss", $email, $password); 
$stmt -> execute(); 
$stmt-> store_result(); 
printf(" Number of rows: %d.\n", $stmt->num_rows); 
$stmt -> close(); 

,這就是原因。

這是它如何工作的 - 只是將參數傳遞給函數:

$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 

function check (MySQLi $mysqli, $email, $password) { 
    // Your stuff 
} 

check($mysqli, $email, $password); 
+0

哦,我明白了。我以爲他們是全球... –