Dołącz do zespołu ekspertów! Backend lub Frontend Developer?

Sprawdź najnowsze oferty pracy naszego partnera - 8lines.io!

Pobieranie użytkowników z bazy i fetchowanie

PHP  Założony przez  Patryk Stefański.

Przy próbie pobrania z bazy użytkowników i wsadzenie ich do jakiejkolwiek tablicy kończy się albo błędem, albo nieoczekiwanym rezultaltem.
Kiedy robię to w ten sposób
<?php

  
try {
      $query $db->prepare('SELECT * from users JOIN groups on users.gid = groups.gid ORDER BY users.uid ASC');
      $query->execute();
      $num_results $query->fetchColumn();
      for ($i=$i<$num_results$i++) {
          $rows[] = $query->fetch(PDO::FETCH_ASSOC);
      }
      $theme->assign('rows'$rows);
      $theme->display('users.tpl');
  } catch (PDOException $error) {
      exit('Database error' $error->getMessage());
  
To wyświetlany jest 2 użytkownik tylko "n+1"

Kiedy używam ->fetchAll() lub ->fetch(PDO::FETCH_ASSOC)
Strona zwraca mi błąd pamięci
[b]Fatal error[/b]: Allowed memory size of 134217728 bytes exhausted (tried to allocate 100663304 bytes) in

Jest to tylko 2 użytkowników w bazie, a zwraca tego, którego ID jest 2

users.php
<?php

  
try {
      $query $db->prepare('SELECT * from users JOIN groups on users.gid = groups.gid ORDER BY users.uid ASC');
      $query->execute();
      $num_results $query->fetch(PDO::FETCH_ASSOC);
      for ($i=$i<$num_results$i++) {
          $rows[] = $query->fetch(PDO::FETCH_ASSOC);
      }
      $theme->assign('rows'$rows);
      $theme->display('users.tpl');
  } catch (PDOException $error) {
      exit('Database error' $error->getMessage());
  
users.tpl
<section class="containter-fluid">
  <div class="row d-flex justify-content-center">
    {foreach $rows as $user}
    {$user.uid}
    {$user.email}<br />
    {/foreach}
  </div>
</
section
Zapytanie powinieneś zapisać w cudzysłowie a nie w apostrofie, to raz.
Dwa, to nie pobieraj wszystkich kolumn tylko te, które potrzebujesz, zmniejszysz zapotrzebowanie na zasoby.
Trzy, jak chcesz się posługiwać tablicą we wszystkich wynikach, to przekaż odpowiedni parametr już w konstruktorze. Przykład: https://phpdelusions.net/pdo#dsn

A co do problemu, to powinieneś zrobić to w taki sposób:
<?php

$sql 
"SELECT ...";

$query $db->prepare($sql);
$query->execute();
$users $query->fetchAll();

var_dump($users);

foreach(
$users as $key => $user) {
 
   ...


Teoretycznie nawet nie musisz używać pętli do tego, bo wystarczy że przekażesz zmienną $users na front i tam użyjesz pętli do wyświetlenia.
Jak zawsze pomocny.
Co do PDO DSN, to mam tak, ale pomimo ATTR default fetch mode na assoc to nie zawsze działało
$db = new PDO("mysql:host={$config['db_host']};dbname={$config['db_name']};charset=utf8"$config['db_user'], $config['db_password'], [
      
PDO::ATTR_EMULATE_PREPARES => false,
      
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    
]); 
No to musiałeś gdzieś nadpisywać seta, bo to niemożliwe, że nie zawsze zawracało tablicę.

Ewentualnie spóbuj to w ten sposób:
<?php

try {
 
   $dns 'mysql:host=%s;dbname=%s;charset=utf8';

 
   $db = new PDO(sprintf($dns$config['db_host'], $config['db_name']), $config['db_user'], $config['db_password']);
 
   $db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
 
   $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODEPDO::FETCH_ASSOC);
 
   $db->setAttribute(PDO::ATTR_EMULATE_PREPARESfalse);
}
catch (\
Exception $e) {
 
   die($e->getMessage());


Tylko teraz mam pytanie. $config jest globalem? :/
Bo plik conf_global zwraca tablice z danymi
<?php
  
return [
    
'db_host' => 'localhost',
    
'db_user' => 'root',
    
'db_password' => '',
    
'db_name' => 'pa'
]; 

Napewno nie nadpisywałem bo mam tylko jedno $db = new pdo(), reszta połączeń już się odbywa poprzez
$query $db->prepare()
etc... 



Użytkownicy przeglądający ten wątek:

3 gości