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 :

Insertion multiple dans BDD MySQL


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 268
    Points : 128
    Points
    128
    Par défaut Insertion multiple dans BDD MySQL
    Bonjour à tous,

    Voilà un moment que je planche sur un soucis très particulier ...

    J'ai une application Flash qui fait appel 40 fois à une page PHP.
    Cette page PHP est sensée :
    - uploader 40 fichier => OK
    - inscrire 40 enregistrements dans la BDD => KO : seul 6 ou 7 enregistrements s'insèrent.

    Le pb ne vient pas de flash mais de PHP ou de MySQL installé en local via WAMP dernière version.

    Merci d'avance aux experts en la matière qui auront un peut de temps à me consacrer

    Voici le script PHP :

    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
     
    <?php
     
    		$upload_directory = $_POST["directory"];
     
    		$file_temp = $_FILES['file']['tmp_name'];
    		$file_name = $_FILES['file']['name'];
     
    		$file_path = $_SERVER['DOCUMENT_ROOT'] . "root/photos/" . $upload_directory;
    		$nom_fichier = $_FILES["fichier_choisi"]["name"];
    		$origin = $file_path.$file_name;
    		$dest = $file_path."small/";
     
     
    		 //UPLOAD
    		$filestatus = move_uploaded_file($file_temp,$file_path."/".$file_name);
     
    		// INSCRIPTION BDD
    		require_once "connection.php";
    		$URLs = "select count(*) from photos where directory='$upload_directory'";
    		$result = mysql_query($URLs) or die(mysql_error());
    		$ar = mysql_fetch_array($result);
    		$place = $ar['0'] + 1;
    		$title = "toto";
    		$insert = "INSERT INTO photos (file, title, directory, place) VALUES ('$file_name', '$title', '$upload_directory', '$place')";
    		$ressource = mysql_query($insert) or die(mysql_error());
     
    ?>
    Script de création de la table MySQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `photos` (
      `id` int(11) NOT NULL auto_increment,
      `file` varchar(50) NOT NULL,
      `title` varchar(200) NOT NULL,
      `directory` varchar(100) NOT NULL,
      `place` int(11) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    Il n'y a pas moyen de donner un petit message d'erreur ?
    Genre, le mysql_error(), il dit quoi ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 268
    Points : 128
    Points
    128
    Par défaut
    J'ai rien dans le fichier mysql.log, rien dans php_error.log ni dans apache_error.log

    Je dois peut-être coder autrement cette ligne ? Comme c'est un script flash qui appelle l'upload, je n'ai pas les sorties du fichier PHP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ressource = mysql_query($insert) or die(mysql_error());

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 268
    Points : 128
    Points
    128
    Par défaut
    Pour pouvoir tester au cas ou :

    1) Créer le script à cet emplacement :
    http://localhost/test/upload.php
    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
    <?php
     
    		$upload_directory = $_POST["directory"];
     
    		$file_temp = $_FILES['file']['tmp_name'];
    		$file_name = $_FILES['file']['name'];
     
    		$file_path = $_SERVER['DOCUMENT_ROOT'] . "root/photos/" . $upload_directory;
    		$nom_fichier = $_FILES["fichier_choisi"]["name"];
    		$origin = $file_path.$file_name;
    		$dest = $file_path."small/";
     
     
    		 //UPLOAD
    		$filestatus = move_uploaded_file($file_temp,$file_path."/".$file_name);
     
    		// INSCRIPTION BDD
    		require_once "connection.php";
    		$URLs = "select count(*) from photos where directory='$upload_directory'";
    		$result = mysql_query($URLs) or die(mysql_error());
    		$ar = mysql_fetch_array($result);
    		$place = $ar['0'] + 1;
    		$title = "toto";
    		$insert = "INSERT INTO photos (file, title, directory, place) VALUES ('$file_name', '$title', '$upload_directory', '$place')";
    		$ressource = mysql_query($insert) or die(mysql_error());
     
    ?>
    En pièce jointe le fichier flash
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    si tu n'as pas de message d'erreur, tous tes insert devrait être bon
    Peut etre pour tester devrais tu faire un echo de tes requetes pour voir ce qui se passe

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 268
    Points : 128
    Points
    128
    Par défaut
    J'aimerai bien mais je ne peut pas récupèrer le contenu de mes requetes si elles sont appelées par un objet Flash ...

    J'ai testé mon script en fesant 50 insertions dans une boucle, ça passe nickel

    Dans flash, je trace les événements d'envois :

    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
    selectHandler: 9 files
    addPendingFile: name=Bulb Electric.png
    addPendingFile: name=Approve.png
    addPendingFile: name=Bar Chart 2 Analysis.png
    addPendingFile: name=Bar Chart 2 Stop.png
    addPendingFile: name=Bar Chart 2.png
    addPendingFile: name=Bar Chart 3.png
    addPendingFile: name=Bar Chart 4.png
    addPendingFile: name=Bar Chart 5.png
    addPendingFile: name=Bar Chart.png
    openHandler: name=Bulb Electric.png
    openHandler: name=Bar Chart.png
    openHandler: name=Bar Chart 4.png
    openHandler: name=Bar Chart 3.png
    openHandler: name=Bar Chart 2.png
    progressHandler: name=Bar Chart 2.png bytesLoaded=1285 bytesTotal=1285
    openHandler: name=Approve.png
    progressHandler: name=Bulb Electric.png bytesLoaded=1580 bytesTotal=1580
    progressHandler: name=Bar Chart.png bytesLoaded=1271 bytesTotal=1271
    openHandler: name=Bar Chart 5.png
    progressHandler: name=Bar Chart 5.png bytesLoaded=1430 bytesTotal=1430
    progressHandler: name=Bar Chart 4.png bytesLoaded=1593 bytesTotal=1593
    progressHandler: name=Bar Chart 3.png bytesLoaded=1517 bytesTotal=1517
    openHandler: name=Bar Chart 2 Stop.png
    progressHandler: name=Bar Chart 2 Stop.png bytesLoaded=1615 bytesTotal=1615
    openHandler: name=Bar Chart 2 Analysis.png
    progressHandler: name=Bar Chart 2 Analysis.png bytesLoaded=1687 bytesTotal=1687
    progressHandler: name=Approve.png bytesLoaded=1878 bytesTotal=1878
    completeHandler: name=Bar Chart 4.png
    completeHandler: name=Bar Chart 5.png
    completeHandler: name=Bulb Electric.png
    completeHandler: name=Bar Chart.png
    completeHandler: name=Bar Chart 3.png
    completeHandler: name=Bar Chart 2.png
    completeHandler: name=Bar Chart 2 Stop.png
    completeHandler: name=Bar Chart 2 Analysis.png
    completeHandler: name=Approve.png
    listCompleteHandler
    J'ai l'impression que flash lance plusieurs processus en même temps et ça fait foirer les insertions.
    D'ailleurs quand je fais l'insertion, j'affecte la valeur N+1 au champ "place". N étant le nombre d'enregistrements déjà écrit. Et bien le champ place contient des répétitions ... ce qui va dans le sens de ce que je pense.

    En revanche, il me semble que la base est en autocommit donc MySQL devrait bien gérer les accès concurrents non ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 268
    Points : 128
    Points
    128
    Par défaut Commit Rollback
    Je suis en train de revoir le code php, j'essayer de bien commiter les requêtes pour qu'il n'y ai pas 2 transactions qui s'oppèrent en même temps.

    1 transaction = 1 select (qui compte le nombre d'enregistrement) + 1 insert;

    J'ai jamais fait ça ... j'aimerai avoir votre avis sur ce code qui fonctionne mal. Les insertions se font, j'ai l'impression d'avoir beaucoup moins de doublons mais il y a toujours 10% de doublon. (pour 40% avant environ).

    Merci

    Voici le code

    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
     
    $mysqli = new mysqli($hostname, $username, $password, $database);
     
    		// VERIFICATION DE LA CONNEXION
    		if (mysqli_connect_errno()) {
        		printf("Échec de la connexion : %s\n", mysqli_connect_error());
        		exit();
    		}
     
    		// DESACTIVE L AUTOCOMMIT
    		$mysqli->autocommit(FALSE);
     
    		if ($result = $mysqli->query("select count(*) from photos where directory='$upload_directory'")) {
                $row = $result->fetch_row();
    			$place = $row[0] + 1;
                $result->close();
            }
     
    		// $mysqli->rollback();
     
    		// ON INSERE L IMAGE DANS LA TABLE DES IMAGES
    		if ($mysqli->query("INSERT INTO photos (file, title, directory, place) VALUES ('$file_name', 'toto', '$upload_directory', '$place')") !== TRUE) {
       			 mysqli_rollback($db);  // if error, roll back transaction
    		}
     
     
    		$mysqli->commit();
     
    		$mysqli->close();

Discussions similaires

  1. [MySQL] Insertion multiple dans une base de données MYSQL
    Par bryanmohamet dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 14/11/2010, 22h49
  2. [MySQL] Insertion checkbox dans bdd mysql
    Par abdias1976 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 19/04/2010, 16h48
  3. [MySQL] Insertion de données xml dans bdd mysql
    Par mathcanto dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/01/2010, 10h56
  4. Réponses: 1
    Dernier message: 25/01/2010, 23h06
  5. Formatage de chaine avant insertion dans BDD MySQL
    Par kdson dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 18/01/2008, 01h01

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