Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]foreach i zmienne do mysql'a
apkc
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 8.12.2009

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


Wiatm!
Za pomocą funkcji foreach, otrzymuję tablice (niewiem ilu elementową) i mam takie pytanko jak pobrać z bazy danych te wiersze w których $id jest równa wartością z tablicy?

Np. funkcja zwróci mi tablicę
  1. Array(1,3,5,7,)

Więc chcępobrać z bazy wiersze w których
  1. $id=1;
  2. $id=3;
  3. $id=5;
  4. $id=7;

Jak ma poprawnie być zbudowana taka pentla?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
kchrapa
post
Post #2





Grupa: Zarejestrowani
Postów: 17
Pomógł: 3
Dołączył: 2.02.2010

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


Witaj nospor!

Wybacz za pozna odpowiedz, ale ostatnio mialem sporo pracy i nie mialem czasu odpowiedziec.

Kontynuujac bardzo ciekawa dyskusje :-)....



I. Cytat z wczesniejszego posta, w ktorym mnie zacytowales:-)

Cytat
kchrapa :
Z punktu widzenia DB nie ma to znaczenia - i tak serwer automatycznie
dokona konwersji do typu danych kolumny.

nospor :
No wlasnie, ale z punktu widzenia DB MySQL. A jak sie przesiądzie na inną:

kchrapa:
Inny system DB - np. Postgres krzyknal by Ci blad, ze podales napis tam gdzie sie
spodziewa liczby (kolumna kj to integer) -i bylo by jasne - a mysql czasami przeholowuje
z user friendly - ale to juz inna para kaloszy ;-)).

nospor:
to bedzie ból bo nabrał złych nawyków, które ty propagujesz.



Chcialbym zauwazyc, ze te dwie moje wypowiedzi dotycza innych aspektow - polaczyles je w
jedno, wyrywajac z kontekstu.

I. Pierwsza wypowiedz ("Z punktu widzenia DB..")- chodzilo o automatyczne rzutowanie
POPRAWNYCH FORMALNIE LICZB (calkowitych i rzeczywistych) przez RDBMS. Jesli poprawna liczba
bedzie w ciapkach, zaden z systemow : MySQL, PostgreSQL, Oracle, MS SQL Server czy Firebird
nie bedzie mial najmniejszych problemow. Automatycznie dokona rzutowania i nawet sie
nie zajaknie(nie jestem pewien jak z DB2 - pracowalem w nim ostatnio z 10 lat temu...i nie pamietam,
ale pewnie podobnie).

Wiec nic nie zaboli przy przejsciu aplikacji na inny rdbms... ;-)
(a jesli sie pojawi problem - bedzie to jedynie kwestia zmiany w domyslnej konfiguracji).

II. Druga wypowiedz - wstawiles ja zeby potwierdzic ostatnie Twoje zdanie moimi slowami
("to bedzie bol..") - ale ona dotyczyla innego aspektu ;-)
Tutaj chodzilo mi o sytuacje , kiedy na wejscie trafia NIEPOPRAWNA LICZBA CALKOWITA
(np. podano liczbe z czescia dziesiatna).

MySQL domyslnie wykonuje liberalna konwersje, tracac czesc informacji (ucina po
przecinku/zaokragla), dosc liberalnie w przypadku klauzuli IN zachowuje sie tez Firebird i
Oracle.
Z kolei Postgres (wraz z MS SQL Server) , jesli bedzie w ciapkach - wyrzuci blad,
jesli bez ciapkow - przemilczy sprawe dokonujac specyficznej konwersji . Czyli raczej ciapki
wplywaja pozytywnie na zachowanie systemu, jako ze wywoluja blad nie pozwalajac
serwerowi wyrzucic nieadekwatnych danych.
Oczywiscie, powyzsze zachowanie podaje dla domyslnych ustawien tych rdbms'ow.

Reasumujac - w kontekscie zapytan SQL (bo tylko o tym byla mowa) - ujecie ich w ciapki wg
mojej wiedzy nie przynosi zadnych negatywnych konsekwencji,a biorac pod uwage
postgresa i mssqlserv - wrecz przeciwnie.

Aczkolwiek - jesli sa jakies obiektywne przyczyny (nie liczac przyzwyczajenia/gustu mojego
czy Twojego), o ktorych nie wiem a z powodu ktorych nalezy z ciapkow w SQL zrezygnowac -
bede wdzieczny za informacje :-)


Ustosunkuje sie jeszcze do ostatniej Twojej wypowiedzi :

Nospor:
Cytat
Kacper:
//nasza bledna dana (zyz@cos) zamieni sie na 0 - co przestawi ilosc produktu na zero

Nospor:
Widzisz, twoja walidacja sprawdza czy jest liczbą. Jak ktoś poda 0 to Twoja walidacja to
przepusci i w efekcie dostaniesz 0 tak jak i ja robiac rzutowanie na tekscie. Widzisz jakąś
roznice w efekcie koncowym?

Kacper:
Wiec zeby uniknac powyzszego problemu, pewnie przed intval dodajesz podobna walidacje -
czyli mamy i walidacje i konwersje

Nospor:
Nie, nie robie walidacji. Ma byc liczbą wiec rzutuje na liczbe i po sprawie. Walidacja jest
tylko wowczas, jesli liczba nie moze byc zerem albo liczbą spoza jakiegoś zakresu. Ale to i
przy Twojej metodzie musialbym też dodac tę dodatkową walidacje, wiec nadal nie ma zadnego
dodatkowego narzutu.

Kacper:
Mysle - ze w tym przypadku i ciapki(u mnie) i intval( u ciebie) sa zbedne

Nospor:
Niestety nadal uwazam ze rzutowanie na liczbe jest ok a dawanie ciapkow jest złym nawykiem.


I tutaj musze Ci jednak zwrocic uwage ,ze rzutowanie bez walidacji nie jest optymalnym podejsciem i moze
spowodowac konkretne problemy. Dlaczego?

To prawda, jesli uzytkownik przy zmianie ilosci produktu wpisze zero, i moj i Twoj program
to przepusci... bo oczywiscie zerowy stan produktow jest jak najbardziej sensowny.I moim
celem nie bylo uniemozliwienie ustawienia takiej wartosci.

Stosowanie walidacji w tym przypadku jest w innym celu - przechwycenie sytuacji,jesli user
nieswiadomie poda cos,co nie jest poprawna liczba calkowita w systemie dziesietnym (a nie
znam chyba usera, ktory SWIADOMIE bedzie probowal wpisac w tym miejscu zapis szesnastkowy
lub binarny - pomijam proby atakow).

I zwroc uwage na dwa podejscia do problemu :

A. z walidacja - system odrzuci jego żądanie informujac o bledzie.Czyli user od razu dowie
sie ze jest problem i swiadomie go skoryguje.

Sedno dzialania: Walidacja nie dopusci do przeklamania danych.

Potrzebna jest tu takze walidacja, aby system RDBMS tez nie dokonal niepoprawnego
rzutowania (np. zaokraglajac liczbe zmiennoprzecinkowa).


B. bez walidacji, ale z rzutowaniem - system skonwertuje bledna dana do 0
i zaktualizuje/wstawi produkt z niepoprawna iloscia.Bez jakiejkolwiek noty dla usera.
Dla jakich danych to nastapi ? Np.:
- 0x1B
- ania'
- x3444

Zarowno intval() jak i rzutowanie (int) liczba , zmodyfikuje bledne dane - zamiast
odrzucic, zmieni "cichaczem" na zero.

Pol biedy, jesli to robi user dla pojedynczego rekordu (moze zauwazy blad) -ale jesli importuje z csv
kilkaset tysiecy rekordow,program sie nawet nie zajaknie - a doswiadczenie pokazuje,
ze w duzej czesci systemow mamy smieci ( widzialem systemy (zarowno male, jak i miedzynarodowych korporacji) gdzie w polu numer_domu bylo wpisane "zosia" )) - podobnie w plikach csv od userow czy innych zrodlach danych.

Reasumujac - na tym poziomie widac bardzo istotna roznice w efekcie koncowym miedzy naszymi
rozwiazaniami.

Walidacja jest niezbedna nie tylko wtedy, gdy nie chcesz wpuscic zera itp, bo
jesli user wpisze 'gucio' , do bazy trafia calkowicie bledne dane (choc poprawne skladniowo
z uwagi na rzutowanie).

Mysle wiec, ze powinienes jednak rozwazyc wprowadzenie walidacji tam, gdzie
robisz tylko rzutowanie.Uszczelni ona system sprawiajac,ze bedzie mniej podatny na
umieszczanie w nim nieadekwatnych informacji.


Pozdrawiam serdecznie ,
Kacper










Go to the top of the page
+Quote Post

Posty w temacie
- apkc   [MySQL][PHP]foreach i zmienne do mysql'a   1.02.2010, 22:10:47
- - Ellington   Podmien sobie, co trzeba. Kodforeach($ar...   1.02.2010, 22:15:49
- - apkc   Coś mi to nie wychodzi! Mam taki kodzik [PHP]...   1.02.2010, 22:34:44
- - melkorm   Zainteresuj się implode i MySql'owym KodI...   1.02.2010, 23:21:28
- - apkc   Dzięki za podpowiedź! Zrobiłem coś takiego: [P...   2.02.2010, 21:38:36
- - nospor   nie:('$comma_separated') a: ($co...   2.02.2010, 21:42:21
- - apkc   Już próbowałem! Po tej zmianie zwraca mi ostat...   2.02.2010, 21:45:05
- - nospor   $ph=$wiersz['ph']; no bo zakazd...   2.02.2010, 21:48:12
- - kchrapa   Witam! Problem jest w implode oraz w zapytani...   2.02.2010, 21:55:29
- - apkc   Dzięki kchrapa. Po wstawieniu [PHP] pobierz, plai...   2.02.2010, 22:12:33
- - nospor   przeciez kchrapa napisal ci dokladnie to samo z tą...   2.02.2010, 22:16:29
- - apkc   Cytat(nospor @ 2.02.2010, 22:16:29 ) ...   2.02.2010, 22:23:11
- - kchrapa   Witam! Nospor: Ehh,oczywiscie,ze nie musi b...   3.02.2010, 10:48:30
- - nospor   CytatWiec mysle, ze i ty rzucasz nimi (ciapkami) n...   3.02.2010, 10:52:58
- - kchrapa   Nie zapomnialem ;-) Kod apkc oryginalnie wygladal...   3.02.2010, 11:16:25
- - nospor   CytatNie zapomnialem ;-) Kod apkc oryginalnie wyg...   3.02.2010, 11:36:44
- - kchrapa   Nospor: Czy przeczytales moj ostatni post ze zroz...   3.02.2010, 12:52:05
- - nospor   CytatOczywiscie, ze jesli wykonasz po prostu echo ...   3.02.2010, 13:02:12
- - apkc   Panowie powoli! Ja potrzebowałem pomocy, bo je...   3.02.2010, 13:39:34
- - kchrapa   >No ale w ktorym miejscu ja napisalem, ze dane ...   3.02.2010, 13:49:39
- - nospor   Cytat,ale to powoduje dwukrotna robote w tym konte...   3.02.2010, 13:59:56
- - kchrapa   Moze nie podwojna - przesadzilem ;-) Ale dodatkowa...   3.02.2010, 15:06:43
- - nospor   Cytat//nasza bledna dana (zyz@cos) zamieni sie na ...   3.02.2010, 22:55:27
- - kchrapa   Witaj nospor! Wybacz za pozna odpowiedz, ale ...   10.02.2010, 10:41:07
- - nospor   Ale mnie nie lubisz ze zmuszasz mnie do przeczytan...   10.02.2010, 11:00:14
- - kchrapa   CytatAle mnie nie lubisz ze zmuszasz mnie do przec...   10.02.2010, 11:37:05
- - nospor   CytatDomyslnie, dla poprawnych danych nie (np. dla...   10.02.2010, 11:49:53


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

 



RSS Aktualny czas: 9.10.2025 - 15:56