Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] pętla i select
Forum PHP.pl > Forum > Przedszkole
blokern

mam pętle w której chce umieścic selecta

  1. for($i=1; $i < 13; $i++){
  2. // select
  3. }


obecnie:
  1. $q = "SELECT * FROM reservations WHERE reservation_date_k LIKE '2020-10%' AND reservation_status < '10' AND apartament_id = $id_apartament";


a chcę zamienić na
  1. $q = "SELECT * FROM reservations WHERE reservation_date_k LIKE '2020-$i' AND reservation_status < '10' AND apartament_id = $id_apartament";


ale po pierwsze nie wiem jak dodac 0 przed 1,2,3.....8,9 zeby uzyskac 2020-01 zamiast 2020-1
oraz jak dodac $i do selecta?

LIKE '2020-'.$i.'-%' ?

z gory dziekuje za pomoc
viking
Nazwa kolumny wskazuje że to jakiś typ daty. Dlaczego ja porównujesz przez like?
blokern
Cytat(viking @ 30.10.2020, 15:38:30 ) *
Nazwa kolumny wskazuje że to jakiś typ daty. Dlaczego ja porównujesz przez like?


za malo mam wiedzy smile.gif tak to zrobilem

  1. $miesiac = str_pad($i, 2, "0", STR_PAD_LEFT );
  2. $wybrana_data = '2020-'.$miesiac.'-%';
  3.  
  4. $q = "SELECT * FROM reservations WHERE reservation_date_k LIKE '$wybrana_data' AND reservation_status < '10' AND apartament_id = $id_apartament";


viking
I dla takiej głupoty leci 13 zapytań.
Tomplus
Viking ma rację.

Użyj w zapytaniu SQL coś takiego jak BETWEEN dla porównywania przedziałów dat.

Kod
reservation_date_k BETWEEN '2020-01-01' AND '2020-12-31'


a co do pętli for, bardziej czytelne będzie gdy użyjesz <= 12, a nie < 13. - Skoro wiadomo że dotyczy to miesięcy, gdy ty sam, lub ktoś inny na to spojrzy, to od razu poprawnie zinterpretuje co to jest za liczba.
SmokAnalog
Tomplus to po co w ogóle ten BETWEEN? Wystarczy:

  1. WHERE year(`reservation_date_k`) = 2020 AND apartament_id = ?


blokern nie wstawiaj do zapytania wartości z zewnątrz jako stringa. Od tego są prepared statement, żeby się nie narazić na SQL Injection.
blokern
wszystkim dziekuje za rady.
SmokAnalog a moge uzyc htmlspecialchars i to co mi wypluje wstawic do zapytania? to mnie urchroni przed SQL Injection?
viking
Nie , nie możesz. Poza tym do raz przygotowanego zapytania możesz postawić n- razy wartości i je wykonywać.
blokern
dziekuje i to jezeli pobieram wartosci zmiennych z urla a jezeli robie formularz i przesylam metoda post to wystarczy uzyć htmlspecialchars zeby przefiltrowac to co uzytkownik wpisuje?
nospor
Nie
SmokAnalog
Nie wystarczy, bo w SQL Injection często wykorzystuje się znak myślnika ( -- to komentarz SQL), a htmlspecialchars nie koduje myślnika. Poza tym, osobiście jestem przeciwnikiem zapisywania inputa w zmienionej formie. Przyzwyczaj się do używania prepared statements, to Ci zaprocentuje i nie jest takie trudne smile.gif
Tomplus
Do SQL warto obejrzeć film Kacpra Szurka o SQL Injection: bardzo dużo różnych przykładów.

https://www.youtube.com/watch?v=s7Nozq4iqFY
blokern
poczytalem troche na http://prophp.pl/ i ogolnie to zrobilem tak ze uzywam (int) oraz wczeniej filtruje, wiem z jakiego przedzialu moge dostac liczby w id a wszystko co jest podejrzane odrzucam.
dzieki za dyskusje na 100% poczytam o czym piszecie, yt tez w wolnej chwili zobacze
SmokAnalog
To fajnie, że używasz int i w ogóle, ale dlaczego nie chcesz się przekonać do prepared statements? Powiem wprost: one powinny być zawsze używane, gdy przekazujesz wartość do zapytania. Nawet, gdy to jest na 100% liczba. Po prostu dobrze wyrobić sobie taki nawyk, że sklejanie zapytania ze stringa jest złą praktyką, gdy mówimy o sklejaniu wartości. Czasem od tego nie uciekniesz, bo bywa że trzeba dynamicznie przekazać np. nazwę kolumny, a tu już prepared statements nie pomogą.
Tomplus
@Blokern
SmokAnalog ma rację, nie dość że jest to proste w użyciu, to jeszcze bezpieczniejsze i mniej komplikujący kod niż stosowanie filtrów. Oczywiście, mając jakiś stary kod to nie obędziesz się, bez takich funkcji, ale tutaj jak widzę, nie dość że się uczysz, to tworzysz nowy kod.

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.