Podwójny zapis do bazy przy odświeżaniu strony

0

Witajcie!
Szukam odpowiedzi na mój problem. Wygląda to tak:
wpisuje dane do formularza, zapisuje je postem, waliduje w jednym pliku i wysyłam do poniższego pliku, który powinien zapisywać dane do bazy. Chciałem jednak zrobić tak, by wpisy w bazie się nie powtarzały, i tak sprawdzam selectem, czy jest taki wpis i jeżeli jest, wracam do index.php, gdzie jest formularz z zapisana zmienną sesyjną, która wyświetla komunikat o tym, ze jest już taki wpis w bazie.
Oczywiście, jeżeli wpisu nie ma, zapisuje dane do bazy. Niby wszystko gra i w szystko się zapisuje, jeżeli jednak kliknę odśwież, wpis w bazie pojawia się podwójnie, jak by nie sprawdzał, czy w bazie już taki jest. Kiedy kliknę drugi raz odśwież wtedy prawidłowo wraca do index.php. Skąd 2 wpisy? co robię źle?

        session_start();
        $email_db = $_SESSION['g_email'];
        echo $email_db;
        $salon_db = $_SESSION['g_salon'];
        if(empty($email_db))
        {
            header('Location: index.php');
            exit;
        }
        else
        {
            require_once 'database.php';
            $query = $db->prepare('SELECT u_id FROM user WHERE u_email = :email');
            $query->bindValue(':email', $email_db, PDO::PARAM_STR);
            $query->execute();
            print_r($query->fetch());
            if(empty($query->fetch()))
            {
                $_SESSION['e_email']="Ten e-mail jest już w naszej bazie.";
                header('Location: index.php');
                exit();
            }
            else
            {
                $query2 = $db->prepare("INSERT INTO user VALUES (NULL,:email,:nazwa,'',1)");
                $query2->bindValue(':email', $email_db, PDO::PARAM_STR);
                $query2->bindValue(':nazwa', $salon_db, PDO::PARAM_STR);
                $query2->execute();
                echo Wszystko OK!;
            }

        }
0
if(empty($query->fetch()))

Ten warunek nie powinien być na odwrót?

0
Patryk27 napisał(a):
if(empty($query->fetch()))

Ten warunek nie powinien być na odwrót?

Tak, masz racje, przed przyklejaniem jeszcze kombinowałem. Jednak to niestety nie rozwiązuje problemu.

Poniżej wersja po zmianie:

        session_start();
        $email_db = $_SESSION['g_email'];
        echo $email_db;
        $salon_db = $_SESSION['g_salon'];
        if(empty($email_db))
        {
            header('Location: index.php');
            exit;
        }
        else 
        {
            require_once 'database.php';
            $query = $db->prepare('SELECT u_id FROM user WHERE u_email = :email');
            $query->bindValue(':email', $email_db, PDO::PARAM_STR);
            $query->execute();
            print_r($query->fetch()); //za pierwszym uruchomieniem tak jak by to nie działało
            $test = $query->fetch();
            if(empty($test))
            {
                $query = $db->prepare("INSERT INTO user VALUES (NULL,:email,:nazwa,'',1)");
                $query->bindValue(':email', $email_db, PDO::PARAM_STR);
                $query->bindValue(':nazwa', $salon_db, PDO::PARAM_STR);
                $query->execute();                
            }
            else
            {
                $_SESSION['e_email']="Ten e-mail jest już w naszej bazie.";
                header('Location: index.php');
                exit();
            }

        }
0

za pierwszym uruchomieniem tak jak by to nie działało co to znaczy?

0

Ok, udało mi się rozwiązać temat. Wydaje mi się, że powinno być tak ;)

        session_start();
        $email_db = $_SESSION['g_email'];
        $salon_db = $_SESSION['g_salon'];
        if(empty($email_db))
        {
            header('Location: index.php');
            exit;
        }
        else 
        {
            require_once 'database.php';
            $query = $db->prepare('SELECT u_id FROM user WHERE u_email = :email');
            $query->bindValue(':email', $email_db, PDO::PARAM_STR);
            $query->execute();
            $feach_db = $query->fetch();
            if(!$feach_db)
            {
                $query = $db->prepare("INSERT INTO user VALUES (NULL,:email,:nazwa,'',1)");
                $query->bindValue(':email', $email_db, PDO::PARAM_STR);
                $query->bindValue(':nazwa', $salon_db, PDO::PARAM_STR);
                $query->execute();                
            }
            else
            {
                $_SESSION['e_email']="Ten e-mail jest już w naszej bazie.";
                header('Location: index.php');
                exit();
            }
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0