Newsgroup: it.comp.www.php
Titolo: Problema di approccio

Ho questa necessità: passare al template il risultato di una query.
Non ho trovato soluzione migliore di questa (diamo per scontato di
aver eseguito la query e tutto il resto):
while($row = mysql_fetch_array())
{
	$array_tmp[] = $row;
}
E passare quindi $array_tmp.
Così, funziona.
Ma non c'è un metodo migliore? Devo sempre ciclare tutto? E' un orrore
di programmazione

Mirko ha scritto:

Se vuoi mantenere una separazione tra la logica applicativa e
presentation layer, deve esserci un elemento che permetta di
trasportare i dati da una all'altra. Nel tuo caso è un array. Non vedo
grossi problemi al riguardo. Se ci sono limiti nell'estrazione dei dati
(es. max 10 risultati) fa attenzione ad inserire queste limitazioni
all'interno della logica applicativa in modo da limitare la memoria
occupata (e' inutile effettuare una query di 1000 elementi, inserirli
in un array, se poi andrai a visualizzarne solo 10).
-- 
Vuoi distribuire il tuo sito web su CD/DVD?
Prova 
http://www.dwebpro.com/
Vuoi diventare un esperto analista PHP/MySQL?
Vieni a fare uno stage con noi: 
http://www.creativepark.it/stage/

 di programmazione
Si`, c'e` un metodo migliore e si chiama Iterator.
Mi pare che le funzioni di mysqli lo integrino gia` di loro, ma PDO 
dovrebbe farlo meglio.
In pratica "vedi" il risultato di una query come fosse un array, quindi 
passi il risultato della query al template, che con un normale foreach() 
ne estrae i dati uno alla volta.
Funziona sia con storage preallocato (alla prima chiamata legge tutto il 
resultset in memoria e poi te lo passa un po' alla volta) sia in modo 
progressivo (legge dal DB la riga solo quando sei in quel punto del ciclo).
Tutti i framework implementano una cosa del genere ma, come dicevo, gia` 
usando PDO invece delle funzioni mysql direttamente hai lo stesso 
risultato, anche se magari in forma un po' piu` grezza.
Bye.

 di programmazione
sě, mi sembra sia l'unico modo, cmq voglio dire incaspularlo in una
funzion "fetchall" (nome ripreso dalla corrispettiva python :)) nonb č
che costi molto eh!

No, scusate, non è che ho capito poi molto... se passo questo a
Smarty, poi come lo ciclo?
$obj->assign('content', mysqli_fetch_array($query));
Anche perché, provando a fare un:
print_r(mysqli_fetch_array($query));
si ferma al primo risultato
provando a fare un:
$row =  mysqli_fetch_array($query);
while($row)
{
  //...
}
il ciclo è infinito (ovviamente, non c'è incremento, giusto?)
Al contrario, utilizzando il "trucchetto" (se così lo possiamo
definire) con print_r funziona tutto, e se poi passo l'array
risultante al template lo posso utilizzare a piacere.
La mia domanda, sostanzialmente, è questa:
partendo da una query, come faccio a utilizzare un'array
"standard" (ovvero che potrò successivamente utilizzare come mi pare)?

 dovrebbe farlo meglio.
Ho dato un'occhiata, ma non ho trovato nulla (sono 24-36 ore che
googlo e cerco sulla documentazione).
Volendo restare solo con mysqli (ed eventualmente garantire una
compatibilità anche se poi lo script dovesse girare con php con mysql
invece di mysqli), mi indirizzi?

 "standard" (ovvero che potrò successivamente utilizzare come mi pare)?
function mysql_fetch_all($query)
{
$all=array()
	$rs = mysql_query($query) or die(mysql_error()); 
	while ($row = mysql_fetch_array($rs,MYSQL_ASSOC))
		$all[]=$row;
        mysql_free_result($rs);
return $all;
}
non l'ho testao ma scommetto che funziona bene

 girare con php con mysql invece di mysqli), mi indirizzi?
Non ho mai usato mysqli, sono passato direttamente a PDO.
Puoi simulare qualcosa con gli statement:
http://it2.php.net/manual/en/function.mysqli-stmt-fetch.php
Prendi l'esempio 1 e metti quasi tutto il codice nella parte controller, 
mentre passi $stmt alla view (al template). Dentro il template avrai solo
$stmt->bind_result($name, $code);
while ($stmt->fetch()) {
  printf ("%s (%s)\n", $name, $code);
}
Naturalmente funziona solo se il tuo motore di templating ti consente di 
avere codice PHP al suo interno.
Scordati la compatibilita` con mysql_*().
Con PDO e` piu` semplice e pulito:
http://it2.php.net/manual/en/function.PDOStatement-fetchAll.php
e ti torna proprio un array che puoi passare direttamente alla view (vedi 
l'esempio 1, la variabile $result).
Zend Framework, per esempio, fa una cosa simile a PDO, ma invece di un 
array torna una classe Zend_Db_Table_Rowset che implementa l'interfaccia 
Iterator, per cui oltre a poterlo trattare come un array hai a 
disposizione anche attributi e metodi per avere, per esempio, la struttura 
della tabella, i tipi dei campi, ecc.
Purtroppo se devi mantenere la compatibilita` con PHP4 devi arrangiarti a 
farti dei wrapper, ma non potrai avere la "simulazione di array" che 
richiede i magic methods introdotti con PHP5.
E` anche vero che non si dovrebbe piu` mantenere la compatibilita` con 
PHP4, visto che e` "fuori produzione".
Bye.

 Scordati la compatibilita` con mysql_*().
E allora mi sa che mi tocca usare quel while che ho postato
all'inizio :(

 non l'ho testao ma scommetto che funziona bene
Che differenza c'è tra quello che ho postato all'inizio? :o

 Che differenza c'è tra quello che ho postato all'inizio? :o
che l'ho incapsulato in un a funzione come ti dicevo io :)