Newsgroup: it.comp.www.php
Titolo: Controllo dati prima dell'inserimento

Salve, sono nuovo del newsgroup, quindi colgo innanzi tutto l'occasione per 
salutare tutti.
Vi espongo il mio problema:
Ho creato uno script che mi permette di inserire, attraverso l'uso di un 
form, dati all'interno del mio database mysql, fin qui tutto funziona.
Adesso avevo pensato bene di effettuare un controllo dei dati prima 
dell'inserimento, cioč se quei dati fossero giŕ stati inseriti.
ho utilizzato il seguente codice
<?php
$controllo=mysql_query("select data, numero, idtipo_atto from atti where 
data = \"$HTTP_POST_VARS[data]\" and numero = \"$HTTP_POST_VARS[numero]\" 
and idtipo_atto = \"$HTTP_POST_VARS[tipo]\"");
print " $controllo <br>";
if ($controllo)
{
print "L'atto risulta essere giŕ inserito!!!";
print "<br><br><a href=\"add_atto.php\">Torna alla pagina di 
inserimento</a>";
}
else
{
$inserimento=mysql_query("insert into atti (data, oggetto, numero, 
idtipo_atto) values (\"$HTTP_POST_VARS[data]\", 
\"$HTTP_POST_VARS[oggetto]\", \"$HTTP_POST_VARS[numero]\", 
\"$HTTP_POST_VARS[tipo]\")");
print "messaggio inviato con successo";
print "<br><br><a href=\"atti.php\">clicca qui per leggere il guestbook</a> 
$controllo ddd   $inserimento";
}
?>
la variabile $controllo mi da sempre e cmq come risultato "!Resource id #2 
", onestamente non so spiegarmi il perchč.
Io pensavo che if($controllo) dovesse dirmi se la variabile č piena o no, 
quindi se esiste giŕ un record con qui valori.
Dove sto sbagliando????
Grazie a tutti
Davide 

 print " $controllo <br>";
Controllo contiene la risorsa risultato della query. Da questo devi
ottenere, per poterci lavorare, un array relativo al record, ovvero
$rs = mysql_fetch_array($controllo);
La funzione mysql_fetch_array ritorna FALSE quando sei arrivato alla
fine della lista dei record. Quindi uoi implementare un ciclo di
lettura dei record così:
while ($rs = mysql_fetch_array($controllo))
{
    ....
}
Ciao,
     Fabrizio
--- website: 
http://www.negusweb.it

Grazie, provo subito.

Funziona egregiamente, riporto lo script corretto così che possa essere 
utile anche a gli altri utenti.
<?php
$controllo=mysql_query("select data, numero, idtipo_atto from atti where 
data = \"$HTTP_POST_VARS[data]\" and numero = \"$HTTP_POST_VARS[numero]\" 
and idtipo_atto = \"$HTTP_POST_VARS[tipo]\"");
print " $controllo <br>";
$rs= mysql_fetch_array($controllo);
if ($rs)
{
print "L'atto risulta essere già inserito!!!";
print "<br><br><a href=\"add_atto.php\">Torna alla pagina di 
inserimento</a>";
}
else
{
$inserimento=mysql_query("insert into atti (data, oggetto, numero, 
idtipo_atto) values (\"$HTTP_POST_VARS[data]\", 
\"$HTTP_POST_VARS[oggetto]\", \"$HTTP_POST_VARS[numero]\", 
\"$HTTP_POST_VARS[tipo]\")");
print "messaggio inviato con successo";
print "<br><br><a href=\"atti.php\">clicca qui per leggere il guestbook</a> 
$controllo ddd   $inserimento";
}
?>
Grazie ancora

 Grazie ancora
se il db e' stato progettato bene puoi anche fare una sola query..
non testato..
$inserimento = mysql_query(
 "INSERT INTO atti (data, oggetto, numero, idtipo_atto) 
  values ('{$HTTP_POST_VARS['data']}', '{$HTTP_POST_VARS['oggetto']}',
  '{$HTTP_POST_VARS['numero']}', '{$HTTP_POST_VARS['tipo']}')
");
switch ($er = mysql_errno($connection_handler)) {
 case 0:
  echo "Dati inseriti correttamente."; break;
 case 1062:
  echo "Dati gia' presenti nel db."; break;
 default:
  echo "Si e' verificato un errore imprevisto (mysql:$er).";
}
-- 
www.iuz-lab.info
 - 
www.php-faq.org

 switch ($er = mysql_errno($connection_handler)) {
Utilizzare gli errori restituiti dal mysql per verificare o meno la
presenza di un record nel db non è una cosa consigliabile, perchè in
se e per sè il reinserimento di un record già esistente non può essere
considerato "errore".
Quindi questo porta ad una minore portabilità del codice (in altri db
potrebbe non essere considerato come errore) e soprattutto evitare
problemi se questa considerazione fosse fatta dagli sviluppatori del
motore db (che toglierebbero questa segnalazione dagli errori).
A meno di utilizzare dei vincoli che però sono uno standard, a
differenza della mysql_error.


 differenza della mysql_error.
e anche questo e' vero..
[..]
ma io preferisco guardare bene quanto potrei perdere e quanto potrei
guadagnare..
la portabilita' non mi interessa piu' di tanto per motivi che non sto' a
spiegare.. ma comunque e' facilmente ottenibile anche con quel codice..
quindi facendo due calcoli.. diciamo che nel caso medio.. 33 inserimenti
vanno a buon fine e 33 risultano duplicati..
se scrivo codice error-driven.. faccio 66 query..
se scrivo codice piu' "tradizionale" faccio 99 query..
e' un discreto guadagno.. cercando di trovare un compromesso.. potrei
decidere di sacrificare una parte della portabilita' e di rendere il codice
per l'accesso al db un'po' piu' strutturato.. da questo punto di vista e'
solo una questione di gusto o design..
ma se dovessi sviluppare un'applicazione che deve spremere bene bene le
risorse.. beh la mia scelta sarebbe ovvia :-)
comunque ripeto che ti do ragione.. in genere scrivere codice che si lascia
guidare dagli errori.. non e' cosa buona..
 
-- 
www.iuz-lab.info
 - 
www.php-faq.org