IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Problèmes d'insertion multiples [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut Problèmes d'insertion multiples
    Bonjour,

    Je rencontre des difficultées lors d'une double qui effectue, tour à tour, une série d'INSERT en base (une 20aine seulement).
    L'algo ressemble à celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $datas = Array(
       Array('data1' => 'madonnee', 'data2' => 'monautredonnee'),
       Array('data1' => 'encore', 'data2' => 'uneautre')
    );
     
    foreach($datas as $data) {
       $d1 = $data['data1'];
       $d2 = $data['data2'];
       $sql = "INSERT INTO table VALUES ('$d1', '$d2');"
       mysql_query($sql);
       print($sql); // Pour debug
    }
    Je lance le script, les requêtes s'affichent toute.
    En revanche si je regarde dans la base de donnée, par PhpMyAdmin, seule une ligne à été ajoutée à la table (visiblement la première ou la dernière, à vérifier si besoin).
    Si je copie/colle les requêtes affichées dans PMA, toutes passent et ma table est correctement peuplée.

    Comment faire pour que tous les INSERT se fassent en table ?
    J'ai tenté de booster avec un "COMMIT;" à la fin de ma requête mais cela n'y a rien fait.

    Meci pour vos réponses !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    As-tu controlé si ton code produisait des erreurs mysql ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Oui tout à fait, il n'y a aucune erreur MySQL suite aux inserts ni par le script, ni par copier/coller dans PMA.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Est-ce que tu as une clef sur ta table ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Oui, en fait la table est :
    HISTORIQUE(Date date, Varchar(16) code)

    Il y a une clée primaire sur le champs date.
    Le problème ne vient pas de doublons de clé puisque j'ai fait un flush de la table avant mon script pour m'en assurer.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ton code du début ne correspond pas à ça.
    Peux-tu nous montrer le vrai code ?

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Je voulais simplifier un peu, voici le code :

    Premier fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    	// On analyse la validité du fichier
    	$valide = true;
    	while ( $valide && !feof($fp) ) {
     
    		$ligne = fgets($fp);
    		if( preg_match("`^[0-9]{2}(0|1)+[0-9]+(0|1|2|3)+[0-9]+[0-9A-Z]{1,16}$`", $ligne) ) {
     
    			$a = substr($ligne, 0, 2);
    			$m = substr($ligne, 2, 2);
    			$j = substr($ligne, 4, 2);
    			$date = '20' . $a . '-' . $m . '-' . $j;
    			$codeetab = substr($ligne, 6);
     
    			$datas[] = Array(
    				'date' => $date,
    				'codeetab' => $codeetab
    			);
     
    		} else {
    			$valide = false;
    		}
    	}
     
    	// Fermeture du fichier
    	fclose($fp);
     
    	/* A ce stade, $valide est à true et un print_r 
    	    montre que le tableau de donnée est correctement remplis */
     
    	// On regarde si le fichier est conforme
    	if($valide) {
     
    		// On insère tout en base
    		foreach($datas as $histo) {
    			/* Cette méthode est décrite plus basse */
    			bddhistorique_ajouter($histo['date'], $histo['codeetab']);
    		}
    		die();
    		// Succès
    		return true;
    	} else {
    		// Echec
    		return false;
    	}
    Voici la seconde méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // Insertion dans l'historique
    function bddhistorique_ajouter($date, $codeetab) {
     
    	// Insertion
    	$sql = "
    		INSERT INTO
    			" . TB_HISTORIQUE . "
    			(`date`, `codeetab`)
    		VALUES
    			('$date', '$codeetab');
    	";
     
    	/* Un print($sql) affiche les requêtes qui passent correctement dans PMA */
     
    	mysql_query($sql);
    }
    Merci

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    En voulant copier/coller les requêtes sur le forum, je me rends compte que j'ai une ano dans mes requêtes: les $codeetab comportent un espace à la fin. Celui-là vient de l'espace en fin de chaque ligne de mon fichier.
    J'ai remplacé :

    $codeetab = substr($ligne, 6);

    par :

    $codeetab = substr($ligne, 6, -1);

    Les requêtes sont bonne et passent.
    Ce que je ne comprends pas, c'est l'absence d'erreur sur mes requêtes dans mon script : peut-être ai-je mal récupérer les retours de l'insert par musql_query, peux-tu m'indiquer la marche à suivre correcte ?

    Pour PMA en revanche je ne comprends pas comment l'insertion passe la contrainte d'intégrité sur 'codeetab' quand je passe en requête directement...!

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je suppose que quand tu copies/colles, tu ne prends pas le caractère de retour chariot.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Il y avait bien un espace avant la parenthèse finale pourtant.
    Bref encore un mystère !
    Merci quand même

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème insertions multiples dans fichier AS400
    Par Rémi R dans le forum Persistance des données
    Réponses: 2
    Dernier message: 11/03/2009, 18h42
  2. Problème d'insertion multiple
    Par fikou dans le forum VB.NET
    Réponses: 4
    Dernier message: 13/02/2008, 09h26
  3. Problème insertions multiples
    Par GouKen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/12/2007, 19h26
  4. Problème Insertions Multiples SQLite
    Par djmustru dans le forum SQLite
    Réponses: 3
    Dernier message: 13/07/2007, 23h16
  5. Réponses: 4
    Dernier message: 29/06/2006, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo