Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [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
Ellington
post
Post #2





Grupa: Zarejestrowani
Postów: 76
Pomógł: 13
Dołączył: 24.03.2009

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


Podmien sobie, co trzeba.

Kod
foreach($array as $element)
{

   // SELECT * FROM tabela WHERE id = $element
   // pobrane dane wpisz np. w tabele $result[]

}
Go to the top of the page
+Quote Post
apkc
post
Post #3





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

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


Coś mi to nie wychodzi!
Mam taki kodzik

  1. $chks = array();
  2. foreach($_GET as $k => $v) {
  3.  
  4. if( substr( $k, 0, 4) == 'chk-'){
  5. $chks[]=$v;
  6. }
  7.  
  8. }

I teraz potrzebuję wstawić pętle, która zczytane wartości podstawi mi np. do
  1. $tablica_wyników=Array(1,2,3,4);


Czy możesz na tym przykładzie pokazać jak ta pętla ma wyglądać?
Go to the top of the page
+Quote Post
melkorm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Zainteresuj się

implode

i

MySql'owym
Kod
IN
Go to the top of the page
+Quote Post
apkc
post
Post #5





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

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


Dzięki za podpowiedź! Zrobiłem coś takiego:
  1. $comma_separated = implode(",", $chks);
  2. $zapytanie = "SELECT `ph` FROM `analizys` WHERE `kj` IN ('$comma_separated')";
  3. $wykonaj = mysql_query ($zapytanie);
  4. while($wiersz=mysql_fetch_array ($wykonaj))
  5. {
  6. $ph=$wiersz['ph'];
  7. }


Funkcja
  1. $comma_separated = implode(",", $chks);

Zwraca mi np. cztery wartości a z bazy jest pobrana tylko pierwsza napotkana. Co robię źle? Czy błąd jest w pętli WHILE czy co? Proszę o pomoc.
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




nie:('$comma_separated')
a: ($comma_separated)

czemu wy zawsze bez namyslu rzucacie tymi ciapkami na lewo i prawo?
Go to the top of the page
+Quote Post
apkc
post
Post #7





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

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


Już próbowałem!
Po tej zmianie zwraca mi ostatni rekord.
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




$ph=$wiersz['ph'];

no bo zakazdym obrotem petli nadpisujesz zmienną $ph (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kchrapa
post
Post #9





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

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


Witam!

Problem jest w implode oraz w zapytaniu:

1. Kiedy polaczyles implode'em tablice podales jako separator przecinek, czyli wynik:

1,2,3,4

i niby ok.

2. Ale w zapytaniu podstawiles zmienna, obejmujac ja ciapkami:
('$v_zmienna')

Czyli zapytanie przyjelo postac:

SELECT ... FROM .... WHERE `kj` IN ('1,2,3,4')

a wiec zamiast podac po przecinku kolejna wartosc dla IN'a , podales jeden string zawierajacy liczby po przecinku.

Jako ze MySQL jest mocno liberalny, obcial sobie pierwsza wartosc z listy (jedynke) i z niej skorzystal
(taki jego sposob na konwersje do liczby ;-)). Wiec dostales pierwszy wiersz z listy zamiast wszystkie cztery.

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 ;-)).

Rozwiazanie:

$comma_separated = implode("','", $chks);

- zwroc uwage na apostrofy przed i po przecinku. Czyli zapytanie przyjmie postac:

SELECT ... FROM .... WHERE `kj` IN ('1','2','3','4')

- i powinno byc ok ;-)

Podrawiam serdecznie,
Kacper

============================================
Szkolenia PHP, Warszawa

http://www.AplikacjeInternetowe.pl

Go to the top of the page
+Quote Post
apkc
post
Post #10





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

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


Dzięki kchrapa. Po wstawieniu
  1. $comma_separated = implode("','", $chks);

Daje mi coś taiego
  1. SELECT ... FROM .... WHERE `kj` IN (1','2','3','4)

Więc jeszcze coś nie tak.
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




przeciez kchrapa napisal ci dokladnie to samo z tą roznicą, ze on mysli ze kod musi wygladac tak:
IN ('1','2','3','4')
a w cale nie musi tak wygladac. wystarczy ze bedzie tak:
IN (1,2,3,4)
czyli dokladnie to co ja ci napisalem. Na dodatek podal ci zly kod do generowanie swojego zamyslu...
Go to the top of the page
+Quote Post
apkc
post
Post #12





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

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


Cytat(nospor @ 2.02.2010, 22:16:29 ) *
przeciez kchrapa napisal ci dokladnie to samo z tą roznicą, ze on mysli ze kod musi wygladac tak:
IN ('1','2','3','4')
a w cale nie musi tak wygladac. wystarczy ze bedzie tak:
IN (1,2,3,4)
czyli dokladnie to co ja ci napisalem. Na dodatek podal ci zly kod do generowanie swojego zamyslu...


Ok dzięki. Zczytuje mi wszystkie dane.

Ten post edytował apkc 2.02.2010, 22:26:03
Go to the top of the page
+Quote Post
kchrapa
post
Post #13





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

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


Witam!

Nospor:

Ehh,oczywiscie,ze nie musi byc w ciapkach (mam na mysli skladnie sql).Nie wiem skad pomysl, ze uwazam ze musi ...

Te ciapki nie sa z nadmiaru sily w palcach - tylko z przyzwyczajenia. Zabezpieczenie przed sql injection jesli nie korzystamy
z prepare/execute wymaga ich - oczywiscie w polaczeniu z mysql_real_escape_string/addslashes.
Mozna byloby zrezygnowac z tego i uzyc regexp'a wpuszczajacego tylko liczby calkowite - ale osobiscie wole to
ze soba polaczyc.

Wiec mysle, ze i ty rzucasz nimi (ciapkami) na lewo i prawo - chyba zgodzisz sie ze mna ;-)


Hmm - a tak z ciekawosci - w ktorym miejscu podalem zly kod? Patrze , patrze - i zdaje sie ze masz lepszy wzrok ode mnie...

Pozdrawiam serdecznie,
Kacper


============================================
Szkolenia PHP, Warszawa

http://www.AplikacjeInternetowe.pl


Go to the top of the page
+Quote Post
nospor
post
Post #14





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Wiec mysle, ze i ty rzucasz nimi (ciapkami) na lewo i prawo - chyba zgodzisz sie ze mna ;-)
cos jest liczba, wiec nie daje tego w ciapki a ty do mnie tekstem ze ja ciapkami rzucam? Co piles? (IMG:style_emoticons/default/winksmiley.jpg)

Cytat
Hmm - a tak z ciekawosci - w ktorym miejscu podalem zly kod? Patrze , patrze - i zdaje sie ze masz lepszy wzrok ode mnie...
No twoj kod wygenerowal:
IN (1','2','3','4)
nadal uwazasz ze to jest wlasciwy kod? Nie zapomniales o czyms?
Go to the top of the page
+Quote Post
kchrapa
post
Post #15





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

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


Nie zapomnialem ;-)

Kod apkc oryginalnie wygladal tak ( post z 21:38 ):


$zapytanie = "SELECT `ph` FROM `analizys` WHERE `kj` IN ('$comma_separated')";

czyli zmienna $comma_separated byla objeta apostrofami.

Dla tej linijki podalem nowa wersja implode ;-)

Choc oczywiscie, mozna bylo obciac tez ciapki przy zmiennej, i jego poprzedni implode bez ciapkow by zadzialal - tak jak Ty napisales.

Zdaje sie, ze nasz kolega z rozpedu (pozno juz bylo ;-)) , zastosowal obie rady (moja i Twoja) - dodal apostrofy w implode
i obcial w stringu ;-) I odwrocil sytuacje ;-)Ale, moze sie myle - tutaj apkc musialby sie wypowiedziec ;-)

>> cos jest liczba, wiec nie daje tego w ciapki a ty do mnie tekstem ze ja ciapkami rzucam? Co piles? winksmiley.jpg
Nie w tym konkretnym wypadku. Mialem na mysli ogolnie komunikacje z baza ;-) A pilem... heh, herbate jak na razie ;-)

Pozdrawiam serdecznie,
Kacper


============================================
Szkolenia PHP, Warszawa

http://www.AplikacjeInternetowe.pl





Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Nie zapomnialem ;-)

Kod apkc oryginalnie wygladal tak ( post z 21:38 ):


$zapytanie = "SELECT `ph` FROM `analizys` WHERE `kj` IN ('$comma_separated')";

czyli zmienna $comma_separated byla objeta apostrofami.

Dla tej linijki podalem nowa wersja implode ;-)

Choc oczywiscie, mozna bylo obciac tez ciapki przy zmiennej, i jego poprzedni implode bez ciapkow by zadzialal - tak jak Ty napisales.

Zdaje sie, ze nasz kolega z rozpedu (pozno juz bylo ;-)) , zastosowal obie rady (moja i Twoja) - dodal apostrofy w implode
i obcial w stringu ;-) I odwrocil sytuacje ;-)Ale, moze sie myle - tutaj apkc musialby sie wypowiedziec ;-)
Widze ze nadal nie wiesz gdzie zrobiles blad. Dobrze, wytlumacze ci to, bo widze ze robisz szkolenia wiec lepiej bys ludziom na szkoleniach tych bledow nie przekazał.
Twoj sposob:
  1. $chks = array(1,2,3,4);
  2. $comma_separated = implode("','", $chks);
  3. echo $comma_separated;
Daje tekst: 1','2','3','4
brakuje apostrofa na początku i na koncu. Nalezy wiec twoj kod poprawic:
  1. $chks = array(1,2,3,4);
  2. $comma_separated = "'".implode("','", $chks)."'";
  3. echo $comma_separated;
by uzyskac wlasciwy ciag: '1','2','3','4'

Cytat
>> cos jest liczba, wiec nie daje tego w ciapki a ty do mnie tekstem ze ja ciapkami rzucam? Co piles? winksmiley.jpg
Nie w tym konkretnym wypadku. Mialem na mysli ogolnie komunikacje z baza ;-)
To ze ty tak robisz, nie znaczy ze inni tak robią. Gdy ja wkladam do bazy liczbe 5 to wkladam do bazy liczbe 5 a nie tekst '5'.
Go to the top of the page
+Quote Post
kchrapa
post
Post #17





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

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


Nospor:

Czy przeczytales moj ostatni post ze zrozumieniem ?

>Kod apkc oryginalnie wygladal tak ( post z 21:38 ):
>$zapytanie = "SELECT `ph` FROM `analizys` WHERE `kj` IN ('$comma_separated')";
>czyli zmienna $comma_separated byla objeta apostrofami.
> Dla tej linijki podalem nowa wersja implode ;-)


Oczywiscie, ze jesli wykonasz po prostu echo na zmiennej to dostaniesz bez ciapkow zewnetrznych.
Ale apkc uzyl jej w konkretnym kontekscie - w zapytaniu SQL, gdzie zmienna BYLA OBJETA APOSTROFAMI !

Dla tego kontekstu podalem kod. I dlatego nie ma w nim bledu - bo apkc umiescil te apostrofy !
A pozniej - jak przypuszczam WYCIAL JE za Twoja rada ! Czytaj dokladnie, zanim zaczniesz krytykowac.


>To ze ty tak robisz, nie znaczy ze inni tak robią. Gdy ja wkladam do bazy liczbe 5 to wkladam do bazy liczbe 5 a nie >tekst '5'.

Proponuje abys zapoznal sie z dokumentacja php nt. danych wejsciowych - ktore sa stringiem , mimo
ze jest to liczba "z wygladu" - krotkie info jest chocby przy is_int() - http://php.net/manual/en/function.is-int.php .
Jesli dane pochodza z pliku - takze beda stringiem. Mozna je przepuszczac przez intval() , ale tez nie jest to
idealne rozwiazanie.

Nie sadze, aby apkc liste id mial wpisana z palca w skrypcie - jest to malo prawdpodobne, raczej pobieral je
z jakiegos wejscia - i jesli nie bylo to np. z bazy - to byly to stringi.

Poza tym , ufanie ze dane wejsciowe zawieraja liczby (czyli sa calkowicie bezpieczne), bo ty tak chcesz , jest naiwne i wprowadza dosc powazne zagrozenia. Wiec zanim bedziesz ludzi krytykowac za restrykcyjne walidowanie danych - zastanow sie glebiej. To ze Ty podchodzisz "lajtowo" do tematu , nie oznacza ze inni tak robia...





Pozdrawiam ,
Kacper

Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Oczywiscie, ze jesli wykonasz po prostu echo na zmiennej to dostaniesz bez ciapkow zewnetrznych.
Ale apkc uzyl jej w konkretnym kontekscie - w zapytaniu SQL, gdzie zmienna BYLA OBJETA APOSTROFAMI !
Tak, moj blad,przepraszam.

Cytat
>To ze ty tak robisz, nie znaczy ze inni tak robią. Gdy ja wkladam do bazy liczbe 5 to wkladam do bazy liczbe 5 a nie >tekst '5'.

Proponuje abys zapoznal sie z dokumentacja php nt. danych wejsciowych - ktore sa stringiem , mimo
ze jest to liczba "z wygladu" - krotkie info jest chocby przy is_int() - http://php.net/manual/en/function.is-int.php .
Jesli dane pochodza z pliku - takze beda stringiem. Mozna je przepuszczac przez intval() , ale tez nie jest to
idealne rozwiazanie.

Nie sadze, aby apkc liste id mial wpisana z palca w skrypcie - jest to malo prawdpodobne, raczej pobieral je
z jakiegos wejscia - i jesli nie bylo to np. z bazy - to byly to stringi.

Poza tym , ufanie ze dane wejsciowe zawieraja liczby (czyli sa calkowicie bezpieczne), bo ty tak chcesz , jest naiwne i wprowadza dosc powazne zagrozenia. Wiec zanim bedziesz ludzi krytykowac za restrykcyjne walidowanie danych - zastanow sie glebiej. To ze Ty podchodzisz "lajtowo" do tematu , nie oznacza ze inni tak robia...
No ale w ktorym miejscu ja napisalem, ze dane wkladam do zapytania jak leci? Jesli to ma byc liczba, to albo ją waliduje albo rzutuje na liczbe i do zapytania wkladam liczbe a nie 'tekst'.

Chodzi o to, ze dobrze do zapytania jak cos jest liczbą to nalezy to wkladac jako liczbe a nie jako tekst. To uczy dobrych nawyków na później

Cytat
Wiec zanim bedziesz ludzi krytykowac za restrykcyjne walidowanie danych - zastanow sie glebiej. To ze Ty podchodzisz "lajtowo" do tematu , nie oznacza ze inni tak robia...
A gdzie jak cie krytykowalem za walidacje danych? Ja cie krytykowalem za wkladanie liczb jako tekst (IMG:style_emoticons/default/smile.gif)

Cytat
Te ciapki nie sa z nadmiaru sily w palcach - tylko z przyzwyczajenia. Zabezpieczenie przed sql injection jesli nie korzystamy
z prepare/execute wymaga ich - oczywiscie w polaczeniu z mysql_real_escape_string/addslashes.
Conajmniej dziwne podejscie przepusczac liczbe przez mysql_escape_string. Liczb to liczba, zrzutuj na liczbe i nie bawisz sie w zadne escapowanie.
Go to the top of the page
+Quote Post
apkc
post
Post #19





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

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


Panowie powoli!
Ja potrzebowałem pomocy, bo jestem zielony w te "klocki". Odpisaliście prawie jedocześnie na ten post więc już wogóle zgłupiałem i prawda prawdą, (chyba mniej świadomie) ale połączyłem wasze sugestie w jedną i dlatego wyszły mi takie bzdury. Jeszcze raz dziękuję Wam obu za pomoc.
Go to the top of the page
+Quote Post
kchrapa
post
Post #20





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

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


>No ale w ktorym miejscu ja napisalem, ze dane wkladam do zapytania jak leci?

Masz racje - zbyt daleko idace przypuszczenie wysunalem ;-) Przepraszam.

> Jesli to ma byc liczba, to albo ją waliduje >albo rzutuje na liczbe i do zapytania wkladam liczbe a nie 'tekst'.
>A gdzie jak cie krytykowalem za walidacje danych? Ja cie krytykowalem za wkladanie liczb jako tekst

Z punktu widzenia DB nie ma to znaczenia - i tak serwer automatycznie dokona konwersji do typu danych kolumny.
Jesli mu sie nie uda - wyrzuci blad. Ale podkreslam ,ze i tak do tego nie dojdzie, bo na poziomie PHP nastapi
restrykcyjna walidacja (przy moim podejsciu) i zapytanie w ogole nie zostanie wyslane ;-)

Nie chce kruszyc kopii - obaj mamy po prostu troche rozne podejscia. Ja potencjalne liczby waliduje regexpem ,Ty
je rzutujesz.
I jak sadze - pewnie tez walidujesz - bo konwersja moze sie nie powiesc i funkcja (np. intval() lub inna) , moze zwrocic logiczny falsz - i w koncu po skonwertowaniu do int'a przez serwer DB wstawi sie wiersz z wartoscia 0 ;-) .

Masz - skadinad dobre - nawyki z innych jezykow ,ale to powoduje dwukrotna robote w tym kontekscie ;-) Nie oceniam, po prostu masz inne podejscie. Ja generalnie konwertuje tam, gdzie jest to niezbedne - jak np. w JS.

Pozdrawiam i dzieki wielkie za intensywna dyskusje ;-)
Kacper







>Conajmniej dziwne podejscie przepusczac liczbe przez mysql_escape_string. Liczb to liczba, zrzutuj na liczbe i nie bawisz >sie w zadne escapowanie.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 22.08.2025 - 14:52