Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> MySql nie zwraca wyniku
rafkar0252
post 21.11.2020, 12:55:08
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.04.2015

Ostrzeżenie: (0%)
-----


Witam kolegów,
mam problem, a mianowicie zapytanie do DB nie zwraca żadnego wyniku ani błędu. Gdy wpiszę w miejsce zmiennej $data2 datę z palca np. "2020-11-10" wszystko hula. Gdy pobieram z formularz nie działa.
.
CODE
  1. $dataRok = new DateTime($_POST['wybierz']);
  2. echo $data2 = $dataRok->format('Y-m-d').'</br></br>';
  3.  
  4.  
  5. $wybierzWinde = $db_polaczenie->prepare('SELECT formularz_rejestr.Adres, formularz_rejestr.Rodzaj, rewizje.Data_nast_rew FROM formularz_rejestr, rewizje
  6. WHERE formularz_rejestr.Id_rejestr = rewizje.Id_rejestr AND rewizje.Data_nast_rew >='.$data2);
  7. $wybierzWinde->execute();
  8. $rezultat = $wybierzWinde->fetchALL(PDO::FETCH_ASSOC);
  9.  
  10. foreach ($rezultat as $row)
  11. {
  12.  
  13. echo ('<tr><td>'.$row['Adres'].'</td><td>'.$row['Rodzaj'].'</td><td>'.$row["Data_nast_rew"].'</td></tr></br>');
  14.  


pomóżcie proszę.
Go to the top of the page
+Quote Post
dublinka
post 21.11.2020, 13:05:21
Post #2





Grupa: Zarejestrowani
Postów: 594
Pomógł: 66
Dołączył: 22.02.2008
Skąd: Dublin

Ostrzeżenie: (0%)
-----


A co zaraca formularz

Wlacz sobie raportowanie bledow

Ten post edytował dublinka 21.11.2020, 13:08:13


--------------------
Go to the top of the page
+Quote Post
trueblue
post 21.11.2020, 13:06:07
Post #3





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Temat: MySQL Problem z zapytaniem


--------------------
Go to the top of the page
+Quote Post
gino
post 21.11.2020, 14:02:19
Post #4





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


żebyś wiedział gdzie szukać, to dwie rzeczy ze zmienną $data2 są źle, jedna w definicji zmiennej, druga w samym zapisie zapytania. A tak poza tematem to ten post w ogóle nie w tym miejscu.

Ten post edytował gino 21.11.2020, 14:03:46
Go to the top of the page
+Quote Post
rafkar0252
post 21.11.2020, 16:06:37
Post #5





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.04.2015

Ostrzeżenie: (0%)
-----


Formularz przesyła datę, która ma być porównana klauzulą WHERE z datą w DB i zgodnie z relacją utworzoną w zapytaniu zwrócić zawartość odpowiednich rekordów.
Jeśli mogę, to proszę o więcej wskazówek, studia informatyczne skończyłem ponad 10 lat temu i przez ten czas nie zajmowałem się programowaniem. Teraz musze się uczyć tego od nowa.
Go to the top of the page
+Quote Post
gino
post 21.11.2020, 16:29:09
Post #6





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


Data w mysql-u ma okreslony format i jest wyrażona stringiem. W definicji zmiennej format daty jest zły, bo dodałeś dwa tagi br, wyrzuć je. W zapytaniu ta zmienna nie jest zaprezentowana jako string. Poczytaj w php czym różni się cudzysłowów od apostrofu.
Go to the top of the page
+Quote Post
rafkar0252
post 21.11.2020, 16:44:00
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.04.2015

Ostrzeżenie: (0%)
-----


ok, dzięki za podpowiedź. Wydawało mi się, że gdy użyje metody ->format klasy DateTime to php sformatuje zmienną do odpowiedniego typ. Po usunięciu tagów, teraz wyświela tylko daty wyzerowane. Wygąlą da na to, że do DB wysyła "1970-01-01"

CODE
  1. <form action="" method="post">
  2. <input type="date" name="wybierz"></input></br></br>
  3. <input type="submit" name="Wyślij"></input></br></br>
  4. </form>
  5. <?php
  6. $dataRok = new DateTime($_POST['wybierz']);
  7. echo $data2 = $dataRok->format('Y-m-d');
  8.  
  9.  
  10. $wybierzWinde = $db_polaczenie->prepare('SELECT formularz_rejestr.Adres, formularz_rejestr.Rodzaj, rewizje.Data_nast_rew FROM formularz_rejestr, rewizje
  11. WHERE formularz_rejestr.Id[php]
_rejestr = rewizje.Id_rejestr AND rewizje.Data_nast_rew <='.$data2);
$wybierzWinde->execute();
$rezultat = $wybierzWinde->fetchALL(PDO::FETCH_ASSOC);

foreach ($rezultat as $row)
{

echo ('<tr><td>'.$row['Adres'].'</td><td>'.$row['Rodzaj'].'</td><td>'.$row["Data_nast_rew"].'</td></tr></br>');
}

?>
[/php]
Go to the top of the page
+Quote Post
gino
post 21.11.2020, 16:54:44
Post #8





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


W Twoim zapytaniu do BD przesłane jest np.
Kod
rewizje.Data_nast_rew >=2020-11-04

To nie jest string. Dlatego wyrzuca wszystkie daty jakie znajdzie

Ten post edytował gino 21.11.2020, 16:55:11
Go to the top of the page
+Quote Post
viking
post 21.11.2020, 17:28:19
Post #9





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


W jaki sposób się zabezpieczasz jeżeli format daty jest nieprawidłowy? Tak, pytanie mające tylko dac do myślenia.


--------------------
Go to the top of the page
+Quote Post
rafkar0252
post 21.11.2020, 17:29:31
Post #10





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.04.2015

Ostrzeżenie: (0%)
-----


Jak wobec tego powinienem zaklarować tę zmienną? Jak ją przekonwretować na string?
Go to the top of the page
+Quote Post
viking
post 21.11.2020, 17:48:04
Post #11





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


- new DateTime otoczone blokiem try / catch
- dane z post do zapytania więc mają być POPRAWNIE zabezpieczone (prepare ma zawierać placeholder a nie dane z POST)
- data jest stringiem więc w zapytaniu kolumna = '2020-01-01' albo funkcja DATE() w mysql. Jak zrobisz poprawnie pkt wyżej będzie dobrze.

Ten post edytował viking 21.11.2020, 17:52:54


--------------------
Go to the top of the page
+Quote Post
rafkar0252
post 21.11.2020, 17:56:58
Post #12





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.04.2015

Ostrzeżenie: (0%)
-----


Cytat(viking @ 21.11.2020, 17:28:19 ) *
W jaki sposób się zabezpieczasz jeżeli format daty jest nieprawidłowy? Tak, pytanie mające tylko dac do myślenia.


if (checkdate($mienna)===true)
//wykona się instrukcja
else
//wyświeeetlle echem komunikat
tylko tak bo formularz jest typu date, raczej nie sposób wstrzyknąć sql, ponadto dane z posta są fetchowane przed wysłaniem do bazy.
Bardzo dziękuję za podpowiedź, zastosuje się do wskazówek.

Ten post edytował rafkar0252 21.11.2020, 17:59:42
Go to the top of the page
+Quote Post
viking
post 21.11.2020, 18:02:23
Post #13





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


To że ustawiłeś sobie date w formie mogę w 5 sekund zmienić w narzędziach developerskich albo wysłać zupełnie inaczej. Co to znaczy że dane są fetchowane? Wszędzie tam gdzie wkładasz dane od użytkownika w swoim kodzie musisz to zabezpieczyć.


--------------------
Go to the top of the page
+Quote Post
rafkar0252
post 21.11.2020, 18:19:44
Post #14





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.04.2015

Ostrzeżenie: (0%)
-----


Widzę, że czeka mnie mnóstwo czytania na temat praktyk tworzenia bezpiecznych aplikacji webowych. Bezmyślnie uznałem, że metoda fetchALL::DateTime() zabezpiecza dane z POSTA. Jesze raz dziękuję za zwrócenie mi uwagi. Po 10 latach BEZ kodowania myślałem, że coś jeszcze pamiętam, teraz widzę jak się pomyliłem smile.gif
Go to the top of the page
+Quote Post
gino
post 21.11.2020, 19:29:25
Post #15





Grupa: Zarejestrowani
Postów: 319
Pomógł: 52
Dołączył: 18.02.2008

Ostrzeżenie: (0%)
-----


walidacja danych z formularza dotyczy wszystkich przesyłanych danych bez wyjątku, nie tylko daty. Na to, co napisał viking chciałem zwrócić uwage nieco później, jak byś się uporał z wyświetleniem danych z tego zapytania. Mam nadzieję, że zrozumiałeś w czym tkwił błąd. Przecież nawet w opisie typu date mysql-a stoi jak byk:

"MySQL pobiera i wyświetla wartości DATE w formacie 'RRRR-MM-DD'." I zapenwe widzisz te pazurki w których jest ujęta data.

Manual, manual, manual.
Go to the top of the page
+Quote Post
rafkar0252
post 23.11.2020, 18:14:35
Post #16





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 28.04.2015

Ostrzeżenie: (0%)
-----


gino dzięki - działa. Na laboratorium programowania uczono mnie, że to " ' ' " i ' " " ' można stosować zamiennie. Tyle, że nie pamiętam z którego języka to było programowanie. Jak widać w php muszę na to uważać. Jeszcze raz dziękuję.
Go to the top of the page
+Quote Post
viking
post 23.11.2020, 18:33:16
Post #17





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


Tylko że u ciebie nie to było bezpośrednio problemem tylko nieprawidłowo użyty prepare. Prawidłowo użyty odpowiednio by to wysłał do zapytania.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 23:21