Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Tworzenie tablicy elementów podczas odczytu z bazy
Forum PHP.pl > Forum > Przedszkole
php__amator
Panowie,

Obszukałem się po necie i nie znalazłem żadnego przykładu z którego mógłbym skorzystać (nigdzie nie spotkałem przykładu wprost opisującego - jeśli to wogóle możliwe - dodawania kolejnych elementów do tablicy w sposób jak sobie wymyśliłem a mianowicie:
(tak to sobie wymyśliłem) $tablica = array(wartość_x, wartość_y, kolejna wartość po rzejściu pętli odczytującej, i tak dalej);
czyli po zakonczeniu odczytu z bazy w mojej tablicy powinno się znajdować np 20 'id' określonych w zapytaniu do bazy.

czyli przykładowo coś takiego: array(3, 14, 25, 26, 28, 36, 44, 45, 75, 122, 543, ...) czy dobrze kombinuję czy to chore wymysły dinozaura ?

A może poprostu podchodzę do tematu jak chłop do "kombajna" ?

Może powinienem te dane o które mi chodzi zapisać jako string w jakiejś zmiennej ? - Potem będę się martwił jak go stamtąd wyciągnąć smile.gif

Potrzebuję podpowiedzi, jak rozwiązać taki problem.

odczytuje dane z bazy, buduje tabele i przy okazji chcialbym zbudować tablice (array) z określonym jedny elementem (id) ktory pozniej wykorzystam do

odczytania wybranych rekordow z bazy.

  1.  
  2. //...... tu oczywiscie wszystkie niezbedne dane
  3.  
  4. while ($row = mysql_fetch_array($result)) { $id = $row['id']; // jak powinno wygladac dodawanie kolejnych elementów do tablicy ?
  5.  
  6. $array[] = array('id'=>$id, ); // wartość $x wykorzystam pozniej do odtworzenia wartości z tablicy. for i = i< $x; i++; echo $array[$x]
  7.  
  8. //...... tu oczywiscie ciag dalszy
  9.  


po zakończeniu do odczytania kolejnych zapisanych w tablicy ID'ów użyję pętli 'for' a co dalej jeszcze nie wiem, pewnie gdziecto będę zapisywał smile.gif

W każdym razie utknąłem na tworzeniu zbioru z ID'ami smile.gif
Wazniak96
Dobrze robisz tylko nie rozumiem po co tworzysz drugi wymiar tablicy umieszczając w nim jeden element - id. Lepiej od razu czyli:
  1. while ($row = mysql_fetch_array($result)) {
  2.  
  3. $id = $row['id'];
  4. $array[] = $id;
  5. }


i wtedy pętlą foreach lub while. Można też ominąć całkowicie tą pętlę i od razu mysql_fetch_row() i po tej tablicy liczbowej pętlami foreach lub while.
php__amator
No właśnie to nie było do końca dla mnie jasne smile.gif
Wszak amator jestem smile.gif
Dziękuję za podpowiedź Ważniaku smile.gifsmile.gifsmile.gif

Ważniaku pomóż smile.gif

Wprowadziłem w czyn i ładnie tworzy mi tablice z wybranymi danymi, pięknie wyświetla ale juz pobierać kolejno .... nie bardzo chce.
Gdzie robię błąd ?

  1.  
  2. $result = ("SELECT * FROM stock WHERE id = $array[$i]");
  3.  
  4. echo '<div id="wynik">Wyniki:<hr size="0"<br>';
  5.  
  6. for ($i=0; $i <= $x ; $i++);
  7.  
  8. while ($row = mysql_fetch_array($result)) { echo $array[$i] . " ID: ".$row['id'].', Item: '.$row['item_id'].'<br>';
  9.  
  10. }
  11.  
  12. echo '</div>';
Turson
  1. $result = ("SELECT * FROM stock WHERE id = $array[$i]");

$array[$i] nie wiem co

  1. for ($i=0; $i <= $x ; $i++);

pętlę if otwiera się jak każdą inna { a zamyka } a masz średnik. $x co to? Chyba, ze to wycinek kodu
php__amator
OMG ale baran ze mnie sad.gif
Dzięki turson

i tu fragment kodu ...

  1. // zmienne $x to wynik wcześniejszej pętli równy ilości znalezionych obiektów z bazy.
  2. $ar = $array[$i];
  3. $result = ("SELECT * FROM stock WHERE id = $ar LIMIT 1"); // zapytanie do bazy
  4.  
  5. // $array[$i] to miała by być zmienna odczytywana z tablicy kolejno w każdym przejściu pętli więc zmieniłem ją na $ar
  6.  
  7. // czyli $ar = $array[$i];
  8.  
  9. // jeśli to miało by pomóc ....
  10.  
  11. // i teraz dalej:
  12.  
  13. echo '<div>Wynik wybierania z bazy wg id zapisanych w tablicy: <hr size="0"<br>';
  14.  
  15. for ($i=0; $i <= $x; $i++){
  16.  
  17. while ($row = mysql_fetch_array($result)) {
  18.  
  19. echo "ID: ".$row['id'].', Item: '.$row['item_id'].'<br>';
  20.  
  21. echo $i.' records. '.$ar.'<br>';
  22.  
  23. }
  24. }
  25.  
  26. echo '</div>';
  27.  


Ma to jakiś sens ? (To chyba skutek zmęczenia smile.gif )

Dzięki
Turson
  1. echo '<div>Wynik wybierania z bazy wg id zapisanych w tablicy: <hr size="0"<br>';

niedomknięte hr

Jaki cel ma mieć podwójna pętla (for+while)?
php__amator
a nie musi questionmark.gif
Myslalem ze aby odczytac kolejne elementy z tablicy $array musi byc ta petla smile.gif
Wiec petla while zrobi to samo questionmark.gif
i tylko mam dodac $i++ na koncu ?

Moje zalozenie bylo takie, ze po pierwszym odczytaniu danych z bazy drukuje liste z ktorej pozniej wybieram co mi potrzebne i tworze tablice tych elementow a nastepnie z tej tablicy odczytuje po kolei aby wygenerowac kolejna liste.
Wiem, bez sensu, dlaczego nie zrobic tego od razu podajac w zapytaniu szczegolowe informacje zeby dostac od razu potrzebne rzeczy ....
to dlatego, ze jesli zapytasz baze o jedna informacje np model dostaniesz cala mase informacji z okreslona nazwa czy modelem wiec zeby byla mozliwosc wybrac poprostu dodatkowo tylko to co cie interesuje .... itd.
A moze masz jakas koncepcje jak to zrobic inaczej ?
Lepiej ?

Pozdrawiam

Turson
No jasne, że po prostu zwiększasz w pętli while zmienną przez $zmienna++
php__amator
Czyli tak powinno dzialac ?
pokazuje mi tylko ilosc elementow w tablicy ...

[php]

$rez = "SELECT * FROM stock WHERE id = $array[$p] ORDER BY id";
echo '<div id="wynik">Results:<hr size="0"><br>';

while ($row = mysql_fetch_array($rez)) {
echo "Lp. ".$row['brand_id'].', Item: '.$row['item_id'].' '.$row['model_id'].' element '.$ar.'<br>';}
$p++;

echo '</div>';
[/php/

Czy w dalszym ciagu nie zrozumialem bo w dalszym ciagu mi nie drukuje wyniku pobierania z bazy danych z tablicy sad.gif questionmark.gif smile.gif
Turson
$array[$p] - powiedz mi co to jest i skąd się bierze?
php__amator
nieco wczesniej zadeklarowalem zmienna z nadzieja ze zadziala.
$array = array();
i w nastepnym kroku aby odczytac element z tablicy $array[$p] i pozniej juz w petli mam $p++ w celu zinkrementowania wartosci odpowiadajacej kolejnemu elementowi w tablicy

Cos bredze prawda ?
Turson
Z tego co widzę to $p inkrementujesz później niż pojawia się w zapytaniu.

Na wszelki przypadek włącz sobie wyświetlanie błędów jak nie masz
php__amator
Przed zapytaniem zmienna $p ustawiana jest na '0' i w zasadzie gdzies powinna byc porownywana z $x co by zrobic okreslona ilosc obrotow petli.
ale mowiac szczerze .... zrobilem tak i dalej ... ku....rcze nie dziala sad.gif

Jak powinienem to zrobic ?



Jak zrobie var_dump($array) widzie, ze wszystko jest jak trzeba tablica zawiera dane ale w petli while nie chce czytac kolejnych elementow z tej tablicy ...



teoretycznie powinno to wygladac tak:

  1. $x = 10;
  2. $p = 0;
  3. $array = array();
  4. $ar = $array[$p];
  5.  
  6. $rez = "SELECT * FROM stock WHERE id = '$ar' ORDER BY id";
  7.  
  8. echo '<div id="wynik">Results:<hr size="0"><br>';
  9.  
  10. echo var_dump($array).'<br>';// tu pokazuje mi wszystkie zapisane elementy odpowiadajace rekordom z bazy
  11.  
  12. while ($row = mysql_fetch_array($rez)) { echo "Lp. ".$row['id'].', brand: '.$row['brand_id'].', model: '.$row['model_id'].' '.$row['model_number'].' record '.$ar.'<br>'; $p++; }
  13.  
  14. echo $p.'</div>'; // i zamkniecie DIV'a po zakonczeniu
  15.  


czy sie myle ?
Turson
Usuń warunek w zapytaniu a wstaw
  1. LIMIT ".$x."
php__amator
Jakkolwiek zmienie w dalszym ciagu nie dostaje tego czego oczekuje.

Podrzuce wiekszy kawalek kodu to moze cos podpowiesz.

W międzyczasie znalazłem jedną ciekawostkę o ile miało to jakieś znaczenie, otóż:
wcześniej zmienna kwyglądała tak: $res = ("SELECT * FROM stock WHERE id = $array[$p]");

teraz smile.gif wygląda tak: $res = mysql_query("SELECT * FROM stock WHERE id = $array[$p]");

w wyniku czego pokazuje mi pierwszy rekord o id zapisanym w array'u
w dalszym ciągu jednak nie kontynuuje tylko poprzestaje na odczytaniu tylko tego jednego bo ...
zmienna $p = 0; smile.gifsmile.gifsmile.gifsmile.gif
Jak zmusić skrypt aby przeleciał wszystkie ID'y zapisane w array'u ?

czyli aby pętla while działała jak należy ?

powiedzmy, że w tablicy mam 5 elementów i chciałbym je wszystkie.

ghdzie umiescic i w jaki sposob zeby mi petla obracala tyle razy ile wynosi $x ?

  1.  
  2. //zmienna $x generowana wczesniej załóżmy że wynosi 10
  3.  
  4. $x = 10;
  5.  
  6. $p = 0;
  7.  
  8. $array = array();
  9.  
  10. $res = mysql_query("SELECT * FROM stock WHERE id = $array[$p] ");
  11.  
  12. echo '<div id="wynik">Results:<hr size="0"><br>';
  13.  
  14. echo 'Value of $x='.$x.'<br>';
  15.  
  16. echo 'Element of array='.$p.'<br>';
  17.  
  18. while($row=mysql_fetch_array($res)) { echo $row['model_id'].' '.$row['model_number'].' '.$row['proc_id'].' '.$row['proc_speed'].' '.$row['size_id'].' '.$row['location'].'<br>';}
  19.  
  20. echo '</div>';
  21.  


poza tym wszystko OK

Pozdrawiam


Any sugestions ?
Turson
Cytat(phpamator @ 10.12.2013, 17:00:35 ) *
w wyniku czego pokazuje mi pierwszy rekord o id zapisanym w array'u
w dalszym ciągu jednak nie kontynuuje tylko poprzestaje na odczytaniu tylko tego jednego bo ...
zmienna $p = 0; smile.gifsmile.gifsmile.gifsmile.gif

Dlatego też zaleciłem użycie LIMIT 10 zamiast warunku. Powiedzmy, że chcesz pokazać wszystkie rekordy o id 1-10, więc można
  1. SELECT * FROM stock LIMIT 10

Pokaże 10 pierwszych. Ewentualnie możesz użyć offset by pokazać np. od 31 do 93 etc.

Pytasz o to co zrobić, żeby przeleciało rekordy wg. $array[p]
Logiczne jest, że p musi się inkrementować.
  1. $p = 0;
  2. $max = 10;
  3. for($p=1;$p<=$max;$p++){
  4. $res = mysql_query("SELECT * FROM stock WHERE id = ".$p." ");
  5. $row = mysql_fetch_assoc($res);
  6. print_r($row);
  7. }
php__amator
Cytat(Turson @ 10.12.2013, 18:20:37 ) *
Dlatego też zaleciłem użycie LIMIT 10 zamiast warunku. Powiedzmy, że chcesz pokazać wszystkie rekordy o id 1-10, więc można
  1. SELECT * FROM stock LIMIT 10

Pokaże 10 pierwszych. Ewentualnie możesz użyć offset by pokazać np. od 31 do 93 etc.

Pytasz o to co zrobić, żeby przeleciało rekordy wg. $array[p]
Logiczne jest, że p musi się inkrementować.

  1.  
  2. $p = 0;
  3. $max = 10;
  4. for($p=1;$p<=$max;$p++){
  5. $res = mysql_query("SELECT * FROM stock WHERE id = ".$p." ");
  6. $row = mysql_fetch_assoc($res);
  7. print_r($row);
  8. }
  9.  


Nie przecze, ze byloby logocznie smile.gif tylko to nie tlumaczy w jaki sposob beda pobierane wartosci z array. To jest tylko petla pobierajaca 10 kolejnych rekordow smile.gif
A mi jak pewnie zauwazyles chodzi o te rekordy dla ktorych buduje array smile.gif
Czyli pobiera element 0 => 13 i zapytanie pobiera z bazy rekord 13, w nastepnym przejsciu pobiera element tablicy 1=> 19 i pobieram z bazy rekord o tym numerze itd itd az do ostatniego elementu z array'a.
Wiec jak to tutaj wkleic ?
A moze skrypt sam "wie" ze ma pobierac tylko te rekordy ktorych ID zapisalem w array questionmark.gif smile.gifsmile.gifsmile.gif


clever smile.gif


AAAA i zalapalem, dlaczego dopiero teraz questionmark.gif
Faktycznie, nie wiem dlaczego uparlem sie do petli while, zamiast od razu uzyc for i ......z glowy. ale ze mnie baran .... sorry smile.gif

Doszedlem, w koncu !

  1.  
  2. echo '<div id="wynik">Results:<hr size="0"><br>';
  3.  
  4. echo 'Value of $x='.$x.'<br>';
  5.  
  6. echo 'Element of array='.$p.'<br>';
  7.  
  8. for($p=0;$p<=$x;$p++){
  9.  
  10. $res = mysql_query("SELECT * FROM stock WHERE id = '$array[$p]'");
  11.  
  12. $row=mysql_fetch_array($res);
  13.  
  14. echo $row['model_id'].' '.$row['model_number'].' '.$row['proc_id'].' '.$row['proc_speed'].' '.$row['size_id'].' '.$row['location'].' /'.$p.'<br>';}
  15.  
  16. echo $p.'</div>';
  17.  


Noo i tak dziala jak chcialem, dlaczego nikt mnie barana nie poprawil i nie powiedzial ze zmienna $res wraz z calym zapytaniem powinna sie znajdowac wewnatrz petli questionmark.gif
A ja sie motam i motam bo nie wiedzialem, bylem przekonany, ze jesli zadeklaruje $res = .... to bedzie dzialalo a to ...nie chcialo wink.gifsmile.gif

Bardzo dziekuje za pomoc wszystkim ktorzy wzieli udzial.

Pozdrawiam i ostrzegam .... bedzie wiecej pytan smile.gifsmile.gifsmile.gif
Turson
Cytat(phpamator @ 10.12.2013, 18:16:14 ) *
Noo i tak dziala jak chcialem, dlaczego nikt mnie barana nie poprawil i nie powiedzial ze zmienna $res wraz z calym zapytaniem powinna sie znajdowac wewnatrz petli questionmark.gif

A w poście #16 to co zrobiłem? smile.gif
php__amator
Ooops, sorry, nie dotarlo do mnie najwyrazniej albo nieuwaznie przeczytalem albo moje zdolnosci analityczne ..... sa do bani smile.gifsmile.gifsmile.gif
faktycznie i dopiero po tym poscie cos mi zaswitalo.
Niemniej, dzieki smile.gif

Kolejna lekcja z ktorej cos wyciagnalem.
Od teraz bede wiedzial jak to powinno wygladac smile.gif

A przy okazji, jak ty rozwiazal bys taki problem:
wyciagasz z bazy liste produktow okreslonych w wyszukiwaniu i nastepnie poniewaz nie wszystko jest ci potrzebne chcialbys wybrac tylko konkretne rzeczy i wyrzucic na osobna liste. (zastosowalem formularz i radio buttony, generuje nowa liste z warunkiem jesli radio button=1 ok jesli nie omin) Ale moze jest jakis inny patent ?


a propo's szukam tez rozwiazania jak zrobic jakis sensowny wyszukiwacz, w tej chwili mam calkiem sprawny ale denerwuje mnie, ze mam kilka pol wzgledem ktorych budowane jest zapytanie, czy nie dalo by sie tego zrobic w formie np jednego pola.
Z drugiej strony mysle, ze musialbym wtedy dosc precyzyjnie wpisywac czego szukam. Ale czy mozliwe jest aby do wyszukania podac np tylko fragmenty nazwy
np zamiast dell powiedzmy de i numer modelu ale w jednym inpucie a nie w kilku ?
Tak jak pisalem w tej chwili mam zrobione tak:
Model: <input>
numer: <input>
itd chyba ze 7 pozycji
z tego dopiero jest generowana zmienna do zapytania $where
Wyszukuje calkiem dobrze tak na marginesie.)
Turson
Cytat(phpamator @ 10.12.2013, 18:45:19 ) *
A przy okazji, jak ty rozwiazal bys taki problem:
wyciagasz z bazy liste produktow okreslonych w wyszukiwaniu i nastepnie poniewaz nie wszystko jest ci potrzebne chcialbys wybrac tylko konkretne rzeczy i wyrzucic na osobna liste. (zastosowalem formularz i radio buttony, generuje nowa liste z warunkiem jesli radio button=1 ok jesli nie omin) Ale moze jest jakis inny patent ?

Jeśli to użytkownik z poziomu strony wybiera co ma być dalej przetwarzane to chyba innego rozwiązania nie ma, ew. takie bardziej estetyczne jak np. 1 checkbox dla każdego wyniku i w zależności czy kliknięty czy nie robisz coś.


Co do wyszukiwarki, to by działało tak, że rozbijasz explodem wyszukiwaną frazę po spacjach i w pętli szukasz wyniku dla każdego elementu tablicy (oczywiście w zapytaniu nie "=", a LIKE)
php__amator
A masz może gdzieś jakiś przykładowy skrypt z exploldowaniem ? te polecenia jeszcze do mnie nie do konca docierają wink.gif
Trochę czytałem tu i ówdzie ale moja przetwornica potrzebuje bardziej łopatologicznego wyjaśnienia co i jak działa.
Manuale ... nie szczególnie smile.gif
Pokaże ci jaki mam skrypt do szukania, (nie żebym sam go napisał, gdzieś wykopałem i trochę zmodyfikowałem dodając co nieco w celu zwiększenia ilości dostępnych parametrów do wyszukiwania. Oto on poniżej:

  1.  
  2. // ... tu oczywiście jest jeszcze spory kawałek kodu :)
  3.  
  4.  
  5. if(isset($_POST['search'])){
  6.  
  7. $wh = array();
  8.  
  9. if (!empty($_POST['brand_id']))
  10.  
  11. $wh[] = "brand_id LIKE '%$brand_id%'";
  12.  
  13. if (!empty($_POST['item_id']))
  14.  
  15. $wh[] = "item_id LIKE '%$item_id%'";
  16.  
  17. if (!empty($_POST['model_number']))
  18.  
  19. $wh[] = "model_number LIKE '%$model_number%'";
  20.  
  21. if (!empty($_POST['proc_id']))
  22.  
  23. $wh[] = "proc_id LIKE '%$proc_id%'";
  24.  
  25. if (!empty($_POST['proc_speed']))
  26.  
  27. $wh[] = "proc_speed LIKE '%$proc_speed%'";
  28.  
  29. if(!empty($_POST['location']))
  30.  
  31. $wh[] = "location LIKE '%$location%'";
  32.  
  33. if(!empty($_POST['size_id']))
  34.  
  35. $wh[] = "size_id LIKE '$size_id%'";
  36.  
  37. if (!empty($wh)){ $where = 'where '.implode(' and ', $wh); }
  38.  
  39. else{ $where = ''; }
  40.  
  41. $result = mysql_query("SELECT * FROM stock $where ORDER BY $order $sort");
  42.  


Ta forma jak pisałem wczesniej działa dobrze tylko irytuje mnie ilos inputów wink.gif
Turson
Powiedzmy, że szukasz frazy: "ala ma kota", więc rozdzielasz to:
  1. $fraza = "Ala ma kota";
  2. $wyniki=explode(" ",$fraza); // Da nam tablicę "ala" "ma" "kota"
  3.  
  4. //Tworzymy warunek zapytania
  5. $warunki=" (kolumna LIKE '%$wyniki[0]%')"; //Gdy jeden wyraz jest
  6. for ($i=1;$i<count($wyniki);$i++)
  7. {
  8. $warunki.=" and (kolumna LIKE '%$wyniki[$i]%)"; //To jest dla wielu wyrazów - szuka każdego wyrazu osobno
  9. }
  10. $query="SELECT * FROM news WHERE ".$warunki;

Dalej już chyba wiesz wink.gif
php__amator
Po długiej i żmudnej walce doszedłem ....

Mowa o zliczaniu wartości z grup rekordów czyli kwestia podjęta na początku mojego postu.

Prosta sprawa, zliczanie wartości i wyświetlanie nawet jeśli rekordów z takimi samymi produktami jest wiele i sa porozrzucane po calej bazie smile.gif

Okazało się, że wcale nie muszę ani wcale nie jest lepiej jeśli będę wprowadzając nową dostawę do bazy dopisywać do istniejących rekordów bo to zbyteczne skoro mogę spokojnie robić tak jak do tej pory czyli poprostu dopisywac kolejne rekordy nawet jeśli takie same już w bazie istnieją smile.gif
Możę i jest to bez sensu, może wbrew panującym zasadom i regułom ale działa i moje wymagania zaspokaja. Pewnie wiele osób zaraz powie ..."ale wzrasta ilość rekordów co wpływa na szybkość przetwarzania danych ..." itd A ja powiem "who cares", to nie pracuje na 386, mam do tego serwer o takich możliwościach, że i milion rekordów mu nie straszny więc ... luz nie będziemy bić piany o jakieś milisekundy.
A o to przecież chodzi ... żeby działało smile.gif

Ale wracając ...

Zapytanie z użyciem instrukcji sum, concat i group rozwiązują problem definitywnie, już zmontowałem skrypt który spokojnie sobie radzi z moim problemem i pięknie zlicza pogrupowane produkty.
Sprawdzałem i porownywalem wartości z losowo wybranych produktów, wszystko się zgadza.
Instrukcja concat tworzy stringi, natepnie grupuje, liczymy wartości z każdej grupy i mamy wszystko jasne.

Oto fragment:

  1. $pytanie =("select sum(ile),concat(pole1,' ',pole2,' ',pole3) from tabela where rodzaj = 'costam' group by concat(pole1,' ',pole2,' ',pole3) order by costam");


Nikt nie chciał podpowiedzieć ... a to takie proste ... a może nikt nie wiedział questionmark.gif? smile.gifsmile.gifsmile.gif

Pozdrawiam
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-2025 Invision Power Services, Inc.