Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] pętla i select
blokern
post 30.10.2020, 15:16:02
Post #1





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 27.02.2008

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



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


--------------------
www.Opiekuj.pl
Go to the top of the page
+Quote Post
nospor
post 30.10.2020, 15:34:03
Post #2





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




https://www.php.net/manual/en/function.str-pad.php


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
viking
post 30.10.2020, 15:38:30
Post #3





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

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


Nazwa kolumny wskazuje że to jakiś typ daty. Dlaczego ja porównujesz przez like?


--------------------
Go to the top of the page
+Quote Post
blokern
post 30.10.2020, 15:47:16
Post #4





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 27.02.2008

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


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";




--------------------
www.Opiekuj.pl
Go to the top of the page
+Quote Post
viking
post 30.10.2020, 17:25:02
Post #5





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

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


I dla takiej głupoty leci 13 zapytań.


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 30.10.2020, 21:37:28
Post #6





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

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


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.
Go to the top of the page
+Quote Post
SmokAnalog
post 30.10.2020, 22:10:41
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
blokern
post 2.11.2020, 17:01:29
Post #8





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 27.02.2008

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


wszystkim dziekuje za rady.
SmokAnalog a moge uzyc htmlspecialchars i to co mi wypluje wstawic do zapytania? to mnie urchroni przed SQL Injection?


--------------------
www.Opiekuj.pl
Go to the top of the page
+Quote Post
viking
post 2.11.2020, 17:32:32
Post #9





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

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


Nie , nie możesz. Poza tym do raz przygotowanego zapytania możesz postawić n- razy wartości i je wykonywać.


--------------------
Go to the top of the page
+Quote Post
blokern
post 3.11.2020, 17:04:15
Post #10





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 27.02.2008

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


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?


--------------------
www.Opiekuj.pl
Go to the top of the page
+Quote Post
nospor
post 3.11.2020, 17:30:57
Post #11





Grupa: Moderatorzy
Postów: 36 440
Pomógł: 6290
Dołączył: 27.12.2004




Nie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SmokAnalog
post 3.11.2020, 20:30:04
Post #12





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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
Go to the top of the page
+Quote Post
Tomplus
post 4.11.2020, 06:18:15
Post #13





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

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


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
Go to the top of the page
+Quote Post
blokern
post 4.11.2020, 11:22:32
Post #14





Grupa: Zarejestrowani
Postów: 107
Pomógł: 0
Dołączył: 27.02.2008

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


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


--------------------
www.Opiekuj.pl
Go to the top of the page
+Quote Post
SmokAnalog
post 4.11.2020, 11:30:48
Post #15





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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ą.
Go to the top of the page
+Quote Post
Tomplus
post 4.11.2020, 15:49:09
Post #16





Grupa: Zarejestrowani
Postów: 1 828
Pomógł: 225
Dołączył: 20.03.2005
Skąd: Będzin

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


@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.

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: 29.03.2024 - 05:38