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

Odpowiedz Nowy wątek
2018-12-21 04:04
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!;
            }

        }

Pozostało 580 znaków

2018-12-21 08:47
0
if(empty($query->fetch()))

Ten warunek nie powinien być na odwrót?


edytowany 1x, ostatnio: Patryk27, 2018-12-21 08:47

Pozostało 580 znaków

2018-12-21 09:46
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();
            }

        }
edytowany 1x, ostatnio: juniorchat, 2018-12-21 12:51
Wrzuć zatem aktualny kod. - Patryk27 2018-12-21 09:51
Masz racje, wrzuciłem poprawiony kod - juniorchat 2018-12-21 12:51

Pozostało 580 znaków

2018-12-21 13:01
0

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


w momencie, w którym uruchamiam pojawia się skrypt odbywa się zapis do bazy danych. Jednak nie wyświetla sie to echo, dopiero po f5 się pojawia: tj przykładowo, gdy klikam zapisz: pojawia się "[email protected]" (zapisuje się do bazy danych) następnie naciskam f5: "[email protected] ( [u_id] => 43 [0] => 43 )" (tu powstaje drugi wpis do bazy danych) po drugim naciśnięciu f5 wraca mi do formularza index.php: z informacją: "Ten e-mail jest już w naszej bazie." (a w bazie mam 2 wpisy) - juniorchat 2018-12-21 14:10

Pozostało 580 znaków

2018-12-21 17:23

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();
            }
        }
Btw, poczytaj o indeksach unique w SQLu ;-) - Patryk27 2018-12-22 12:10
hmm w sumie racja, dziękuje ;) - juniorchat 2018-12-23 23:57

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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