W tabeli jest 70 elementów, a zapisuje się tylko jeden - dlaczego tak się dzieje?

0

Mam taki problem mam w bazie przeszło 70 elemntów a do tablicy zapisuje się tylko 1 element i potem ten jeden elemtn jest drukowany w systemie szablonów blade daje kod.

Tu jest funkcja, która odczytuje.

     private function read_staty($page) {
    
      $read = DB::select("select page,id_usera,ip,http_user_agent,date from statystyk");
      $i = 0;
      $read3 = array();
      foreach ($read as $read2) {
	//$id_users = $read2->id_usera;
	//$user = DB::select("select name from users where id = '$id_users'");
	//foreach($user as $user2) {
	  //if ($user2->name == "") {
	    //$read2->name = "anonim";
	  //}
	  //else {
	    //$read2->name = $user2->name;
	  //}
	   //$read2->name = $user2->name;
	//}
	//$read3[0][$i] = $read2->name;
	//$read3[1][$i] = $read2->page;
	//$read3[2][$i] = $read2->ip;
	//$read3[3][$i] = $read2->http_user_agent;
	//$read3[4][$i] = $read2->date;
	//print $read2->page;
	//$i++;
      }
      return $read2;
      
    }

No i szablon blade

     <?php
    
    
    var_dump($staty);
    //@foreach ($staty as $staty2)
//{{ $staty2->date }}


//@endforeach;
    
    ?>
    
    
@for ($i = 0;$i < count($staty);$i++) 

{{ $staty->date }}
@endfor;

Dodam że funkcja var_dump też zwraca tylko 1 element tablicy.

0

Co to jest DB::select ?

0
Patryk27 napisał(a):

Co to jest DB::select ?

Zapytanie do bazy.

0

No tyle to sam wiem ;-)
Wrzuć jej kod.

0
Patryk27 napisał(a):

No tyle to sam wiem ;-)
Wrzuć jej kod.

To jest funkcja wbudowana.

0

Wbudowana w co?

3

Dobra.. mam błąd... Twoja funkcja zwraca $read2. W PHP zasięg zmiennych nie jest blokowy, więc ta linijka

foreach ($read as $read2)

przypisuje do $read2 kolejne rekordy z Twojego zapytania. Po skończonej pętli pod $read2 masz ostatni rekord i dlatego masz jeden wynik...

Zainstaluj sobie jakieś normalne IDE, typu PhpStorm (jest EAP) i plugin Php Inspections (EA Extended). On Ci będzie podkreslal takie babole. Poza tym nazywaj jakos normalnie te zmienne to też wyłapiesz takie błędy. Trudno jest wyłapać różnicę pomiędzy: read1, read2, read3.

** Na przyszłość poczyń kroki poniżej, zanim napiszesz na forum **

  1. Robiłes var_dump zaraz za $read = DB::select...? - ten krok nam pozwoli ustalić, czy dobrze się pobiera z bazy, żeby wiedzieć w którą stronę szukać.
  2. Próbowałeś odpalić to samo, ale w tinkerze? - ten krok ma wyeliminować jakiś dziwny zapisany stan twojej aplikacji i sprawdzić to samo co wyżej, tylko "w bardziej przewidywanych" warunkach.
$ php artisan tinker
> $results = \DB::select('....')
> $results
  1. Próbowałeś zrobić to samo, ale z użyciem PDO? - ten krok pomija framework, w połączeniu z dwoma powyższymi punktami jesteśmy w stanie ustalić czy framework nam coś źle wyciąga, czy problem jest po stronie bazy (np. ciągniemy nie z tej bazy/tabeli).
// dane do połączenia się z bazą
$user = 'root';
$password = '';
$dbname = 'testowa_baza';
$connection = new PDO("mysql:host=localhost;dbname=$dbname", $user, $password);
$sql = "select page,id_usera,ip,http_user_agent,date from statystyk";
$statement = $connection->prepare($sql);
$statement->execute()
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
var_dump($result); // co dostaniesz?

** Divide and Conquer.** Robisz var_dump ile wlezie i patrzysz w którym miejscu Ci znikają dane.

0
Desu napisał(a):
  1. Robiłes var_dump zaraz za $read = DB::select...?
  2. Próbowałeś odpalić to samo, ale w tinkerze?
$ php artisan tinker
> $results = \DB::select('....')
> $results

Jak odpaliłm to w tinkerze to się poprawne wartoci wyświetliły czyli wszystkie i jak jeszcze zrobiłem var_dump zaraz po $read = to też mi się wszystkie wpisy wyświetliły.

0

@pol90: Dodaje wyjasnienie

private function read_staty($page) {

    $read = [
        ["id" => 1, "name" => "foo"],
        ["id" => 2, "name" => "bar"]
    ];

    // w tym miejscu w $read są Twoje dane z bazy prawidlowo pobrane
    // a $read2 = null;
    foreach ($read as $read2) {
        // podczas każdej iteracji - a będzie ich dwie
        // do zmiennej $read2 jest przypisywany kolejny rekord
        //
        // podczas pierwszej iteracji $read2 = ["id" => 1, "name" => "foo"]
        // podczas drugiej iteracji $read2 = ["id" => 2, "name" => "bar"]
    }

    // ponieważ w PHP zasięg zmiennych nie jest blokowy, to zmienna zadeklarowana
    // wewnątrz bloku foreach jest dostępna poza nim. Zmienna $read2 nie znika
    // w magiczny sposób, tylko dalej trzyma w sobie ostatnie przypisanie
    // czyli ["id" => 2, "name" => "bar"]
    //
    // Np. w Javie, gdzie zasięg jest blokowy taki kod nie przejdzie 
    // List<Integer> result = Arrays.asList(1, 2, 3);
    //
    //  for (int number : result) {
    //      System.out.println(number);
    //  }
    //
    //  System.out.println(number); // tutaj zostanie wywalony błąd jeszcze przed odpaleniem
    //  bo zmienna number "zniknęła" w momencie gdy wyszliśm z bloku for
    //  Ale PHP to nie Java, więc nasz program szczęśliwie pójdzie dalej

    // zwracasz $read2, które = ["id" => 2, "name" => "bar"]
    // chyba chciałeś zwrócić $read (hint: bez dwójki)
    return $read2;
}
0

Więc teraz używam $read do drukowania i mam nastepującą instrukcje.

         @for ($i = 0;$i < count($staty);$i++)
{{ $staty[0][0] }}


@endfor;

I jeszcze kontroller

 private function read_staty($page) {
    
      $read = DB::select("select page,id_usera,ip,http_user_agent,date from statystyk");
      $i = 0;
     

      return $read;
      
    }

I zwraca mi błąd

Cannot use object of type stdClass as array

0

@pol90: PHP kiedyś walił błędem pod tytułem

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM

I tego można było nie zrozumieć, ale to ? :)

Cannot use object of type stdClass as array

Czarno na białym, jasno napisane co masz źle. Pewnie jeszcze dodał nr linii. Wygoogluj, poszukaj, poróbuj zmieniać swój kod, popatrz co masz w zmiennych... trochę samodzielności ;)

0

Już sobie poradziłem trzeba było tylko zamianić kolejność liczników

 	$read3[0][$i] = $read2->name;
	$read3[1][$i] = $read2->page;
	$read3[2][$i] = $read2->ip;
	$read3[3][$i] = $read2->http_user_agent;
	$read3[4][$i] = $read2->date;

na taki

 	$read3[$i][0] = $read2->name;
	$read3[$i][1] = $read2->page;
	$read3[$i][2] = $read2->ip;
	$read3[$i][3] = $read2->http_user_agent;
	$read3[$i][4] = $read2->date;
0

Nie ma za co.

1 użytkowników online, w tym zalogowanych: 0, gości: 1