8791 sujets

Développement web côté serveur, CMS

Bonjour
Pour mettre à jour une base, je teste d'abord l'existence de l'enregistrement par un ordre SELECT et, en fonction du retour, je fais un INSERT ou un UPDATE.

Ma table est vide (vérifié avec phpMyAdmin) et l'ordre SELECT renvoie #4.
Comment faut-il tester que l'enregistrement n'existe pas ?

Voici mon code :
$requete = "select enregistré from $table_util where nom='" . $_post['nom'] . "' and prénom='" .$_post['prenom'] . "' and naissance='$naissance'";
$reponse = mysql_query($requete);
echo "Réponse à mysql_query select = " . $reponse;
if (!$reponse) 
	{
	// insertion d'une nouvelle inscription	
	$reponse = mysql_query($requete_insert);
	echo "<br />Réponse à mysql_query insert = " . $reponse;
	}
else
	{
	// modification d'une inscription existante
	$reponse = mysql_query($requete_update);
	echo "<br /><br />Réponse à mysql_query update = " . $reponse;
	}

Merci pour vos conseils
Modifié par Papapetch (15 Aug 2009 - 11:44)
Salut,

Mysql query te retourne false ou true en fonction de ce qu'il trouve dans la BDD, donc ton code semble être bon.
Comme dit dans le post précédent par Heyoan, il faut tester tes champs pour les caractères non autorisés Smiley cligne .
Salut,

N-J a écrit :
Mysql query te retourne false ou true en fonction de ce qu'il trouve dans la BDD

Heu, non, mysql_query retourne une ressource.

@Papapetch : Il suffit simplement de vérifier si le résultat de ta requête renvoie un enregistrement :

$reponse = mysql_query($requete);

if ( mysql_num_rows( $reponse ) == 0 )
{
   // Aucun enregistrement correspondant
}
else {
   // Au moins un enregistrement correspondant
   // (s'il ne doit y en avoir qu'un et un seul, faire un nouveau test et afficher un message d'erreur le cas où le résultat ressort plusieurs lignes)
}

Modifié par Agylus (14 Aug 2009 - 12:04)
OK pour les tests des caractères non autorisés, c'est en cours.

Par contre, pour le retour de mysql_query la réponse n'est ni true ni false mais #4 (c'est ce que m'affiche la ligne "echo" placée après mysql_query).
A quoi correspond ce code ?
Oulà ! $reponse n'est pas utilisable en l'état ! Il faut passer par mysql_fetch_assoc, mysql_fetch_row, mysql_fetch_array ou dans certains cas par mysql_result ou mysql_fetch_object.

Pour ta question il se trouve que Mysql est sympa puisqu'il permet d'utiliser ON DUPLICATE KEY ce qui permet de faire systématiquement un Insert et si la clef unique existe déjà de faire un update.

Donc en supposant que tu aies créé une clef unique sur nom / prenom (je te suggère de supprimer les accents de tes noms de variable car je ne suis pas sûr que ça passe partout) tu peux faire :
$sql = sprintf("Insert into $table_util (nom, prenom) Values('%s', '%s') ON DUPLICATE KEY UPDATE nom = '%s'",
	mysql_real_escape_string($_POST['nom']),
	mysql_real_escape_string($_POST['prenom']),
	mysql_real_escape_string($_POST['nom']));
mysql_query($sql) or die(mysql_error());


Edit: on s'est un peu croisés là ! Smiley biggol

Edit2: ce serait sans doute une bonne idée de commencer par lire des tutos SQL comme par exemple : http://sqlpro.developpez.com/
Modifié par Heyoan (14 Aug 2009 - 12:08)
Merci pour ton aide Heyoan.
Je vais en effet refaire un tour sur les tutos avant de replonger dans le code.
Agylus a écrit :

Heu, non, mysql_query retourne une ressource.


Oui tout à fait j'ai lu la doc en diagonale, j'ai vu "FALSE en cas d'erreur" en la consultant et hop amalgame true si il y a un retour Smiley murf
Bon, maintenant je vois bien l'intérêt de mysql_real_escape_string

Pour sprintf c'est moins évident.

Pouvez-vous éclairer ma lanterne ?