我正在做一个学校作业,其中必须包含一个供用户注册的页面。我收到一个错误,检查他们的电子邮件地址是否已经在数据库中,但我无法弄清楚原因。错误是:
Notice: Undefined variable: kapcsolat in /home/hallgatok/jyhv6c/www/wf2/php_bead/register.php on line 39
Fatal error: Uncaught Error: Call to a member function prepare() on null in /home/hallgatok/jyhv6c/www/wf2/php_bead/database.php:9 Stack trace: #0 /home/hallgatok/jyhv6c/www/wf2/php_bead/register.php(9): lekerdezes(NULL, 'SELECT * FROM `...', Array) #1 /home/hallgatok/jyhv6c/www/wf2/php_bead/register.php(39): letezik(NULL, 'koostamas199753...') #2 /home/hallgatok/jyhv6c/www/wf2/php_bead/register.php(53): validate(Array, Array, Array) #3 {main} thrown in /home/hallgatok/jyhv6c/www/wf2/php_bead/database.php on line 9
我的database.php,我连接的地方:
database.php中
<?php
function kapcsolodas($kapcsolati_szoveg, $felhasznalonev = '', $jelszo = '') {
$pdo = new PDO($kapcsolati_szoveg, $felhasznalonev, $jelszo);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
}
function lekerdezes($kapcsolat, $sql, $parameterek = []) {
$stmt = $kapcsolat->prepare($sql);
$stmt->execute($parameterek);
return $stmt->fetchAll();
}
function vegrehajtas($kapcsolat, $sql, $parameterek = []) {
return $kapcsolat
->prepare($sql)
->execute($parameterek);
}
$kapcsolat = kapcsolodas(
'mysql:host=localhost;dbname=****;charset=utf8',
'****', '****');
?>
完成工作的页面:
register.php
<?php
include('database.php');
///////////////////////////////////
function letezik($kapcsolat, $felhasznalonev) {
$felhasznalok = lekerdezes($kapcsolat,
"SELECT * FROM `felhasznalok` WHERE `felhasznalonev` = :felhasznalonev",
[ ":felhasznalonev" => $felhasznalonev ]
);
return count($felhasznalok) === 1;
}
function regisztral($kapcsolat, $teljes_nev, $felhasznalonev, $jelszo) {
$db = vegrehajtas($kapcsolat,
"INSERT INTO `felhasznalok` (`teljes_nev`, `felhasznalonev`, `jelszo`)
values (:teljes_nev, :felhasznalonev, :jelszo)",
[
":teljes_nev" => $teljes_nev,
":felhasznalonev" => $felhasznalonev,
":jelszo" => password_hash($jelszo, PASSWORD_DEFAULT),
]
);
return $db === 1;
}
function validate($post, &$data, &$hibak) {
if (trim($post['nev']) === '') {
$hibak[] = 'Teljes név kötelező!';
}
else {
$data['nev'] = $post['nev'];
}
if (trim($post['email']) === '') {
$hibak[] = 'E-mail cím kötelező!';
} else if (!filter_var($post['email'], FILTER_VALIDATE_EMAIL)) {
$hibak[] = "Hibás e-mail cím!";
} else if (letezik($kapcsolat, $post['email'])) { <========This is line 39, but $kapcsolat was defined in database.php
$hibak[] = "Ehhez az e-mail címhez már tartozik felhasználói fiók!";
}
else {
$data['email'] = $post['email'];
}
$data['jelszo'] = $post['jelszo'];
return count($hibak) === 0;
}
$hibak = [];
if ($_POST) {
if (validate($_POST, $data, $hibak)) {
regisztral($kapcsolat, $data['nev'], $data['email'], $data['jelszo']);
header("Location: index.php");
exit();
}
}
?>
只有if语句的那部分运行时才会出现错误。我无法弄清问题是什么。我做错了什么?
答案 0 :(得分:3)
正如我在评论中所说,您的变量$kapcsolat
已在您的文件database.php
中定义,但在函数validate
中使用。
创建函数时,其中使用的所有变量都应该是局部变量
我建议把这个变量作为参数而不是使用全局变量,它更灵活。但是,如果您真的想要使用此变量,则必须将$kapcsolat
声明为全局。
在register.php
中你应该使用:
<?php
function validate($post, &$data, &$hibak) {
global $kapcsolat; //IMPORTANT IS HERE
//...Some code
}