Newsgroup: it.comp.www.php
Titolo: mysql_num_rows() VS select count(*)

Mi hanno chiesto di verificare a posteriori la qualitï¿œ del codice php 
prodotto da una software house su commessa di una ditta di amici.
Ho fatto un elenco di cose sistemabili facilmente, cose che richiedono 
un attimo di riflessione e cose che - a mio modo di vedere - 
assolutamente non vanno bene.
Un punto alquanto dubbio ï¿œ il seguente pezzo presente nel codice:
$Q="SELECT *
       FROM anagrafica
      WHERE categoria
       LIKE '%$codice_categoria%'";
$R=mysql_query($Q, $DB);
$numero_risultati=($R);
Il mio dubbio risiede nel fatto che non so come Mysql esegue la SELECT - 
se ad esempio estrae i dati e li appoggia in ram (o crea una bitmap dei 
record) pronto per restituirli al programma mentre invece viene usato 
solo il contatore al numero dei record trovati....
Quindi, a livello di prestazioni (sia velocitï¿œ che consumo di risorse), 
non ï¿œ meglio, in questo caso, usare una SELECT count(*) ?
Francesco

 non è meglio, in questo caso, usare una SELECT count(*) ?
se serve sapere solo il numero dei risultati, e non farli vedere, direi 
decisamente di sì.

 decisamente di sì.
Hai notizie certe alle quali posso fare riferimento ? Non vorrei che in 
questo specifico caso con una LIKE di mezzo, il motore impieghi le 
stesse risorse....
Francesco
PS: il bello è che la query è pure sbagliata perché non verifica lo 
stato del record anagrafico...

 stesse risorse....
E` abbastanza semplice. Dal punto di vista del motore non cambia quasi 
niente. Deve fare la query completa (anche se MySQL ha delle 
ottimizzazioni apposta per la forma select count(*) ).
Dal punto di vista di PHP cambia molto. Nel primo caso riceve un'area di 
memoria con tutti i risultati, nel secondo con un solo risultato.
Pero`, come dice RedWiz, se quei dati devi anche visualizzarli, oltre che 
contarli, e` meglio usare num_rows(), perche` eviti di fare due query.
Bye.

 $numero_risultati=($R);
Visto che siamo in tema di ottimizzazioni e pulizia del codice... E'
sconsigliato usare la sintassi 'SELECT * ..' ma ï¿œ meglio specificare
/sempre/ i campi che servono, anche se sono /tutti/.
Un giorno che la struttura della tabella cambia non si avranno
sorprese... oppure sï¿œ, e sarï¿œ ora dunque di mettere mano al codice PHP :-)
saluti,
M.

 contarli, e` meglio usare num_rows(), perche` eviti di fare due query.
No, è una query per avere il numero complessivo di record e creare la 
paginazione... quindi in questo caso la count(*) è la soluzione migliore.
Grazie
Francesco

 sconsigliato usare la sintassi 'SELECT * ..' 
Pulizia del codice ? Questo ï¿œ codice da buttare secondo me ! NOn l'ho 
scritto io, mi hanno solo chiesto di validarlo e sono giorni che trovo 
cose da sistemare !
La chicca ? Il campo categoria contiene i codici separati da virgole, 
esempio:
"C01,C34,C87,C23"
quindi ï¿œ necessario fare la LIKE....
Ovviamente mettere in relazione anagrafica con categorie in questo modo 
ï¿œ difficile ma sono riuscito a farlo...
In tutto il codice non c'ï¿œ una JOIN.... anche quando sarebbe una cosa 
stupidissima farlo
Praticamente sono tutte SELECT *
All'inizio ogni pagina vista generava 350 linee nell'error.log.... 
faceva tipo 3giga al giorno !
E' una trsitezza mettere mano ad un codice cosï¿œ....

 In tutto il codice non c'ï¿œ una JOIN
Dï¿œ pure ai tuoi amici che quella non ï¿œ una software house ma un
laboratorio di pasticceria. Magari fanno ottime torte, ma ï¿œ meglio che
stiano lontani dall'informatica.
	Y.

 Francesco
mysql ti conta i record 2 volte quindi per ottimizzare ti conviene fare
la select * e memorizzare il dato in una session cosi lo fa solo alla
prima query e non in tutte le pagine.
oppure senza sapere quanti sono i record trovati li spagini lo stesso
e' piu veloce di parecchio (ha solo il difetto che se i record trovati
sono == all'ultima pagina la sucessiva e' vuota
comunque io ti consiglio di dividere la cosa in 3 parti
- php (per html)
- js (che puoi fare in php ma maglio lasciarlo js)
- php per sql: restituisci i risultati in json
se devi mettere mano alla query non e' detto che devi riscrivere tutto
ha il vantaggio di essere molto veloce, lo svantaggio e che fai abuso
di js

 quindi è necessario fare la LIKE....
più che una LIKE un campo formattato in quel modo, mi fà pensare a
fare query con la clausola IN, esempio
$Q="SELECT *
FROM anagrafica
WHERE
'$codice_categoria' IN anagrafica.categoria"
senti ma... piuttosto.. questo è il codice dell'applicazione finale?
cioè, non usano prepared statement, pdo, mysqli, o robe del genere?
dimmi che quel $codice_categoria è preso pari pari da un $_GET o
$_POST che smetto di ridere (o piangere) a natale.

 $_POST che smetto di ridere (o piangere) a natale.
non proprio... ma non � sanitizzato completamente...
se vuoi ti mando una vagonata di fazzoletti di carta...


ah ok.
ma i tuoi amici questa applicazione l'hanno pure pagata?
una roba del genere è da denuncia.

 una roba del genere � da denuncia.
Concordo

 di js
Qui non ho proprio capito cosa stai suggerendo...
Francesco

 Concordo
Guarda, è successa una cosa simile a un amico del mio titolare, gli
hanno chiesto 6000 euri per un sito in flash + seo.
Non conosco flash approfonditamente, quindi su quella parte non apro
bocca (anche se devo ammettere che esteticamente non era brutto,
oddio, neanche un capolavoro, ma vabbhè).
Ma per quel che riguarda il seo, non avevano messo neanche un metatag,
niente di niente, ma anzi, avevano creato solo qualche pagina nascosta
con le keyword ripetute 1000 volte.
Sò che è un casino valutare la professionalità e la qualità finale di
un lavoro web, però sarebbe ora che si pubblicasse almeno uno
standard.
Anche perchè queste brave persone sono la 1° causa della brutta
reputazione del php

 intelligenza capisce il motivo e non f� storie.
No. Se la domanda � posta nella forma corretta non dovrebbe essere MAI 
un problema.
Se ti senti offeso dalla richiesta, perch� ti senti il pi� figo 
programmatore del mondo o perch� hai fatto 4 siti (dei quali, per�, 3 in 
joomla e il quarto scopiazzato da un how-to del 1998...) allora rifiuti 
e molli il cliente.
Se pensi che tu sia un bravo programmatore, che segui gli standard, che 
produci codice "bello" e documentato, facilmente manutenibile a 
posteriori, con query ottimizzate etc, perch� dovresti rifiutarti di 
darmi un pezzo di codice ?
Quando scegliamo un ristorante per una cena importante, o un dentista 
per curare una carie, scegliamo a caso o ci appoggiamo all'esperienza 
personale pregressa e a quella delle persone che riteniamo fidate e 
competenti ?
Se sei un programmatore che offri i servizi di sviluppo web attraverso 
il tuo sito web personale, io, non avendo la possibilit� di contattare 
referenti, cerco di formarmi una opinione e lo faccio mettendoti alla 
prova: potrei farlo pagandoti lo sviluppo di un piccolo pezzo o 
chiedendoti di mostrarmi del tuo codice...

 chiedendoti di mostrarmi del tuo codice...
Fondamentalmente sono d'accordo con te, è un pò come quando si
richiede un campione a un'azienda che produce qualcosa di 'fisico', o
appunto quando noi facciamo i colloqui e ci chiedono sempre un minimo
di portfolio.
Mhà.. non credo cmq che risolva il problema: nulla vieta loro di
mandarti un pezzo di codice preso qua e la su internet...
La cosa migliore credo sia prevedere, nel contratto, una 'verifica'
del codice prodotto da effettuare il prima possibile, ma verificando
il codice del progetto (quello che ti venderebbero in somma), e il
cliente dovrebbe avere la facoltà di scindere il contratto nel caso in
cui l'anteprima (e il prodotto finale) del codice non rispetti gli
standard.
Il problema è che questi standard non sono messi in calce da nessuna
parte, e con la regola del 'Basta che funzioni', si creerebbero sempre
delle discussioni.