使用php检查SQL数据库中是否存在电子邮件地址

时间:2018-05-25 14:24:46

标签: php mysql sql

我正在做一个学校作业,其中必须包含一个供用户注册的页面。我收到一个错误,检查他们的电子邮件地址是否已经在数据库中,但我无法弄清楚原因。错误是:

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语句的那部分运行时才会出现错误。我无法弄清问题是什么。我做错了什么?

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,您的变量$kapcsolat已在您的文件database.php中定义,但在函数validate中使用。
创建函数时,其中使用的所有变量都应该是局部变量 我建议把这个变量作为参数而不是使用全局变量,它更灵活。但是,如果您真的想要使用此变量,则必须将$kapcsolat声明为全局

register.php中你应该使用:

<?php
function validate($post, &$data, &$hibak) {
    global $kapcsolat; //IMPORTANT IS HERE
    //...Some code
}

请参阅the global keyword