Newsgroup: it.comp.www.php
Titolo: [semi-OT] query UPDATE MySQL

Metto il tag semi-ot perchè so che c'è qualcuno pignolo :)
ho questa query:
mysql_query("UPDATE films SET titolo='".$_POST['newtitolo']."', 
data='".$_POST['newdata']."', lingua='".$_POST['newlingua']."' WHERE 
id='".$_POST['id']."'");
$_POST['id'] è richiesto, quindi sempre presente, ma l'utente può 
decidere se andare a modificare titolo, data o lingua.
Uno o più dei tre potrebbe essere vuoto, e in quel caso vuol dire che 
l'utente non lo vuole modificare, ma facendo quella query li modificherà 
mettendoli vuoti.
Esiste un modo indolore per fargli aggiornare solo i campi non vuoti?
Non vorrei andare a imbucarmi negli if, perchè se le mie rimembranze 
matematiche non mi ingannano dovrei fare 3! if per gestire tutti i casi.
Grazie

 
Via sql non penso. Una soluzione è togliere dall'array $_POST 
(ovviamente copiando l'array) gli elementi non vuoti, poi con implode ti 
crei la stringa sql, ovvero ti fai un implode di array_keys per la lista 
dei campi e un implode del nuovo array per i valori dei campi.
	Francesco

 (ovviamente copiando l'array) gli elementi non vuoti,
Questo come si fa?

Esiste un modo indolore per fargli aggiornare solo i campi non vuoti?
Non e' li' che provi dolore. Leggi i commenti :-)
Leonardo
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?

 Non e' li' che provi dolore. Leggi i commenti :-)
a dir la verità non ci ho capito molto, ma mi pare quasi più doloroso 
che fare tanti if :D


Perchè non fai nel modo "canonico"?
fai una select del record ed assegni ai campi i relativi value.
Così con l' update ti prende i vecchi dati non cambiati ed i nuovi dati
cambiati
-- 
«·  I miei due cents  ·»

 
vero, questa mi sembra la cosa migliore:
se ho capito bene: faccio una select dell'id richiesto e memorizzo tutti 
i campi e poi sostituisco quelli che c'erano già a quelli vuoti giusto?
che tu sappia se lascio un campo del form vuoti mi basta verificare che 
sia == ""  ?




Riassumendo: il codice come l'hai impostato finora consente a chiunque
abbia accesso a UNA immagine di fare danni colossali al database :-) -
e questo anche se recuperi i dati vecchi di un film prima di salvare i
dati nuovi.
Cosa di cui peraltro non c'e' alcun bisogno, e ti crea il problema che
per cancellare un campo ci devi mettere dentro almeno uno spazio.


 
In questo modo esegui l'update anche nei campi dove c'e' già un valore.
Guarda la mia soluzione del precedente post e oppure quella di Leonardo 
(sono uguali)
	Francesco

 (sono uguali)
Vero, ma è anche la più semplice, l'ho implementata in 5 minuti di 
orologio e funziona bene.
Conta che quando vado a modificare modifico un film alla volta, 3 campi 
in totale massimo.
E, soprattutto, conta che quel db è una cosa piuttosto personale :)

 abbia accesso a UNA immagine di fare danni colossali al database :-) 
Spiegati meglio :)

 E, soprattutto, conta che quel db č una cosa piuttosto personale :)
Beh, se invece di spendere 5 minuti ne spendi 10, la soluzione ti vale 
per altre mille situazioni.
Inoltre quando estrai i campi dal db devi riquotarli prima dell'insert. 
Nel caso di 3 campi, posso capire, ne la tabella aveva 20 campi la 
situazione cambiava.
Ti ripeto, una gestione del genere la riusi in mille circostanze
	Francesco

 Ti ripeto, una gestione del genere la riusi in mille circostanze
Ammetto che hai ragione, ma per la mia situazione mi va bene quella 
soluzione (anche perchè, ne sono consapevole, non sono capace di fare 
come avete detto tu e leonardo :/ )

Spiegati meglio :)
8-D


 8-D
eddai :D



Seriamente: mi sono gia' spiegato nel primo post, c'e' pure il codice di
esempio che puoi provare da solo... se t'interessa leggi li' e poi fammi
sapere.
Per ulteriori informazioni googla "SQL Injection" e "Input Validation".


 Per ulteriori informazioni googla "SQL Injection" e "Input Validation".
ok capito tutto, farò qualche modifica, anche se la maggior parte delle 
query non vengono eseguite se $_POST['pwd'] è diversa da quel che voglio 
io ;)

koichirose ha scritto:
[cut]
Potresti provare con:
UPDATE tabella
SET Campo1 = IF($_POST[Campo1] == '', Campo1, $_POST[Campo1]),
    Campo1 = IF($_POST[Campo2] == '', Campo2, $_POST[Campo2]),
    ...
    CampoN = IF($_POST[CampoN] == '', CampoN, $_POST[CampoN])
WHERE ID = $_POST[ID]

 io ;)
Questo controllo non ti mette al sicuro!
	Francesco

     Francesco
e perchè no scusa? se non è uguale a ciò che voglio io non entra proprio 
nell'if che contiene la query

 nell'if che contiene la query
Perche' anche un utente registrato al tuo sistema, con user e password 
corretta, puň fare un sql-inj non č detto che, poichč č registrato, sia 
un bravo ragazzo!
	Francesco

 	if (isset($_POST[$postfield]))
epperò isset() non basta. Direi !empty($_POST[$postfield]) e magari 
anche strlen($_POST[$postfield]) > 0 per la sicurezza massima e totale :D
-- 
"If I have the Peter Pan syndrome, do I get to sleep with Tinkerbell?"
http://plasson.etz.it/blog

 un bravo ragazzo!
ah no sono a posto, quella pag è piuttosto personale, nessun database 
con utenti registrati, ci sono solo io e la password è unica :)

anche strlen($_POST[$postfield]) > 0 per la sicurezza massima e totale :D
No no, e' intenzionale. La stringa vuota e' un input valido: se uno
volesse svuotare un campo...
