我正在创建一个脚本,用于检查用户提供的凭据是否有效(用户是否存在)。我是一个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();
?>
第一个版本的输出是 - &gt;行数:1(或0取决于输入)
但在第二个版本中,输出只是 - &gt;检查叫。为什么这部分
$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 :(得分: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);
答案 1 :(得分:0)
因为您没有传递给函数check ()
变量$email
和$password
。如果您不在函数中使用global关键字,则该变量仅在函数范围之外可见。
如果需要,可以使用global关键字在函数中使用全局范围的变量:
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 。