Aller au contenu

Insert ou Replace, that is the �


Sujets conseillés

Posté

Bonjour

Une question de base de Sql: je veux enregistrer des données dans une table mais jignore si cet enregistrement est nouveau (Insert) ou sil existe déjà (Replace).

Lexistence, ou pas, dune ligne tient pour moi à la présence, ou pas, dune valeur donnée dans une colonne identifiée.

Est-ce que je fais dabord un Select pour rechercher lexistence éventuelle de cette valeur et je choisis ensuite entre Insert et Replace ?

Par avance merci de votre aide, en souhaitant votre indulgence pour une question semblable.

Francois

Posté (modifié)

tu peut effectuer une condition PHP pour vérifier si elle existe ;)


// on compte le nombre d'entrées avec le contenu entré par l'utilisateur
$nb2resultats = mysql_num_rows(mysql_query('SELECT * FROM ma_table WHERE variable1 LIKE '.$_POST['champ_entré_1'].' '));
// SI aucune entrée
if($nb2resultats == 0)
{
// on "INSERT" la donnée
mysql_query('INSERT INTO ma_table VALUES()');
}
// AUTRE SOLUTION : Si il y a une ou plusieurs entrées correspondantes
elseif($nb2resultats >= 1)
{
// on effectue un update
mysql_query($blablablabla);
}
// SI AUTRE (ni 0 ni plus = il doit y avoir un problème...
else
{
print("Erreur de requête. Désolé");
}

Edit : j'ai pas vu que tu était si actif sur le forum, tu doit sans doute avoir pensé a cette hypothèse w_w

Modifié par Aenoa
Posté

Méthode #1:

- select -> insert ou update comme évoqué plus haut

Méthode #2:

- update, vérifier le nombre de lignes modifiées avec mysql_affected_rows, si 0 -> insert

Méthode #3:

- insert ... on duplicate key update ... http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

La méthode #3 requiert qu'il y ait une primary key ou un index unique sur la colonne en question, et n'est pas forcément portable sur d'autres SGBD que mysql.

Jacques.

Posté

bonjour et merci de vos réponses.

Je vais utiliser la méthode 1 qui a le mérite de la simplicité; par ailleurs, ma colonne pivot n'est pas la clé de cette table.

Merci encore.

Francois

Posté (modifié)

Bonjour

Il me manque quelque chose là : je teste si une ligne existe avec une valeur donnée dans une colonne :


$requete = "SELECT * FROM ".$table." WHERE espxxx='".$espxxx."'";
$result = mysql_query($requete,$connexion);

requete: SELECT * FROM siteProfil WHERE espxxx='espceg02m'
result : Resource id #11

if(!$result)
{ // Non, l'enregistrement n'existe pas

else
{ // Oui, l'enregistrement existe déjà

En réalité, la valeur nexiste pas dans cette colonne dans aucune des lignes mais mon test if(!$result) envoie sur le code prévu pour lenregistrement qui existe.

Merci par avance de votre aide.

Francois

Modifié par francoisch
Posté

Pourquoi n'utilises-tu pas la fonction mysql_num_rows, qui compte le nombre d'enregistrements trouvés ?

$requete = "SELECT * FROM ".$table." WHERE espxxx='".$espxxx."'";
$result = mysql_query($requete,$connexion);
if (mysql_num_rows($result) == 0) {
// non l'enregistrement n'existe pas
}
else {
// oui l'enregistrement existe
}

Posté

Moi j'aurais mis un index unique sur la colonne en question, et utilisé la méthode 3, c'est bien plus efficace

Posté

Merci de vos réponses à tous les deux.

Le choix de la solution était difficile, j'ai penché du coté d'Ernestine, en particulier parce que mon code était tout prêt pour ça.

Tout fonctionne grace à vos conseils, merci encore.

Francois

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...