Newsgroup: it.comp.www.php
Titolo: Una mano per questo script

Ciao a tutti, avrei bisogno una mano..
Ho realizzato un piccolo sito internet per il nostro centro assistenza e 
vorrei fare in modo che i clienti, inserendo l'imei del telefono, 
possano controllare lo stato della loro riparazione. Non dovrebbe essere 
complicatissimo essendo il nostro gestionale interno basato su un server 
MySQL. Quindi pensavo di mettere sul sito uno script del genere:
SELECT Cliente, Marca, Modello, DifettoDichiarato, StatoAssistenza FROM 
`riparazioni` WHERE `Seriale` = 356920012770672"
Ho fatto qualche prova e dovrebbe andare bene, ma mi sorgono delle 
domande: Come faccio a integrare tutto in un motore di ricerca sul sito? 
Intendo dire: Il cliente dovrà semplicemente inserire il suo "Seriale" 
nel campo di ricerca, e da li dovrà partire la query.
Grazie
Gianluca

nel campo di ricerca, e da li dovrà partire la query.
Una cosa molto molto semplice e senza nessun rispetto per MVC, HTML, CSS
e XML, ma che puoi/devi sistemare tu a tuo gusto leggendo il manuale:
<?php
	if (isset($_REQUEST['imei']) && isset($_REQUEST['cliente']))
	{
		$imei = $_REQUEST['imei'];
		if (!preg_match('/^[\d]+$/', $imei))
			$imei = 'puppamelo sulla pasta';
		$conn = mysql_connect(leggi il manuale);
		mysql_select_db(leggi il manuale);
		$cli	= mysql_real_escape_string($_REQUEST['cliente']);
		$exec = mysql_query("SELECT... WHERE Cliente='$cli' AND
Seriale = '$imei' ORDER BY a tua scelta, una data non ci starebbe male;");
		if (0 == mysql_num_rows($exec))
		{
			// Ci vorrebbe ob_start piu' sopra, v. manuale
			Header('Location: imei-not-found.html');
			die();
		}
		print "<table>";
		while($tuple = mysql_fetch_array(leggi il manuale))
		{
			print "<tr><td>";
			print implode("</td><td>", $tuple);
			print "</td></tr>";
		}
		print "</table>";
		die();
	}
?>
<html>
<body>
<form method="post" action="?">
<input type="text" name="cliente" value="inserisci nome cliente" />
<input type="text" name="imei" value="inserisci IMEI" />
<input type="submit" value="cerca" />
</form>
</body>
</html>
Leonardo macellaio
-- 
The thoughts of others were light and fleeting,
Of lovers' meeting, or luck, or fame.
Mine were of trouble, and mine were steady:
So I was ready when trouble came.

 e XML, ma che puoi/devi sistemare tu a tuo gusto leggendo il manuale:
CUT
Grazie, appena ho due minuti liberi ci smanetto.
Gianluca

 		if (0 == mysql_num_rows($exec))
E' un po che vedo questa moda di fare gli IF al contrario,
io non ci credo che siano più leggibili.
E' come dire:
se bianco == muro
azzarola, se il muro è bianco, no se il bianco è muro.
E' il muro che deve essere bianco, non il bianco che
deve essere sul muro.
if (mysql_num_rows($exec) == 0)
anche nella documentazione di Zend c'è questa (imho) superpessimissima
abitudine di confrontare il valore con una variabile piuttosto che una
variabile con il rispettivo valore.
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

 
Il motivo non è essere più leggibile IMHO
vedi differenze tra questi due?
if (0 == $variabile)
if ($variabile == 0)
ovviamente fanno la stessa cosa, ma immagina che in un momento di 
distrazione invece di scrivere == scrivi =
if (0 = $variabile)
if ($variabile = 0)
con la prima versione è lui a dirti che c'è qualcosa che non va, con la 
seconda: se lo script è lungo... trovalo dove è il problema! ;)

 seconda: se lo script è lungo... trovalo dove è il problema! ;)
Quello che dici è vero, ma va praticamente contro ad ogni concetto
di programmazione, ogni libro, ogni documento e quant'altro.
non dico che sia scorretto, ma mi sembra solo fuori standard.


 non dico che sia scorretto, ma mi sembra solo fuori standard.
Beh, i concetti di programmazione, i libri e quant'altro sono frutto di 
abitudini.
Fino a poco fa si usava e trovava sempre il modo "corretto 
concettualmente", cioè confrontare una variabile con una costante, da un 
po' di tempo si trova sempre più spesso il "modo errato", cioè 
confrontare una costante con una variabile.
Immagino che si possa chiamare _evoluzione_, per chi non c'è abituato è 
brutto da vedere, ma è una di quelle cose che può farti risparmiare una 
giornata di bestemmie.
Un assegnamento dentro un if, a meno di non avere test proprio per qualla 
parte, è difficile da trovare e il probabile bug può uscire fuori anche 
parecchio tempo dopo di aver mandato il software in produzione... uno di 
quei bug che si verificano soltanto in alcuni casi e in altri no e che 
sono difficilmente riproducibili... per me sarebbe meglio cambiare 
abitudini e far "evolvere" lo standard :)

 abitudini e far "evolvere" lo standard :)
Hai ragione, ma non è solo questioni di abitudini bensì di logica
e di italiano
Tu verifichi se una determinata cosa corrisponde ad un determinato
valore e non se un determinato valore corrisponde ad una determinata
cosa.
Anche nei ragionamenti, tu ragioni dicendo:
"se le mele sono mature, faccio questo"
e non
"se mature sono le mele"
Hai ragione, ti evita una giornata di bestemmie, ma personalmente
mi trovo meglio a ragionare in Italiano che in un
linguaggio di programmazione, anche quando devo leggere il codice.
Se poi ti dimentichi un = quando confronti due variabili?
Non ti da errore. Quindi il workaround può funzionare solo e
soltanto in un caso specifico, e presumo in tutti gli altri
valga ancora il concetto di verificare se una variabile corrisponde
ad un valore e non se il valore corrisponde ad una variabile.
Ovvero
0 == $pippo
$attivato == $pippo
tu verifichi che attivato sia pippo? Dubito,
scommetto che metteresti "$pippo == $attivato" ed in
tal caso avresti due modi di operare (e due chiavi di lettura)
per fare la stessa cosa che è tutto tranne che vantaggioso,
sopratutto se devono metter mano al codice più persone.
Tutto imho.


 Tutto imho.
Ovviamente con due variabili utilizzo "$pippo == $attivato" perché il 
rapporto costi/benefici non è più vantaggioso.
Comunque non è che c'è un modo corretto eh... sono due stili differenti.
Io preferisco quello che con un minimo di flessibilità mi permette di 
ridurre errori banali e di distrazione, altri preferiscono avere un unico 
modo di operare...

 non dico che sia scorretto, ma mi sembra solo fuori standard.
Chi viene da Java sa benissimo quanto questo approccio sia comodo,
perché si evita a monte il problema potenziale di confrontare qualcosa
che sarebbe null con qualcos altro.
Es.
if (miaVar.equals("pippo"))
se miaVar è null, hai un bel botto :)
allora devi mettere
if(miaVar!=null && miaVar.equals("pippo"))
se metti
if ("pippo".equals(miaVar))
il confronto con pippo e un null è ammesso.
saludos,
M.

di programmazione, ogni libro, ogni documento e quant'altro.
Be', proprio OGNI libro no.
Io l'ho trovata la prima volta su "Writing Solid Code" di Steve Maguire
(Microsoft Press. To think I bought it for the lulz).
Leonardo


 Leonardo macellaio
rotfl

 che sarebbe null con qualcos altro.
Ma questo non è java.
Programmare in un linguaggio facendo finta che sia un
altro è l'errore più grosso che possa fare un programmatore, IMHO.

 (Microsoft Press. To think I bought it for the lulz).
Be, ogni libro, come gistamente dici, no.
Anche io l'ho visto, in un libro che trattava C++, mi pare.
Però a fronte di 10 libri, se 1 fa in questo modo, non fa media...
Ripeto, non è sbagliato, anzi, forse è il metodo corretto, però
imho è più intuitivo e manutenibile scrivere nel metodo "standard"

 variabile con il rispettivo valore.
credo che in PHP l'abitudine abbia senso anche per il type juggling:
l'interprete va da destra a sinistra, se metti per prima una costante
il cui type è definito, suggerisci il type della variabile che
altrimenti verrebbe "dedotto" in maniera magari non sempre
desiderabile.
bye!

 desiderabile.
Puoi fare un esempio concreto?


 Puoi fare un esempio concreto?
Se scrivi "if (0 == $pippo)" quello che ottieni è sicuramente un
confronto tra interi, così come se scrivi "if (true == $flag)"
sicuramente avrai un confronto tra booleani. Se metti prima la
variabile, e questa in precedenza è stata "battezzata" con un tipo
diverso, potresti avere come risultato un'espressione valutata
diversamente.
Al momento ho un po' di problemi a mettere in piedi una proof of
concept, dato che nella maggior parte dei casi php riesce a far
funzionare decentemente il type casting automatico, ma per quello che
costa non la vedo sbagliata come tecnica - anche se sinceramente
anch'io opto più per la leggibilità "umana" del codice e preferisco
scrivere i confronti più in stile "natural language", usando altre
tecniche per evitare di incasinarmi con i tipi...
bye!

 tecniche per evitare di incasinarmi con i tipi...
Non vorrei che si arrivasse a contrarre troppo (come ad esempio evitare
del tutto il casting delle variabili perchè tanto lo fa PHP) tirando
fuori zozzerie in stile perl in cui puoi fare persino gli if al
contrario inserendo prima il comando, poi la condizione:
$pippo = 'ciao' unless ( 1 != 2 )


 contrario inserendo prima il comando, poi la condizione:
Eh, perchè tutti i vari "mysql_connect() or die" di cui sono ancora
pieni gli script php che vedi in giro secondo te da cosa
derivano :^)?
(Odio il perl con tutta l'anima, specifico)
bye!

 (Odio il perl con tutta l'anima, specifico)
E' diverso, li ti viene eseguito un die nel caso l'operazione
non vada a buon fine, ed anche io lo uso.
l'unless del perl invece fa fare ogni operazione negando
quella precedente.
e' praticamente un if inserito DOPO il codice, come l'orrendo
do/while che andava di moda anni fa anche in php.
Se fai:
do {
    ...
    ...
    milioni di righe di codice
    ...
    ...
} while ( 1 == 1 ):
per vedere la condizione devi scorrere milioni di righe di codice.
Sarò vecchio stile, ma secondo me il codice VA letto da sopra a sotto
e da destra a sinistra, di conseguenza, PRIMA metti le condizioni, POI
metti il codice.
se metti prima il codice e poi le condizioni, per leggere il codice devi
andare prima in basso, poi tornare sopra, poi tornare sotto dopo il ciclo.


 pieni gli script php che vedi in giro secondo te da cosa derivano :^)?
Dal C! ;)
Bye.
P.S.: Anche io odio perl.

 seconda: se lo script è lungo... trovalo dove è il problema! ;)
attenzione alle prstazione della cosa perche cambia parecchio tra
if ($variabile == 0)
e
if (0 == $variabile)

 per vedere la condizione devi scorrere milioni di righe di codice.
beh ma lì lo sbaglio è mettere milioni di righe dentro un unico code
block ;^)
bye!

 non dico che sia scorretto, ma mi sembra solo fuori standard.
Puoi citare un riferimento?

 Puoi citare un riferimento?
Un libro a caso scritto in occidente, ne prendi uno a caso, 
e troverai scritto:
$variabile == $valore
Preferisco usare il casting piuttosto che far fare la rilevazione
dei tipi di dato a PHP come si parlava in precedenza.
Preferisco fare
(int)$variabile == (int)$valore
L'unico vantaggio sarebbe quello di evitare "=" anzichè "==" ma
preferisco avere un codice più leggibile e fare maggiore attenzione
quando scrivo (non mi è mai capitato di mettere un solo = anzichè 2,
sinceramente) piuttosto che dover scrivere contro la mia stessa logica.
Anche per questioni di manutenzione al codice, nel caso ci dovessero
lavorare più persone.

 $variabile == $valore
Non è un riferimento, è solo una questione di gusti personali e di 
abitudine, però cerchi di farlo passare per "standard".

 abitudine, però cerchi di farlo passare per "standard".
Io non cerco di far passare proprio niente, si stava solo parlando,
tant'è che ho scritto più e più volte IMHO ed ho anche scritto che
SECONDO ME è più corretto seguire la logica di ragionamento attuata
nel mondo occidentale, in cui scrivi da sinistra a destra (e non
viceversa) ed in cui verifichi che un dato oggetto abbia un dato
valore e non l'opposto, sopratutto se fare l'opposto serve
esclusivamente a fixare un probabile bug.
Comunque sia, quando su 1000 libri di praticamente tutti i linguaggi
di programmazione, 995 espongono tutti lo stesso modo di operare, e
gli altri 5 espongono ugualmente lo stesso metodo ma mettono una nota
a piè di pagina che ne indica i pericoli, si, quello è uno standard,
http://it.wikipedia.org/wiki/De_facto