Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/10/2011, 14h44   #1
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Par défaut test si existe dans la table

Bonjour.

Si je place cette commande sans ajouter WHERE `shorturl` NOT IN ('test'), ça va fonctionner. "test" va être ajouté peut importe qu'il existe ou non.

Je veux ajouter "test" que s'il n'existe pas dans la table. Faire ça en mysql.

Comment?

Code :
INSERT INTO `site`.`table` (`id`, `shorturl`, `longurl`) VALUES (NULL, 'test', 'test.com') WHERE `shorturl` NOT IN ('test')
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h48   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
INSERT IGNORE

http://dev.mysql.com/doc/refman/5.0/fr/insert.html
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h55   #3
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Y'a d'autres choses qui faut ajouter à ce que je comprends. Mais, je veux simplement ne pas insérer si la valeur existe.

INSERT IGNORE ... ne fonctionne pas.
INSERT IGNORE INTO non plus.

Citation:
Envoyé par stealth35 Voir le message
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 14h57   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
il faut bien mettre tes indexes, visiblement shorturl doit avoir un index UNIQUE, tu l'as bien mis ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h07   #5
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
sur la colonne ID l'index.

j'ai pensé à qqchose du genre :

Code :
1
2
INSERT INTO `site`.`table` (`id`, `shorturl`, `longurl`) VALUES (NULL, '$shorturl', '$longurl')
(SELECT `shorturl` FROM `site`.`table` WHERE `shorturl` NOT IN ('$shorturl'))
syntaxe erreur que ça dit.

Citation:
Envoyé par stealth35 Voir le message
il faut bien mettre tes indexes, visiblement shorturl doit avoir un index UNIQUE, tu l'as bien mis ?
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h20   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par dancom5 Voir le message
sur la colonne ID l'index.
ça c'est l'index PRIMARY KEY
tu dois mette un autre index UNIQUE sur ta colonne shorturl
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h27   #7
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
#1062 - Duplicate entry 'face' for key 'shorturl'

Le ID est primaire et unique.
Je ne peux pas le modifier.

SHORTURL j ai pu mettre index mais pas unique.


Citation:
Envoyé par stealth35 Voir le message
ça c'est l'index PRIMARY KEY
tu dois mette un autre index UNIQUE sur ta colonne shorturl
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 15h50   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par dancom5 Voir le message
#1062 - Duplicate entry 'face' for key 'shorturl'
c'est bon tu peux faire ton IGNORE maintenant
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h08   #9
Membre chevronné
 
Avatar de christele_r
 
Femme Christele
Inscription : novembre 2009
Messages : 661
Détails du profil
Informations personnelles :
Nom : Femme Christele
Âge : 39
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 661
Points : 690
Points : 690
Bonjour,
Tu es OK que par rapport a ta question, stealth35 t'indique comment organiser ta table pour n'avoir pour tout tes ajouts qu'une seule instruction et sans erreurs

Si au contraire tu préféres rester a ta question d'origine, tu n'y coupes pas d'un minimum de deux requétes
un SELECT puis l'INSERT !
christele_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h16   #10
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Je souhaiterai plus faire un test d'existance de la clé en utilisant mysql.

Placer un INDEX UNIQUE sur le champ 'shofturl', ça ne fonctionne pas.
Il est déjà dans le champ ID.

IGNORE ne marche pas non plus.

Citation:
Envoyé par christele_r Voir le message
Bonjour,
Tu es OK que par rapport a ta question, stealth35 t'indique comment organiser ta table pour n'avoir pour tout tes ajouts qu'une seule instruction et sans erreurs

Si au contraire tu préféres rester a ta question d'origine, tu n'y coupes pas d'un minimum de deux requétes
un SELECT puis l'INSERT !
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h19   #11
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par dancom5 Voir le message
Placer un INDEX UNIQUE sur le champ 'shofturl', ça ne fonctionne pas.
Il est déjà dans le champ ID.
on peux mettre autant d'index que le l'on veut dans une table, sais tu vraiment a quoi sert un index ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h20   #12
Membre chevronné
 
Avatar de christele_r
 
Femme Christele
Inscription : novembre 2009
Messages : 661
Détails du profil
Informations personnelles :
Nom : Femme Christele
Âge : 39
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 661
Points : 690
Points : 690
Oui tout les champs ne peuvent étres mis en UNIQUE, en effet les binaires sont bien sur refusés, il te faut des type CHAR VARCHAR INT etc...
Quelle est la nature de shofturl
christele_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h22   #13
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Il est VARCHAR

Je revise ce tutoriel :
http://sqlpro.developpez.com/cours/sqlaz/dml/#L1.5

Selon ce que j'ai lu, on ne peut pas faire de sous-requête avec INSERT
sous MYSQL.

J'utilise Mysql 5.0.55



Citation:
Envoyé par christele_r Voir le message
Oui tout les champs ne peuvent étres mis en UNIQUE, en effet les binaires sont bien sur refusés, il te faut des type CHAR VARCHAR INT etc...
Quelle est la nature de shofturl
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h45   #14
Membre chevronné
 
Avatar de christele_r
 
Femme Christele
Inscription : novembre 2009
Messages : 661
Détails du profil
Informations personnelles :
Nom : Femme Christele
Âge : 39
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 661
Points : 690
Points : 690
Donc sans aucun probleme tu peux faire (s'il nexiste pas encore) si non ça le créerait inutilement en double
Code :
1
2
 
ALTER TABLE `tatable` ADD UNIQUE (`shofturl` )
dans ton SQL ou par MySql
Mais le piége (et il me semble que tu es dans ce cas), est si ta table a déjas sur ce champ des doublons tu aura un message d'erreur bien sur !
Il faut en premier nettoyer ta table
christele_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h53   #15
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
Effectivement, ma table avait déjà des doublons. Je ne pouvais pas ajouter UNIQUE. mais je suis obligé de mettre INSERT IGNORE INTO?

Citation:
Envoyé par christele_r Voir le message
Donc sans aucun probleme tu peux faire (s'il nexiste pas encore) si non ça le créerait inutilement en double
Code :
1
2
 
ALTER TABLE `tatable` ADD UNIQUE (`shofturl` )
dans ton SQL ou par MySql
Mais le piége (et il me semble que tu es dans ce cas), est si ta table a déjas sur ce champ des doublons tu aura un message d'erreur bien sur !
Il faut en premier nettoyer ta table
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 16h56   #16
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
ok.. je viens de comprendre.

INSERT IGNORE INTO va permette d'ignorer un message d'erreur.
UNIQUE va permette de ne pas avoir de doublon dans la table.

Je viens de tester.

Mais, si je mets pas INDEX "IGNORE", j'aimerais bien pouvoir personnaliser le message d'erreur envoyé par mysql.
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 17h00   #17
Membre chevronné
 
Avatar de christele_r
 
Femme Christele
Inscription : novembre 2009
Messages : 661
Détails du profil
Informations personnelles :
Nom : Femme Christele
Âge : 39
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 661
Points : 690
Points : 690
Quand tu aura pour une de tes tables
1) viré les doublons pour un champ
2) fais un ALTER etc .... pour rendre le champ unique,

Alors tu pourras faire

Code :
1
2
3
4
5
6
7
8
9
10
 
<?php
$Flag1=mysql_connect("localhost","root","");
$Flag2=mysql_select_db("tadatabase");
$result=mysql_query("INSERT IGNORE INTO test (pseudo ) VALUES ('froufrou')");
$x=mysql_affected_rows($Flag1);
// $x==1 si creation OK $x==0 si doublon===== donc
if ($x==1) echo "blablabla esr ok";
 
?>
christele_r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/10/2011, 18h16   #18
Membre du Club
 
Inscription : janvier 2010
Messages : 317
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 317
Points : 62
Points : 62
J'utilise MYSQLI alors mysql_affected_rows() ça ne marche pas.
J'utilise une alternative qui est :

Code :
1
2
3
4
5
6
7
 $addto = $mysqli->query("INSERT INTO ...");
 
   if (!$addto) {
     $errormessage='Errormessage: '.$mysqli->error;
   }else{
   $errormessage='Confirmation: '.strtoupper($shorturl).' is Succesfully registred';
			}
J'aurais bien aimé l'utiliser par contre.

mysqli :
Code :
1
2
3
4
 
$mysqli = new mysqli("localhost", ..");
$mysqli->select_db('site');
}
dancom5 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 18h18   #19
Membre chevronné
 
Avatar de christele_r
 
Femme Christele
Inscription : novembre 2009
Messages : 661
Détails du profil
Informations personnelles :
Nom : Femme Christele
Âge : 39
Localisation : France

Informations professionnelles :
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2009
Messages : 661
Points : 690
Points : 690
Par défaut variante PDO

Je viens de tester si PDO laissait passer le retour d'info, la réponse est OUI
Donc dans les conditions identiques de cle uniques etc...

Code :
1
2
3
4
5
 
 
$req = $bdd->prepare("INSERT IGNORE INTO `test` (`pseudo`) VALUES (:lepseudo)");
$x=$req->execute(array( ':lepseudo' => "hijklmn"));
$ID=$bdd->lastInsertId();
Pour PDO $ID reçoit 0 si pas créé car doublon
ou la valeur de l'index auto-incrementé si succés
même valeur donc que $bdd->lastInsertId();

HOP YHIS HELP !
christele_r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/10/2011, 18h21   #20
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par dancom5 Voir le message
J'utilise MYSQLI alors mysql_affected_rows() ça ne marche pas.
http://www.php.net/manual/fr/mysqli.affected-rows.php
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h12.


 
 
 
 
Partenaires

Hébergement Web