Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]łączenie tablic
Forum PHP.pl > Forum > Przedszkole
northwest
Witam serdecznie,
Mam taki kod:
  1. function stmt_bind_assoc (&$stmt, &$out) {
  2. $data = mysqli_stmt_result_metadata($stmt);
  3. $fields = array();
  4. $out = array();
  5.  
  6. $fields[0] = $stmt;
  7. $count = 1;
  8.  
  9. while($field = mysqli_fetch_field($data)) {
  10. $fields[$count] = &$out[$field->name];
  11. $count++;
  12. }
  13. call_user_func_array(mysqli_stmt_bind_result, $fields);
  14. }
  15.  
  16. $cos2 = array();
  17.  
  18.  
  19. $mysqli = new mysqli("localhost", "root", "", "nlove");
  20. if (mysqli_connect_errno()) {
  21. printf("Connect failed: %s\n", mysqli_connect_error());
  22. exit();
  23. }
  24. $cos = array();
  25. if ($stmt = $mysqli->prepare($string)) {
  26. $stmt->execute();
  27. //$stmt->bind_result($id, $login);
  28.  
  29. stmt_bind_assoc($stmt, $cos2);
  30.  
  31. while ($stmt->fetch()) {
  32. array_merge_recursive($cos2, $cos) ;
  33. print_r($cos2);
  34. }
  35.  
  36. return $cos2;
  37. $stmt->close();
  38. }
  39. $mysqli->close()


Gdy próbuję wyświetlić nową, połączoną tablicę :
  1. foreach ($cos2 as $element)
  2. {
  3. echo $element.', <br/>';
  4. }


to dostaję tylko ostatni element tej poprzedniej... Co robię nie tak?
nospor
Przeczytaj w manualu jak uzywac array_merge_recursive bo widzę nie czytales
northwest
chodzi Ci o taki zapis: $cos2 = array_merge_recursive($cos2, $cos) ; questionmark.gifsmile.gif

jeśli tak, to nie pomogło:(
nospor
lączysz cos2 z cos a tego cos nigdzie nie ustawiasz. Nie liczac
$cos = array();
to jak ma ci cokolwiek laczyc jak ty laczysz jedną tabelę z pustą tabelą
northwest
Prawie mi się udało zwalczyć problem smile.gif mam taki kod:
  1. function odczyt ($string){
  2. $mysqli = new mysqli("localhost", "login", "", "baza");
  3. if (mysqli_connect_errno()) {
  4. printf("Connect failed: %s\n", mysqli_connect_error());
  5. exit();
  6. }
  7. $cos = array(); $cos3 = array();
  8. if ($stmt = $mysqli->prepare($string)) {
  9. $stmt->execute();
  10. stmt_bind_assoc($stmt, $cos3);
  11. while ($stmt->fetch()) {
  12. $cos = $cos3['id']."-".$cos3['login'];
  13. $cos++;
  14. //$cos = array_merge_recursive($cos2, $cos) ;
  15. //print_r($cos2);
  16. }
  17. return $cos;
  18. $stmt->close();
  19. }
  20. $mysqli->close();
  21. }


dlaczego jak wykonuje kod:
  1. $temp= odczyt("SELECT id,login FROM baza");
  2. print_r($temp);


to wyświetla mi się tylko ostatni rekord z tej tablicy?
nospor
while ($stmt->fetch()) {
$cos = $cos3['id']."-".$cos3['login'];
$cos++;
//$cos = array_merge_recursive($cos2, $cos) ;
//print_r($cos2);
}
W petli za każdym razem nadpisujesz $cos wiec nic dziwnego, że zwraca ci tylko ostatni rekord. W pętli każdy kolejny rekord nadpisuje wartość $cos
ps: czemu miało służyć $cos++ ?
Pilsener
  1. while ($stmt->fetch()) {
  2. $cos = $cos3['id']."-".$cos3['login'];
  3. $cos++;
  4. }
- a co ten kod robi? przypisujesz zmiennej cos jakieś wartości, następnie zwiększasz o jeden tą zmienną (po co a w dodatku to nie zadziała jeśli w zmiennej jest tekst), potem znów jej przypisujesz jakieś wartości i znów zwiększasz o jeden i tak aż do końca pętli while.

Zrób sobie:
  1. echo $cos;
- to będziesz widział, co jest nie tak.

I jak chcesz łączyć tablice to najpierw próbuj rozwiązań prostych:
  1. $tablica = $tablica_1 + $tablica_2;
- a dopiero gdy te zawiodą bierz się za array_merge_recursive

I jeśli używasz PHP to poczytaj najpierw o funkcjach i słowie kluczowym return:
  1. return $cos;
  2. $stmt->close();
bo zaraz będziesz miał pretensje:
  1. return $cos;
  2. echo 'ktos';
- dlaczego nie echuje nic na ekran.
northwest
Cytat(nospor @ 19.01.2011, 12:18:42 ) *
while ($stmt->fetch()) {
$cos = $cos3['id']."-".$cos3['login'];
$cos++;
//$cos = array_merge_recursive($cos2, $cos) ;
//print_r($cos2);
}
W petli za każdym razem nadpisujesz $cos wiec nic dziwnego, że zwraca ci tylko ostatni rekord. W pętli każdy kolejny rekord nadpisuje wartość $cos
ps: czemu miało służyć $cos++ ?


to $cos++ miało dodawać do talicy jako kolejna wartość winksmiley.jpg
jak to najlepiej zrobić?
to jest funkcja, wiem po co tam jest return winksmiley.jpg
d3ut3r
jeżeli w pętli tworzysz elementy tablicy to zrób to mniej więcej tak:

  1. foreach ($records as $record){
  2. $cos[]=$record; //z każdą iteracją zmienna $record zostanie przypisana jako nowa wartość tablicy $cos i znajdzie się na jej końcu.
  3. }


to tylko przykład, co do return to chyba coś nie bardzo Ci wyszło z kodu z pierwszego postu wynika, że $stmt->close(); nigdy się nie wykona. Natomiast w przypadku gdy warunek if ($stmt = $mysqli->prepare($string)) nie zostanie spełniony funkcja w ogóle nie ma return. Poza tym nie bardzo widzę sens tej funkcji jako argument żądasz zapytania do bazy ale jeżeli zrobisz: odczyt("SELECT imie,nazwisko FROM tabela") to jaki sens ma wówczas ta funkcja skoro na sztywno odczytujesz nazwy kolumn ?
northwest
Cytat(d3ut3r @ 20.01.2011, 05:55:29 ) *
jeżeli w pętli tworzysz elementy tablicy to zrób to mniej więcej tak:

  1. foreach ($records as $record){
  2. $cos[]=$record; //z każdą iteracją zmienna $record zostanie przypisana jako nowa wartość tablicy $cos i znajdzie się na jej końcu.
  3. }


to tylko przykład, co do return to chyba coś nie bardzo Ci wyszło z kodu z pierwszego postu wynika, że $stmt->close(); nigdy się nie wykona. Natomiast w przypadku gdy warunek if ($stmt = $mysqli->prepare($string)) nie zostanie spełniony funkcja w ogóle nie ma return. Poza tym nie bardzo widzę sens tej funkcji jako argument żądasz zapytania do bazy ale jeżeli zrobisz: odczyt("SELECT imie,nazwisko FROM tabela") to jaki sens ma wówczas ta funkcja skoro na sztywno odczytujesz nazwy kolumn ?

Dzięki, zadziałało smile.gif
  1. function odczyt ($string, $pola){
  2. $mysqli = new mysqli("localhost", "root", "", "");
  3. if (mysqli_connect_errno()) {
  4. printf("Connect failed: %s\n", mysqli_connect_error());
  5. exit();
  6. }
  7. $cos = array(); $cos3 = array();
  8. if ($stmt = $mysqli->prepare($string)) {
  9. $stmt->execute();
  10. stmt_bind_assoc($stmt, $cos3);
  11. while ($stmt->fetch()) {
  12. $cos[] = $cos3['id']."-".$cos3['login'];
  13. }
  14. return $cos;
  15. $stmt->close();
  16. }
  17. $mysqli->close();
  18. }


mam teraz taki kod, chyba wszystko już jest ok? co myślisz o wydajności takiej funkcji?

Sensem działania tego kodu ma być wygenerowanie tablicy z danymi z mysql i późniejsza ich obsługa/obróbka w php...
takie rozwiązanie będzie szybsze/optymalniejsze?
nospor
Jesli te dane mają sie nadawac do jakiejkolwiek obrobki później to:
nie:$cos[] = $cos3['id']."-".$cos3['login'];
a: $cos[] = $cos3;
lub: $cos[$cos3['id']] = $cos3['login'];
northwest
Cytat(northwest @ 20.01.2011, 20:57:13 ) *
Dzięki, zadziałało smile.gif
  1. function odczyt ($string, $pola){
  2. $mysqli = new mysqli("localhost", "root", "", "");
  3. if (mysqli_connect_errno()) {
  4. printf("Connect failed: %s\n", mysqli_connect_error());
  5. exit();
  6. }
  7. $cos = array(); $cos3 = array();
  8. if ($stmt = $mysqli->prepare($string)) {
  9. $stmt->execute();
  10. stmt_bind_assoc($stmt, $cos3);
  11. while ($stmt->fetch()) {
  12. $cos[] = $cos3['id']."-".$cos3['login'];
  13. }
  14. return $cos;
  15. $stmt->close();
  16. }
  17. $mysqli->close();
  18. }


mam teraz taki kod, chyba wszystko już jest ok? co myślisz o wydajności takiej funkcji?

Sensem działania tego kodu ma być wygenerowanie tablicy z danymi z mysql i późniejsza ich obsługa/obróbka w php...
takie rozwiązanie będzie szybsze/optymalniejsze?



oki, dzięki smile.gif

ps. co myślisz o praktyczności takiego rozwiązania?
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.