• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Działanie dwóch formularzy na jednej stronie (wysyłanie wyników do jednej tabeli), błąd składni

Object Storage Arubacloud
+1 głos
166 wizyt
pytanie zadane 6 stycznia 2021 w PHP przez dequk Użytkownik (810 p.)

Witam, tworzę obecnie stronę gdzie występują dwa formularze.

W jednym użytkownik szuka po id klienta, w drugim po id zamówienia. Dane są kierowane do jednej tabeli, która znajduje się na tej samej stronie.
Podczas próby implementacji takiego rozwiązania występuje błąd z składnią (czepia się o brak średnika, którego powiem szczerze nie widzę - w sensie nie widzę błędu działania)
Kolorowanie składni też nic mi takiego zbyt nie podpowiada o jakimś błędzie.

Kod źródłowy: https://pastebin.com/Cd88bjr1


Teoretycznie coś jest nie tak dookoła 99 linijki, jednak ja tego błędu nie widzę, chociaż pewnie jest dość mały (proszę o pomoc, gdyż siedzę godzinę już nad kodem i nie mogę go wyłapać)

1 odpowiedź

+2 głosów
odpowiedź 6 stycznia 2021 przez VBService Ekspert (253,340 p.)
wybrane 6 stycznia 2021 przez dequk
 
Najlepsza

Tu masz błąd, ale o tej porze do przeoczenia. wink (Domyślam się, że teraz piszesz)

id_zamowienie = ".$id_zamowienie.; - kropka przed średnikiem

komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)

To rozwiązało problem, dziękuje.

Jednak jeśli jeszcze można zapytać to pojawiły się teraz następujące błędy jak:

Notice: Undefined index: id_klienta in C:\xampp\htdocs\panel\zamowienia-wyszukaj.php on line 92

Notice: Undefined index: id_zamowienie in C:\xampp\htdocs\panel\zamowienia-wyszukaj.php on line 93
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'OR id_zamowienie =' at line 2
Notice: Trying to get property 'num_rows' of non-object in C:\xampp\htdocs\panel\zamowienia-wyszukaj.php on line 109


Z tego rozumiem, że po prostu zmienne nie są zdefiniowane. Jednak starałem się je wyciągnąć odpowiednio z dwóch formularzy i zastosować opcję OR. Co może być nie tak w tym przypadku? 

komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)

Jeżeli masz dwa formularze na stronie to w momencie przyciśnięcia SZUKAJ wysyłane są wartość z pół (pola) input znajdującego się pomiędzy
<form> ... </form>

komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)
edycja 6 stycznia 2021 przez VBService

Pierwszą zmianę proponuję tu:

                <?php
 
                require('db_data.php');
 
                $id_klienta = $_POST['id_klienta'];
                $id_zamowienie = $_POST['id_zamowienie'];

                ...

na

                <?php
 
                if ($_SERVER["REQUEST_METHOD"] == "POST") {
                    require('db_data.php');
 
                    $id_klienta = $_POST['id_klienta'];
                    $id_zamowienie = $_POST['id_zamowienie'];

                    . . .

                     $connect->close();
                } // koniec ($_SERVER["REQUEST_METHOD"] == "POST")
                ?>  
            </div>          
        </div>
<!-- Koniec wyswietlania wyników -->

ten zapis: $_SERVER["REQUEST_METHOD"] == "POST" daje nam możliwość sprawdzenia czy skrypt został uruchomiony z formularza (naciśnięcie przycisku szukaj), czy z linku z przeglądarki (najczęściej pierwsze uruchomienie)

Kolejna zmiana

                <?php
 
                if ($_SERVER["REQUEST_METHOD"] == "POST") { 
                       $id_klienta = (isset($_POST['id_klienta'])) ? $_POST['id_klienta'] : '';
                    $id_zamowienie = (isset($_POST['id_zamowienie'])) ? $_POST['id_zamowienie'] : '';
                    
                    if (! empty($id_klienta) || ! empty($id_zamowienie)) {
                        require('db_data.php');
                        . . .

                        $connect->close();
                    } // koniec (! empty( $id_klienta) || ! empty($id_zamowienie))
                } // koniec ($_SERVER["REQUEST_METHOD"] == "POST")
                ?>  
            </div>          
        </div>
<!-- Koniec wyswietlania wyników -->

 

komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)

Żaden błąd się nie pojawił, jednak w ogóle tabela się nie ładuje. Występuje po prostu pusta strona w tym miejscu.

Jeśli chodzi o wykonywane akcje po wciśnięciu buttonów kolejno id klienta wyświetlane są następujące błędy:

Notice: Undefined index: id_zamowienie in C:\xampp\htdocs\panel\zamowienia-wyszukaj.php on line 94
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 3
Notice: Trying to get property 'num_rows' of non-object in C:\xampp\htdocs\panel\zamowienia-wyszukaj.php on line 110

Jednak zaś po wcisnieciu buttona id zamówienie występuje taki komunikat:
Notice: Undefined index: id_klienta in C:\xampp\htdocs\panel\zamowienia-wyszukaj.php on line 93
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'OR id_zamowienie = 1' at line 2
Notice: Trying to get property 'num_rows' of non-object in C:\xampp\htdocs\panel\zamowienia-wyszukaj.php on line 110

Jakby nadal się odnosił do tych globalnych zmiennych

komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)
edycja 6 stycznia 2021 przez VBService

Trzeba jeszcze poprawić zapis sql-a, bo za każdym razem kiedy klikamy na szukaj, czy to w pierwszym formularzu, czy w drugim, zawsze jedna ze zmiennych jest pusta, wiec trzeba zamienić na taki zapis:

$zapytanie_wyszukaj_zamowienie = "SELECT id_zamowienie, id_koszyk, id_platnosci, "
                                ."data_zlozenia, id_klienta FROM zamowienie WHERE "
                                ."id_klienta = '".$id_klienta."' OR id_zamowienie = '".$id_zamowienie."'";

wtedy np. gdy $id_klienta jest pusta w sql-u mamy zapis id_klienta = '' wink

Gdy pobierasz dane SELECT-em z jednej tabeli nie musisz używać nazwy tabeli przed nazwą kolumny i nie musisz robić aliasu do nazwy tabeli. Zapis z aliasem i z wyszczególnieniem nazwy tabeli używa się np. przy zapytaniach do wielu tabel w jednym SELECT-cie. Jeżeli pobierasz wszystkie kolumny z jednej tabeli to taki zapis jest też prawidłowy (* - pobierz wszystkie kolumny z tabeli)

SELECT * FROM tabela;
SELECT * FROM tabela WHERE nazwa_kolumny = wartosc;

 

komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)

Faktycznie, naprawiło to problem, tylko jakby pomimo tego krzyczy na pusty zapis, przy id zamówienia na id klienta i na odwrót :/ 

komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)
edycja 6 stycznia 2021 przez VBService

Musisz użyć isset(), zmienne (wartości) zwracane z form (formularzy) są typu string, jeżeli z formularza nie została przysłana wartość to $_POST['zmienna'] zwraca wartość NULL, wtedy php traktuje taki zapis: $zmienna$_POST['zmienna']; za brak "inicjacji" zmiennej $zmienna i "wali łorningiem" wink jak np. ten:

lekarstwo to np.:

$zmienna = (isset($_POST['zmienna '])) ? $_POST['zmienna '] : '';

Jeżeli zmienna z formularza $_POST['zmienna '] zawiera dane isset($_POST['zmienna ']) zwraca true to pobierz dane z $_POST['zmienna '] jeżeli nie to ustaw "pusty" łańcuch (string) '' (2 apostrofy bez spacji) lub "" (2 cudzysłowy bez spacji)

komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)

Trochę średnio kontaktuje o tej godzinie, czyli po prostu jezeli zostanie wciśniety submit to odpowiednia zmienna zostanie załadowana?

O coś takiego chodzi?

 

if ($_SERVER["REQUEST_METHOD"] == "POST") {
                    require('db_data.php');
  
  					if (isset($id_klienta)) {
  						$id_klienta = $_POST['id_klienta'];
  					}
  					if (isset($id_zamowienie)) {
  						$id_zamowienie = $_POST['id_zamowienie'];
  					}
                    //$id_klienta = $_POST['id_klienta'];

                    //$id_zamowienie = $_POST['id_zamowienie'];


				$zapytanie_wyszukaj_zamowienie = 
				"SELECT id_zamowienie, id_koszyk, id_platnosci, "
                ."data_zlozenia, id_klienta FROM zamowienie WHERE "
                ."id_klienta = '".$id_klienta."' OR id_zamowienie = '".$id_zamowienie."'";

				if ($wynik = $connect->query($zapytanie_wyszukaj_zamowienie)) {
    				
					}
					else {
					    echo $connect->error;
					}

 

komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)
edycja 6 stycznia 2021 przez VBService

Dokładnie tak. Tylko, że przy takim zapisie musimy ustawić pusty string na tą, która nie pochodzi z formularza. np.:

[ Edit ]

if (isset($_POST['id_klienta'])) {
   $id_klienta = $_POST['id_klienta'];
} else {
   $id_klienta = '';
}

if (isset($_POST['id_zamowienie'])) {
   $id_zamowienie = $_POST['id_zamowienie'];
} else {
   $id_zamowienie = '';
}

od 5 wersji php mamy możliwość takiego zapisu, który jest równoznaczny z powyższym kodem

$id_klienta = (isset($_POST['id_klienta'])) ? $_POST['id_klienta'] : '';
$id_zamowienie = (isset($_POST['id_zamowienie'])) ? $_POST['id_zamowienie'] : '';
                    

$zmienna = (warunek) ? wartosc_gdy_true : wartosc_gdy_false;

komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)
To trochę już wiecej z tego rozumiem, bo trochę z PHPem nie miałem do czynienia, a tym projektem trochę chce sobie przypomnieć/nauczyć się paru rzeczy.

Po wprowadzeniu tego kodu tylko jakby żadna akcja nie chce działać tak jakby. Submity są ustawione na przyciskach.
komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)
Wrzuć kod, proszę, po poprawkach na pastebin.
komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)
komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)

Mój błąd (późna pora), skopiowałem bezmyślnie od Ciebie wink i podałem Tobie jako prawidłową odpowiedź.

zamiast

if (isset($id_klienta)) {
   $id_klienta = $_POST['id_klienta'];
} else {
   $id_klienta = '';
}
 
if (isset($id_zamowienie)) {
   $id_zamowienie = $_POST['id_zamowienie'];
} else {
   $id_zamowienie = '';
}

ma być

if (isset($_POST['id_klienta'])) {
   $id_klienta = $_POST['id_klienta'];
} else {
   $id_klienta = '';
}
 
if (isset($_POST['id_zamowienie'])) {
   $id_zamowienie = $_POST['id_zamowienie'];
} else {
   $id_zamowienie = '';
}

 

1
komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)
Działa! Dziękuje bardzo, bardzo za pomoc!
komentarz 6 stycznia 2021 przez VBService Ekspert (253,340 p.)

Może zrób tak wink

    $where = '';
    if (isset($_POST['id_klienta'])) {
        $where = "id_klienta = '".$_POST['id_klienta']."'";
    }

    if (isset($_POST['id_zamowienie'])) {
        $where = "id_zamowienie = '".$_POST['id_zamowienie']."'";
    }

    $sql_zamowienie = "SELECT id_zamowienie, id_koszyk, id_platnosci, "
                     ."data_zlozenia, id_klienta FROM zamowienie WHERE ".$where;

lub

    $where = '';
    if (isset($_POST['id_klienta'])) {
        $where = "id_klienta = '".$_POST['id_klienta']."'";
    }

    if (isset($_POST['id_zamowienie'])) {
        $where = "id_zamowienie = '".$_POST['id_zamowienie']."'";
    }

    $sql_zamowienie = "SELECT * FROM zamowienie WHERE ".$where;

 

1
komentarz 6 stycznia 2021 przez dequk Użytkownik (810 p.)
To już muszę się z tym na spokojnie przespać i przeanalizuje ten kod linijka po linijce. Najważniejsze, że w miarę jakoś tam działa. Jeszcze raz dziękuje za wszystko i cała pomoc przy tym temacie

Podobne pytania

+1 głos
2 odpowiedzi 313 wizyt
pytanie zadane 8 lipca 2021 w SQL, bazy danych przez Kenzy Obywatel (1,160 p.)
0 głosów
1 odpowiedź 963 wizyt
+1 głos
2 odpowiedzi 526 wizyt
pytanie zadane 1 sierpnia 2021 w SQL, bazy danych przez mgab Nowicjusz (160 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...