Formularz rezerwacji

0

Stworzyłem formularz rezerwacji, tylko teraz mam problem z wysłaniem danych do bazy danych. Nie wywala żadnych błędów jednak po wypełnieniu formularza i kliknięciu zarezerwuj pokazuje się białe tło i nic więcej. Do mysql nie dodaje danych, natomiast phpmyadmin zwraca jedynie

MySQL zwrócił pusty wynik (zero wierszy). (Wykonanie zapytania trwało 0,0002 sekund(y).)

Tak wygląda formularz logowania:

<form action="rezerwacja.php" method="POST">
  <label for="">Imie</label>
  <input type="text" class="form-control" name="Imie" id="Imie" placeholder="Podaj Imie" required> <br>
  <label for="">Nazwisko</label>
  <input type="text" class="form-control" name="Nazwisko" id="Nazwisko" placeholder="Podaj Nazwisko" required> <br>
  <label for="">Email</label>
  <input type="email" class="form-control" name="Email" id="Email" placeholder="Podaj Email" required> <br>
  <label for="date">Termin</label>
  <input type="datetime-local" class="form-control" name="date" id="date" required> <br>
  <label for="car">Wybierz dyscypline</label>
  <select name="sport" class="form-control" id="sport">
    <option value='' >WYBIERZ Zajęcia</option>
    <option value='1'>Piłka Nożna</option>
    <option value='2'>Piłka Nożna</option>
    <option value='3'>Koszykówka</option>
  </select> 
  <br>

  <input class="button" type="submit" value="Zarezerwuj" />

a tak plik rezerwacja.php

<?php
require('connect.php');

if (!empty($_POST)) {

    $Imie = ($_POST['Imie']);
    $Nazwisko = ($_POST['Nazwisko']);
    $Email = ($_POST['Email']);
    $id_zajec = ($_POST['sport']);
    $termin = ($_POST['date']);

    function reserve1($Imie, $Nazwisko, $Email, $id_zajec, $termin)
    {
        global $mysqli;

        $Data = $termin;

        $sql_2 = "INSERT INTO wynajmujacy (`Imie`, `Nazwisko`, `Email`) VALUES (NULL, '$Imie','$Nazwisko','$Email')";
        if ($statement = $mysqli->prepare($sql_2)) {
            if ($statement->bind_param('sss', $Imie, $Nazwisko, $Email)) {
                $statement->execute();
                $id_klienta = $mysqli->insert_id;
                $sql_3 = "INSERT INTO rezerwacja (`Data`, `id_klienta`, `id_zajec`) VALUES (NULL, '$Data','$id_klienta','$id_zajec','$termin')";

                if ($statement_2 = $mysqli->prepare($sql_3)) {
                    if ($statement_2->bind_param('siii', $Data, $id_klienta, $id_zajec)) {
                        $statement_2->execute();
                        header("Location:index.php");
                    }
                }
            }
        } else {
            die('Niepoprawne zapytanie');
        }
    }
}
?>

Ma ktoś pomysł co jest źle w tym kodzie i dlaczego nie dodaje on danych do tabel?
Pozdrawiam

2

Zacznij od uporządkowania kodu. Masz funkcję reserv1 w środku instrukcji warunkowej if. Wydaje się, że juz przez samo to powinieneś mieć błąd parsownaia. Jak wydzieliłeś to do funkcji to zamiast pisać w instrukcji warunkowej jej ciało powinieneś ją tu wywołać.
Żeby nie robić gotowca.

<?php
function foo($x) {
//jakieś ciało funkcji 
}
// jakiś kod
if($someCondition) {
    foo($x);// tylko wywołanie funkcji 
}

Z czasem pomyśl o różnicy tego może na pliki.

0
<?php
require('connect.php');
function reserve1($Imie, $Nazwisko, $Email, $id_zajec, $termin){
        global $mysqli;

        $Data = $termin;

        $sql_2 = "INSERT INTO wynajmujacy (`Imie`, `Nazwisko`, `Email`) VALUES (NULL, '$Imie','$Nazwisko','$Email')";
        if ($statement = $mysqli->prepare($sql_2)) {
            if ($statement->bind_param('sss', $Imie, $Nazwisko, $Email)) {
                $statement->execute();
                $id_klienta = $mysqli->insert_id;
                $sql_3 = "INSERT INTO rezerwacja (`Data`, `id_klienta`, `id_zajec`) VALUES (NULL, '$Data','$id_klienta','$id_zajec','$termin')";

                if ($statement_2 = $mysqli->prepare($sql_3)) {
                    if ($statement_2->bind_param('siii', $Data, $id_klienta, $id_zajec)) {
                        $statement_2->execute();
                        header("Location:index.php");
                    }
                }
            }
        } else {
            die('Niepoprawne zapytanie');
        }
    }

if (!empty($_POST)) {

    $Imie = ($_POST['Imie']);
    $Nazwisko = ($_POST['Nazwisko']);
    $Email = ($_POST['Email']);
    $id_zajec = ($_POST['sport']);
    $termin = ($_POST['date']);

    
    function reserve1($Imie, $Nazwisko, $Email, $id_zajec, $termin);

}

    

?>

O coś takiego chodzi?

Teraz pokazuje błąd:

Parse error: syntax error, unexpected token ";", expecting "{" in C:\xampp\htdocs\Rezerwacja\rezerwacja.php on line 37

Nawet jak stworze tą funkcje w osobnym pliku np funckja.php i ja podepne pod rezerwacja.php to wyskauje mi ten sam błąd syntax error:/

2

Chcąc wywołać funkcję nie piszesz function foo($param) tylko samo foo($param)

1

Masz błąd w tych zapytaniach MySQL
Moim zadaniem nie zgadza się ilość parametrów

$sql_2 = "INSERT INTO wynajmujacy (`Imie`, `Nazwisko`, `Email`) VALUES (NULL, '$Imie','$Nazwisko','$Email')";

$sql_3 = "INSERT INTO rezerwacja (`Data`, `id_klienta`, `id_zajec`) VALUES (NULL, '$Data','$id_klienta','$id_zajec','$termin')";

Raczej powinno być tak:

$sql_2 = "INSERT INTO wynajmujacy (`Imie`, `Nazwisko`, `Email`) VALUES ('$Imie','$Nazwisko','$Email')";

$sql_3 = "INSERT INTO rezerwacja (`Data`, `id_klienta`, `id_zajec`, `nazwa_kolumny_z_datą`) VALUES ('$Data','$id_klienta','$id_zajec','$termin')";

Czyli w pierwszym przypadku 3 nazwy kolumn i 3 wartości w 3 zmiennych, a w drugim 4 na 4. Ale podaj poprawną nazwę kolumny z datą.

Więcej tutaj: https://www.w3schools.com/sql/sql_insert.asp

No i ja bym to zrobił z użyciem funkcji mysqli_query().

1
Mateusz Mońka napisał(a):

Stworzyłem formularz rezerwacji, tylko teraz mam problem z wysłaniem danych do bazy danych. Nie wywala żadnych błędów jednak po wypełnieniu formularza i kliknięciu zarezerwuj pokazuje się białe tło i nic więcej. Do mysql nie dodaje danych, natomiast phpmyadmin zwraca jedynie

MySQL zwrócił pusty wynik (zero wierszy). (Wykonanie zapytania trwało 0,0002 sekund(y).)

[...]
Ma ktoś pomysł co jest źle w tym kodzie i dlaczego nie dodaje on danych do tabel?
Pozdrawiam

Ja bym odwrócił pytanie - co jest dobrze.

Sklejasz z niewiadomych źródeł bardzo różne techniki, kwerendy sklejane z pól edycyjnych (prosto wiodące do SQL Injection, podaj nazwisko Scartet O'Hara), jakiś bind parametru (zalążek dobrego pomysłu), tylko ze tego parametru nigdzie nie ma.

Kolejne: w ogóle nie obsługujesz błędów. Sam rezygnujesz z informacji nt problemów

0

Poprawiłem kod na cos takiego:

<?php
require('connect.php');
function reserve1($Imie, $Nazwisko, $Email, $id_zajec, $termin){
        global $mysqli;

        $Data = $termin;

        $sql_2 = "INSERT INTO wynajmujacy (`Imie`, `Nazwisko`, `Email`) VALUES (?,?,?)";
        if ($statement = $mysqli->prepare($sql_2)) {
            if ($statement->bind_param('sss', $Imie, $Nazwisko, $Email)) {
                $statement->execute();
                $id_klienta = $mysqli->insert_id;
                $sql_3 = "INSERT INTO rezerwacja (`Data`, `id_klienta`, `id_zajec`) VALUES (?,?,?)";

                if ($statement_2 = $mysqli->prepare($sql_3)) {
                    if ($statement_2->bind_param('siii', $Data, $id_klienta, $id_zajec)) {
                        $statement_2->execute();
                        header("Location:index.php");
                    }
                }
            }
        } else {
            die('Niepoprawne zapytanie');
        }
    }

if (!empty($_POST)) {

    $Imie = ($_POST['Imie']);
    $Nazwisko = ($_POST['Nazwisko']);
    $Email = ($_POST['Email']);
    $id_zajec = ($_POST['sport']);
    $termin = ($_POST['date']);

    
    reserve1($Imie, $Nazwisko, $Email, $id_zajec, $termin);

}

?>

i teraz wywala mi błąd
"Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\Rezerwacja\rezerwacja.php"
Jeśli chodzi o walidacje wprowadzanych danych to najpierw chciałbym stworzyć działający skrypt i później zająć się walidacja.

0
Mateusz Mońka napisał(a):

i teraz wywala mi błąd
"Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\Rezerwacja\rezerwacja.php"

Połączenie $mysqli, na którym byś chciał zrobić prepare() jest null, nie ma go

Wróżkom zamarzły szklane kule, nie wiedzą co jest w connect.php ale cokolwiek by było, ten fragment kodu tego nie urychamia

0

w connect.php jest:

<?php

	$host = "localhost";
	$db_user = "root";
	$db_password = "";
	$db_name = "system_rezerwacji";

$mysqli = new mysqli($host,$db_user,$db_password,$db_name);
$mysqli->query("SET NAMES 'utf8' COLLATE 'utf8_polish_ci'");
$mysqli->query("SET CHARSET utf8");

if($error = $mysqli->connect_errno) {
    die("Wystąpił błąd! Błąd połaczenia nr ".$error);
}

?>

Zadziałało i udało mi się dodać jeden rekord do bazy ale przy kolejnej próbie wyskakuje już inny błąd:

Fatal error: Uncaught mysqli_sql_exception: Cannot add or update a child row: a foreign key constraint fails (system_rezerwacji.rezerwacja, CONSTRAINT rezerwacja_ibfk_1 FOREIGN KEY (id_klienta) REFERENCES klient (id_klienta))

Dane do tabeli 'wynajmujacy' dodaja sie normalnie jednak do tabeli 'rezerwacja' gdzie jest klucz obcy już coś nie działa:/

1

W linijce 4 dekalarujesz zmienną $mysqli bez żadnej wartości.
Nie używaj global, lub przeczytaj czemu służy taki sposób deklaracji zmiennej, bo chyba nie użyłeś tego w pełni świadomie.

0

No masz racje dopiero się ucze i jeszcze sporo przede mna:) Mialem błąd w bazie danych i teraz za kazdym razem dodaje nowa rezerwacje do bazy. Dzieki za pomoc:)
Czyli to "global $mysqli" jest kompletnie nie potrzebne?

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