Tamas Koos
Tamas Koos

Reputation: 1063

Checking if email address exists in SQL database with php

I am doing a school assignment which has to contain a page for users to register. I am getting an error with checking if their email address is already in the database, but I can't figure out why. The error is:

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

My database.php, where I connect:

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',
  '****', '****');
?>

And the page which does the work:

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();
    }
}
?>

The error only occurs when that part of the if statement runs. I just can't figure out what the problem is.What am I doing wrong?

Upvotes: 1

Views: 83

Answers (1)

Anthony
Anthony

Reputation: 2122

As I said in a comment, your variable $kapcsolat is defined in your file database.php, but is used in the function validate.
When you create a function, all variables used in it are supposed to be local variables.
I suggest to take this variable as parameter instead of using the global variable, it's more flexible. But if you really want to use this variable, you have to declare $kapcsolat as global.

In register.php you should use:

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

See the global keyword

Upvotes: 3

Related Questions