Newsgroup: it.comp.www.php
Titolo: PHP e MySQL: a volte si a volte no!

Sto usando PHP per interrogare e aggiornare
un DB fatto in MySQL e, in genere, funziona
tutto bene.
Se però uso l'istruzione UPDATE per aggiornare
una tupla in una tabella, ottengo risultati
diversi a seconda del sistema su cui lavoro:
Linux FC2 - tutto ok
Linux FC1 - MySQL dice che la sintassi
	è sbagliata perchè vuole i valori
	racchiusi tra singoli apici
	Se metto gli apici è tutto ok salvo
	che il db non viene aggiornato
Win XP - Come FC1
Win XP con EasyPHP - tutto ok
COME FACCIO A ESSERE SICURO CHE FUNZIONERA'
SUL SISTEMA DI QUELLO A CUI CONSEGNERO' IL
LAVORO ?!?
grazie
 

Sapha ha scritto:

Dipende dalla versione di MySQL che stai usando...la query incriminata 
qual è?
-- 
-------------------
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
Project Admin di "PHP Reservation - Online booking system" - 
http://phpreservation.sourceforge.net
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

 
La query incriminata è
$query = "UPDATE autore SET nome=$nome,cognome=$cognome WHERE 
nome=$nome_old AND cognome=$cognome_old;" ;
Se metto gli apici (es. nome='$nome') allora ottengo l'errore
di sintassi mysql dove prima non l'avevo, e scompare dove prima
appariva. Il bello è che in entrambi i sistemi c'è lo stesso
mysql, versione 3.23.58
grazie

 nome=$nome_old AND cognome=$cognome_old;" ;
Personalmente scrivere la tua query cosi:
$query = 'UPDATE autore SET ' .
	   'nome="' . mysql_escape_string ($nome) . '", ' .
	   'cognome="' . mysql_escape_string ($cognome) . '" ' .
	   'WHERE ' .
	   'nome="' . mysql_escape_string ($nome_old) . '" AND ' .
	   'cognome="' . mysql_escape_string ($cognome_old) . '"';
-- 
I am what I am, I do what I can
L'uomo, conscio di sbagliare, persevera.

 
veramente lo era, l'ho ricomposta solo per incollarla qui
grazie lo stesso :)
cmq hai idea del perchè funziona in maniera così strana?

 cmq hai idea del perchè funziona in maniera così strana?
La prossima volta ti consiglio di postare il codice che stai realmente
utilizzando.
Aggiungi dopo la definizione della query questo codice:
print (htmlentities ($query));
e confronta i risultati sulle varie installazioni. 
La versione con gli apici e le stringhe con escaping dovrebbe
funzionare in modo corretto con qualsiasi configurazione.



Puň darsi che la soluzione possa trovarsi nella variabile php
magic_quotes_gpc.
Se impostata ad on tutti gli apici singoli, doppi, il backslash e i NULL
vengono preceduti da backslash(\). Almeno se i valori da inserire in mysql
provengono da post, get o cookie.
Comunque dall'esperienza personale nelle query dove ho avuto problemi ho
sempre utilizzato i doppi apici anche per includere i campi.
es:
$query="insert into tabella values (\"valore1\", \"valore2\", ...);
Francesco Duca
http://www.goldenweb.it

 Francesco Duca
Dico la mia!
L'SQL e il PHP sono due linguggli differenti e lo stesso dicasi per i
rispettivi ambienti: l'errore che hai è un errore SQL quindi dovresi
risolverlo come tale.
La mia esperienza mi consiglia di non affidarmi all'ambiente PHP per
risolvere eventuali pbm relativi all'ambiente del RDBMS scelto (ad esempio
l'ipostazione della direttiva magic_quotes_gpc); piuttosto dovresti renderti
forte di uno strumento che incapsuli la logica di prevenzione sui dati
passati a MySql da PHP: questa, IMHO, la strada corretta.
Ciò vuol dire banalmente che dovresti scriverti delle funzioni o una classe
di metodi, cui passare i dati che arrivano via post e che gestisca le
problematiche relative agli apici o ai vari caratteri non supportati dal
RBDMS che usi.
Meglio ancora dotarsi di classi per la gestione della connessione al DB,
della costruzione corretta delle stringhe SQL, del loro invio al db, ecc.
In ogni caso il codice inviatoti da Setec Astronomy  ( solo leggermente
ritoccato)
$nome = mysql_escape_string ($nome);
$cognome = mysql_escape_string ($cognome);
$nome_old = mysql_escape_string ($nome_old);
$cognome_old = mysql_escape_string ($cognome_old);
$query = "UPDATE autore
 SET  nome='".$nome . "', cognome='".$cognome."'
 WHERE  nome='.$nome_old."' AND cognome='".$cognome_old."'";
mi pare debba funzionare con ogni versione di MySQL!
ciao Francesco
tobb

 mi pare debba funzionare con ogni versione di MySQL!
prova a fare una query di insert con i parametri php:
magic_quotes_gpc = On
e
magic_quotes_runtime =
al cui interno inserisci dei caratteri su cui agisce mysql_escape_string()
per esempio inserendo -dell\'albero- nel database viene inserito
dell\\\'albero.
Siccome non sono stato io a postare il problema, ma Sapha, il quale si
lamentava che in alcuni ambienti le query funzionano in altri no, io ho
ipotizzato la possibile soluzione da ricercarsi, forse, in queste due
variabili di php.
Può anche darsi che mi sbaglio. Ma penso che il funzionaneto delle query che
contengono caratteri speciali sia strettamente correlato con queste
variabili php.
A meno chè non si trasformino i caratteri speciali nei loro corrispettivi
valori numerici, e in questo caso dovrebbe funzionare dappertutto.
Francesco Duca

 Francesco Duca
Ciao Francesco e grazie per lo scambio di opinioni.
Pier

[cut della Madonna]
Ragazzi, la Vs. preparazione mi spaventa!
Sfortunatamente non sono in grado di creare
le classi di cui parla tobb, sono ancora
un principiante del php :)
Cmq a questo punto dovrei riuscire lo stesso
a risolvere la situazione, grazie a tutti!!
Sapha

Sapha ha scritto:

Ah, giusto per la cronaca, avevo
il flag magic_quotes_gpc = off
l'ho messo ad On, ma non cambia
niente...
ciao!