Newsgroup: it.comp.www.php
Titolo: [super-newbie]dove è l'errore??

Ciao a tutti.
sto imparando un po' di php e sono alle prese con una cosa banalissima che 
però genera il seguente errore: Parse error: parse error in c:\etc....
L'errore viene dato in corrispondenza della linea contenente l'istruzione
 ($HTTP_POST_VARS['nome'].
Vi incollo le poche righe di codice. Spero sappiate aiutarmi. Grazie 
anticipatamente.
if ($HTTP_POST_VARS['submit'] == "INVIA")
 {
  $query="insert into registrazione
   (nome, cognome,indirizzo,citta,email) values
   ($HTTP_POST_VARS['nome'], <--------------------------
   $HTTP_POST_VARS['cognome'],
   $HTTP_POST_VARS['indirizzo'],
   $HTTP_POST_VARS['citta'],
   $HTTP_POST_VARS['email'])";
  my_sql_query($query) or
   die(mysql_error());
 } 

>
a parte l'uso di _POST come suggerito da Gufo Rosso.. aggiungo che se vuoi
usare un'array tra doppi apici devi anche dare il modo a PHP di capire dove
finisce il nome della variabile racchiudendolo tra parentesi graffe e per
usarlo con una query non sarebbe male racchiuderlo tra apici e farne
l'escape..
quindi.. non testato..
$_data = array();
$_data['nome']      = mysql_real_escape_string($_POST['nome']);
$_data['cognome']   = mysql_real_escape_string($_POST['cognome']);
$_data['indirizzo'] = mysql_real_escape_string($_POST['indirizzo']);
$_data['citta']     = mysql_real_escape_string($_POST['citta']);
$_data['email']     = mysql_real_escape_string($_POST['email']);
$query = "INSERT INTO `registrazione` 
 (`nome`, `cognome`, `indirizzo`, `citta`, `email`) VALUES 
 ('{$_data['nome']}', '{$_data['cognome']}', '{$_data['indirizzo']}',
  '{$_data['citta']}', '{$_data['email']}')";
my_sql_query($query); // ammesso che questa funzione tu l'abbia creata..
-- 
www.iuz-lab.info

 my_sql_query($query); // ammesso che questa funzione tu l'abbia creata..
La funzione è  mysql_query($query) . ho solo sbagliato a scrivere.
Grazie per l'aiuto

 si usa $_POST['variabile']
ho provato
if ($_POST['submit'] == "INVIA")
 {
  $query="insert into utenti
   (nome, cognome,indirizzo,citta,email) values
   ($_POST['nome'],
   $_POST['cognome'],
   $_POST['indirizzo'],
   $_POST['citta'],
   $_POST['email'])";
  mysql_query($query) or die(mysql_error());
 }
ma ho questo errore
Parse error: parse error, expecting `T_STRING' or `T_VARIABLE' or 
`T_NUM_STRING' in c:\.....
L'errore è sempre sulla riga
 ($_POST['nome'],
Scusatemi, ma ho bisogno del vostro aiuto solo il tempo necessario per 
ingranare la marcia giusta.
Grazie mille 

    (nome, cognome,indirizzo,citta,email) values (\"$HTTP_POST_VARS[nome]\",
- Le virgolette doppie NON vanno usate in SQL, hanno un significato
particolare.
- NON devi usare i nomi senza le virgolette come indici di array, perche`
sono costanti. Stai sfruttando una compatibilita` all'indietro di PHP che
andra' a sparire a breve, riempiendo tutte le pagine che hai fatto di
errori.
- NON devi piu` usare HTTP_POST_VARS, ma $_POST
- Sei estremamente esposto a SQL injection. Usa mysql_real_escape_string()
come ti hanno gia` detto.
Bye.

 come ti hanno gia` detto.
a eusto punti mi rendo conto che il libro da cui studio, "Sviluppare 
applicazioni per database con MySQL/PHP", è un po' obsoleto dato che non c'è 
di tutto questo (in effetti mi sembra si stato stampato nel 2001)
Grazie anche a te! 

 ingranare la marcia giusta.
Dai che non è difficile, soprattutto se _prima_ di chiedere sul ng si 
"chiede" al manuale ufficiale! :-)
--
rob4you

 ingranare la marcia giusta.
ho risolto! grazie a tutti. Potreste vedere se adesso il mio codice va bene? 
Lo incollo sotto: (grazie di nuovo!)
if ($_POST['submit'] == "INVIA")
{
  $nome=$_POST['nome'];
  $cognome=$_POST['cognome'];
  $indirizzo=$_POST['indirizzo'];
  $citta=$_POST['citta'];
  $email=$_POST['email'];
  $nome = mysql_real_escape_string($nome);
  $cognome = mysql_real_escape_string($cognome);
  $indirizzo = mysql_real_escape_string($indirizzo);
  $citta = mysql_real_escape_string($citta);
  $email = mysql_real_escape_string($email);
  $query="insert into utenti (nome, cognome,indirizzo,citta,email) values 
('$nome','$cognome','$indirizzo','$citta','$email')";
  mysql_query($query) or die(mysql_error());
 } 

 "chiede" al manuale ufficiale! :-)
e mi sa che è stato questo il problema dato che, come detto in un mio post, 
studio su un libro a quanto pare vecchiotto.
Grazie mille! 

 funziona tutto anche senza mettere le graffe? solo una curiosità...
forse ho capito e mi rispondo da solo... (chiedo conferma)
come consigliato da iuz, se nella query uso gli array (come _POST) devo 
mettere le graffe come per es.:
....VALUES ('{$_POST['variabile1']}', '{$_POST['variabile2']}'.....);
se invece nella query uso le variabili allora non ho bisogno delle graffe. 
Per es.:
....VALUES ('$variabile1','$variabile2', ....);
GIUSTO? 

 studio su un libro a quanto pare vecchiotto.
Il problema dei libri su php, molto più di quanto accade con un 
linguaggio di programmazione ormai definito e soggetto a poche 
variazioni (come il C/C++), hanno l'inconveniente di rivelarsi 
praticamente già obsoleti nel momento stesso in cui sono stati 
acquistati.
Se poi parliamo di un libro del 2001, ormai si tratta di "preistoria" 
per il php. :-)
Quando ho iniziato a muovere i primi passi nel php, ho avuto la fortuna 
di non comprare alcun libro, ma rifarmi direttamente al manuale php on 
line, che è davvero completo.
Solo successivamente, continuando a seguire gli aggiornamenti del 
linguaggio, ho dato anche un'occhiata a libri più "avanzati", per 
completare la conoscenza del linguaggio, potendo così capire cosa fosse 
da ritenersi "vecchio" e eventualmente come dovevo modificarlo.
Ti faccio un esempio classico: se compri un libro su php 4, 
probabilmente si parlerà di "classi" in modo marginale o sicuramente 
completamente diverso da come si parla di classi con php 5.
Questo perché nel passaggio dalla versione 4 alla 5, riguardo le classi 
è cambiato davvero parecchio: diciamo che ora (con la versione 5) si 
può davvero parlare di classi (in modo più simile, anche se con molte 
differenze, a come di possa fare per il c++).
--
rob4you

 GIUSTO?
Diciamo di si. :-)
Per maggiore completezza, e per le ragioni di questo, ti consiglio di 
dare un'occhiata al manuale alla sezione relativa alle stringhe 
single-quoted (in pratica quelle con ' ) e a quelle double-quoted (cioè 
quelle con " ).
Il manuale ti è amico. :-)
--
rob4you

   $nome=$_POST['nome'];
Anche qui, sarebbe meglio qualcosa del genere:
if (isset($_POST['nome']) && trim($_POST['nome']) != '') {
    $nome = mysql_real_escape_string(trim($_POST['nome']));
} else {
    // Vedi tu che fare...
}
E cosě per gli altri parametri.
Ciao.
-- 
Federico

> Potreste vedere se adesso il mio codice va bene? 
Diciamo che va molto meglio rispetto a prima. :-)
Ti faccio notare giusto una cosa, diciamo un livello appena superiore a 
quanto detto finora: non fai alcun controllo sui campi. Ad esempio, 
potrei comodamente inserire dei campi nome, cognome, ecc. completamente 
vuoti, senza nessun problema. Sei sicuro che vuoi questo? :-)
Altra cosa, non ha tanto senso fare:
$nome=$_POST['nome'];
$nome = mysql_real_escape_string($nome);
Per compattare potresti scrivere su una riga singola senza problemi, e 
senza perdita di leggibilità:
$nome = mysql_real_escape_string($_POST['nome']);
O anche come ti suggeriva iuz:
$data['nome'] = mysql_real_escape_string($_POST['nome']);
Ricorda in ogni caso sempre di fare i dovuti controlli, e le dovute 
operazioni sui dati ricevuti per non incorrere in situazioni 
indesiderate.
--
rob4you

 operazioni sui dati ricevuti per non incorrere in situazioni indesiderate.
Leggi la risposta di Federico in merito. :-)
--
rob4you

 alcun errore, no? :-)
mi riferisco al codice che ho postato alle 11.37

 if (isset($_POST['submit']) && $_POST['submit'] == "INVIA") {
si, infatti ho notato l'utilità di isset.
Mi sfugge ancora trim(), ma ora vedo...;-) 

 applicazioni per database con MySQL/PHP
ho avuto questo libro tra le mani se non mi sbaglio, ma non l'ho letto..
tratta gli argomenti velocemente e non si preoccupa della sicurezza.. per
iniziare va bene.. ma solo per i primi giorni.. poi cerca di passare a
qualcosa di piu' completo..
-- 
www.iuz-lab.info