2013-10-27 2 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 в зависимости от входа)

Но во втором варианте выход просто -> чек-колл. Почему эта часть

$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(); 

не выполняется при использовании в качестве функции

+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(), вот почему.

Вот как это должно работать - просто передать параметры функции:

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

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

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

О, я вижу. Я думал, что они глобальны ... –

Смежные вопросы