Bonjour,

je souhaite mettre a jour une base de donnée phpmyadmin via une page php avec importation d'un fichier csv.

J'ai trouvé ce 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//Connexion
    include("connexion.php");
 
    $pdo = Connexion();
 
    $fichier = "C:/wamp/www/ged/AGT1.csv";
 
    if (filesize($fichier) > 5)
    {
 
            //Ajout à la base temp Mysql
 
            $sql = "LOAD DATA INFILE 'C:/wamp/www/ged/AGT1.csv'
                    INTO TABLE temp
                        FIELDS
                            TERMINATED BY ';'
                            ENCLOSED BY '\\\"'
                            ESCAPED BY '\\\\'
                        LINES
                            STARTING BY ''
                            TERMINATED BY '\\n'
                        IGNORE 1 LINES
                            (codeDossier, filiale, magasin, codeClient, client, codePostal, ville,
                                codeVendeur, vendeur, metier, tvaReduite, modele, dateDecouverte, dateDevis,
                                datePerte, dateVente, codeAnalytique, dateLivraisonSouhaitee, prixNetTtc, prixNetHt, remise, dateFacturation)";
 
 
            //Ajout à la base Sql Server
            /*
            $sql = "SELECT * INTO AGT FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:/wamp/www/ged/AGT1.csv')";
            */
            $res = $pdo->exec($sql)
                        or die ("L'insertion à la table TEMP a échoué");
 
        //-------------------------- Ajout à la base AGT --------------------------
 
            //On récupère tous les champs de la table TEMP
            $query = "SELECT * FROM temp";
            $temp = $pdo->query($query)
                        or die ("La récupération de la table TEMP a échoué");
 
            //On parcours une à une les lignes du jeu de résultat de $temp
            while($liste_temp = $temp->fetch((PDO::FETCH_ASSOC)))
            {  
                set_time_limit(0);
                //On vérifie si la ligne AGT existe dans TEMP par rapport au codeDossier
                $query2 = "SELECT * FROM agt WHERE codeDossier = '".$liste_temp['codeDossier']."'";
                $agt = $pdo->query($query2)
                            or die ("La vérification de ligne entre AGT et TEMP a échoué");
 
                //Si la ligne existe dans AGT(si la requete est supérieur 0 ligne)
                if($agt->rowCount()>0)
                {
                    $liste_agt = $agt->fetch((PDO::FETCH_ASSOC));
 
                    //Si un champs est différent
                    if(($liste_temp['codePostal']!=$liste_agt['codePostal']) || ($liste_temp['ville']!=$liste_agt['ville']))
                    {  
                        //Alors on modifie tous les champs par rapport à la table TEMP
                        $update = "UPDATE agt SET codePostal='".$liste_temp['codePostal']."', ville='".$liste_temp['ville']."'  WHERE codeDossier='".$liste_temp['codeDossier']."'";
                        //Execution de la requete
                        $execute = $pdo->exec($update)
                                    or die ("La mise à jour des champs de la table AGT a échoué");
                    }
                }
                else //Sinon la ligne n'existe pas
                {
                    $liste_temp['client'] = str_replace(";","",addslashes($liste_temp['client']));
                    $liste_temp['ville'] = str_replace(";","",addslashes($liste_temp['ville']));
                    $liste_temp['modele'] = str_replace(";","",addslashes($liste_temp['modele']));
                    $liste_temp['vendeur'] = str_replace(";"," ",addslashes($liste_temp['vendeur']));
                    $liste_temp['codeVendeur'] = str_replace(";","",addslashes($liste_temp['codeVendeur']));
                    $liste_temp['codePostal'] = str_replace(";","",addslashes($liste_temp['codePostal']));
 
                    //On l'insert dans la table
                    $insert = "INSERT INTO agt VALUES('".$liste_temp['codeDossier']."', '".$liste_temp['filiale']."', '".$liste_temp['magasin']."', '".$liste_temp['codeClient']."', '".$liste_temp['client']."','".$liste_temp['codePostal']."',
                    '".$liste_temp['ville']."','".$liste_temp['codeVendeur']."', '".$liste_temp['vendeur']."', '".$liste_temp['metier']."', '".$liste_temp['tvaReduite']."','".$liste_temp['modele']."', '".$liste_temp['dateDecouverte']."',
                    '".$liste_temp['dateDevis']."', '".$liste_temp['datePerte']."', '".$liste_temp['dateVente']."','".$liste_temp['codeAnalytique']."', '".$liste_temp['dateLivraisonSouhaitee']."', '".$liste_temp['prixNetTtc']."',
                    '".$liste_temp['prixNetHt']."', '".$liste_temp['remise']."', '".$liste_temp['dateFacturation']."')";
                    //Execution de la requete
                    $execute = $pdo->exec($insert)
                                or die ("L'insertion de nouvelles lignes dans AGT a échoué");
                }
            }
            //On supprime la table TEMP
                $delete = "DELETE FROM temp";
                $execute = $pdo->exec($delete)
                        or die ("La suppression des données de la table TEMP a échoué");
    }
    else
    {
        echo "le fichier est vide";
    }
mais j'ai un crash test sur la table agt.

Mais par mesure de séucrité car cette base est très importante 36000 lignes je souhiate faire une methode plus sécuritaire car si un soucis lors de l'import cela risque de mettre des codes errerurs partout sur le site.

Je suis tombé sur cela qui resume mon probleme de sécurité :


1. Premier choix : utiliser la commande sql "load data infile" : d'après ce que je sais, elle est super rapide, mais mon souci, c'est que si je fais une mise à jour de ma base à partir de mon fichier csv, mes entrées deviennent des doublons pour certaines. Certes, il existe une option replace, mais (corrigez moi si je me trompe), elle ne se base que sur un numéro d'index identique, donc si mon index est auto-incrémenté, c'est pas possible de l'utiliser.

2. Second choix : utiliser "load data infile" pour créer une table temporaire, puis comparer les deux tables et créer des conditions en php. Style si le champ est différent, alors on copie dans la table permanente, sinon update le champ qui existe déjà.

3. Lire le fichier ligne par ligne, tester si la ligne existe déjà dans la table, puis faire un insert ou un update sur la table en fonction des cas. Le problème, c'est que cela risque d'être super long et lourd, non ?


La 3 eme solution en table temporaaire parait la plus judicieuse.

Quelqu'un peut -il m'aider à créer une table temporaire, puis de lancer des requêtes sql cherchant quels champs ont été modifiés ou n'existe pas dans la table de destination, puis de gérer les insert et les updates en modifiant le code actuel ?

Merci