Newsgroup: it.comp.www.php
Titolo: Come vedere con PHP se ho duplicati in campo tabella?

Ciao a tutti!
Ho un database MySQL di nome prova.
Dovrei inserire dei dati in una tabella di nome tabella.
La tabella ha 3 campi: id, nome, età
Devo verificare che nel campo di nome nome
non ci sia il dato che devo inserire.
Attribuendo al campo nome l'attributo Unique
phpMyAdmin si accorge se è già presente
nel campo nome il dato che devo inserire,
e mi da un messaggio d'errore.
Ma come ottenere un messaggio in uno script PHP?
Ho buttato giù questo codice, ma non funziona.
Infatti:
1) Se il campo non è impostato a Unique,
anche se trova nel campo nome Federica
me lo inserisce lo stesso, non dandomi nessun avvertimento.
2) Se il campo non è impostato Unique
non inserisce nulla ma mi dà il messaggio:
Dato Inserito...
Cosa che non è vera in quanto non ha inserito nulla
Potete darmi una mano a sistemerlo?
Ringraziandovi anticipatamente per l'attenzione
vi porgo i miei più cordiali saluti.
<?php
//Imposto le variabili che devo inserire nella tabella
$nome = "Salvatore" ;
$età = 28 ;
// effettuo la connessione al database
$connect = mysql_connect('localhost', 'root', '');
mysql_select_db('prova', $connect);
// Imposto la mia istruzione SQL
$sql = "select nome,count(*) as cnt from tabella group by nome having cnt > 
1";
// effettuo la query...
$query = mysql_query($sql);
// Se ho trovato dei dati doppi...
if (mysql_num_rows($query) != 0)
{
echo "Attenzione nome esistente!";
}
else
{
echo "Dato inserito...";
$inserimento_dati = mysql_query("INSERT INTO tabella VALUES ('', '$nome', 
'$età')",  $connect) ;
}
?> 

 Potete darmi una mano a sistemerlo?
<FastFood mode="off">
	In SQL, per bonificare i record esistenti, devi studiarti la sintassi
che prevede l'uso della SELECT COUNT(*) ... GROUP BY ... HAVING COUNT(*)>1;
	In PHP devi gestire gli errori con blocchi try {} catch {} e/o con le
funzioni d'errore mysql_error & C.
</FastFood>
saludos,
M.


da quel che mi risulta $query andrebbe verificata così:
if (!$query) echo "Errore";
e non come hai fatto tu, perchè quel $query è un identificatore della 
risorsa, ma se la query non è stata eseguita quell'identificatore è pari 
a 0 (cioè è false). mysql_num_rows accetta una risorsa valida, che in 
caso di errore $query non è.
Facendo come ti ho suggerito comunque non hai la certezza che l'errore 
sia associato ad un duplicato, ma anche a qualsiasi altro tipo di errore.
Dovresti piuttosto eseguire una query precedente per verificare la 
presenza di nomi duplicati e, in caso negativo, procedere con l'inserimento.

Potrei fare così:
Sapere quanti record contengono un certo valore in un determinato campo
$sql = "SELECT COUNT(*) FROM tabella WHERE nome = 'Federica' ";
Però poi come ricavo questo numero da $sql? 



$sql = "SELECT COUNT(*) as numero FROM tabella WHERE nome = 'Federica' ";
e dopo il fetch hai
$row['numero'] o $row->numero in base al tipo di fetch.


Adesso ti scrivo come farei io la tua soluzione:
$query="SELECT COUNT(*) FROM tabella WHERE nome = 'Federica'";
$resource=mysql_query($query)
if (!$resource) die ("Si è verificato un errore nella query");
$resQuery=mysql_fetch_row ($resource);
$quantita=$resQuery[0];
Spiego:
$query contiene la query testuale. Fin qui tutto ok
$resource conterrà la risorsa associata alla query. Se la risorsa è 
false, invoco la funzione die che stampa a video il messaggio di errore 
e poi automaticamente termina il listato/funzione in cui viene eseguita.
Se la query ha avuto successo, ottengo con $resQuery la prima (e unica 
riga) del risultato della query.
$quantita poi contiene il primo (ed unico) campo della prima (e unica) 
riga del risultato della query, che è appunto il tuo COUNT(*).
In alternativa puoi fare questo:
$query="SELECT nome FROM tabella WHERE nome = 'Federica'";
$resource=mysql_query($query)
if (!$resource) die ("Si è verificato un errore nella query");
$quantita=mysql_num_rows($resource);
Che è più semplice: elenca il nome di tutti gli elementi che hanno 
nome='Federica'. $quantita contiene il numero di elementi trovati 
ottenuti tramite mysql_num_rows.
Se quantita è pari a 0, allora non ci sono elementi con quel nome, se è 
pari ad 1 c'è già un elemento con quel nome. In teoria non dovrebbe 
verificarsi che sia maggiore di 1 perchè il campo è vincolato dal fatto 
che è dichiarato UNIQUE nel database.
Traltro, osservando di nuovo il tuo codice sorgente, non vedo come possa 
verificare la presenza di "Salvatore" nel database.

 Che č piů semplice:
Perfetto mi hai risolto il problema!
Sei stato gentilissimo!
Un grande grazie di vero cuore.

Il Fri, 26 Aug 2011 15:57:00 +0200, Alter ha scritto:

Potresti, ma la cosa migliore, se hai un constraint unique sul DB, e` di 
fare la insert e verificare il risultato della query.
Se fai prima la select e poi la insert dovresti perlomeno assicurarti di 
lockare la tabella prima di tutto, e slockarla alla fine, altrimenti 
rischi nel caso altri utenti stiano usando la stessa interfaccia di 
amministrazione.
E in ogni caso verificare il codice di errore e` sempre una buona cosa.
Bye.


Già, anche questo è vero, ma l'ho omesso apposta per non complicargli la 
vita. Non credo che avrà problemi di accesso concorrente.