begin process at 2013 05 24 22:36:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Chaîne de caratère

 > IMPORT CSV VERS BDD MYSQL AVEC CHOIX CHAMPS CSV / CHAMP BDD (PHP4)

IMPORT CSV VERS BDD MYSQL AVEC CHOIX CHAMPS CSV / CHAMP BDD (PHP4)


 Information sur la source

Note :
8,89 / 10 - par 9 personnes
8,89 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Chaîne de caratère Classé sous :csv, excel, import, importer, parser Niveau :Débutant Date de création :22/08/2006 Date de mise à jour :31/08/2006 14:54:09 Vu / téléchargé :40 503 / 6 298

Auteur : caviar

Ecrire un message privé
Commentaire sur cette source (78)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Salut ...
bon ben voila ma première source ... Comme quoi ..il arrive un moment ou on ne fait plus que pomper des codes pour apprendre ... on essaye d'en faire partager aux autres :) :) Et ça fait plaisir...
Pour rentrer dans le vif du sujet cette source compatible php4 permet de pouvoir importer un fichier CSV vers une table de la base de donnée et de choisir la correspondance entre les champs du fichier CSV et les champs de la table.
Je n'ai pas noté de bug de fonctionnement particuliers pour l'instant mais je viens juste de finir .. alors n'hésitez pas à me faire part de vos optimisations et/ou requettes...
Pour l'utilisation c'est simple il suffit de configurer le fichier conf/config.inc.php selon vos paramètres :)
Voila ..Le code est commenté ce qui devrai vous permettre de comprendre facilement
@+

Source

  • tout est dans le zip
tout est dans le zip

 Conclusion

Petit bonus ... quelques fonctions de connection / insertion / requettes automatiques à mysql dans le dossier functions...
Je remercie mon ami dev Anton qui les a fabriquées sur mesure pour moi. Je ne lui ai pas demandé l'authorisation de les envoyer au passage ...alors Anton si tu lis ces mots sache que tu as un droit de véto sur ma source... Bien que conaissant ton esprit de partage je ne pense pas que ça te pose de problèmes.
Voila tout.

  

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 août 2006 14:18:40 :
suppression du bug qui empechais de lister les champs de la table si elle était vide ;)
28 août 2006 16:18:59 :
Gestion des diférents séparateurs verrification de l'intégrité des données CSV Journal des erreurs SQL
29 août 2006 09:14:42 :
petite modif d'un fichier
29 août 2006 11:16:45 :
possibilité de forcer un champ dans la bdd... Il subsiste un bug si on choisis deux fois la même colone CSV le forcage de champ ne marche plus :( @+
30 août 2006 10:09:13 :
Suppression du bug de forcage des valeurs... Dans l'ensemble ça commence à devenir bien fonctionnel :) j'attends vos retours ;) @+
31 août 2006 14:54:09 :
Coté visuel légèrement modifié + ajout de la possibilité de faire un md5 sur une valeur de son choix ... pour encoder une colonne de mots de passe par exemple ;) ;) ;) @+

 Sources du même auteur

GÉNÉRATEUR DE LISTE DÉROULANTE
CLASS CALENDRIER AVEC AFFICHAGE D'UN INTERVALE DE JOURS DÉFI...
GOOGLE SEARCH PARSER
CONNAITRE LE NOMBRE DE PAGES INDEXÉES SUR GOOGLE
Source avec Zip Source avec une capture FONCTION RÉCURSIVE POUR GÉNÉRER UNE ARBORESCENCE DE FICHIERS...

 Sources de la même categorie

CRYPTER ET DÉCRYPTER UN HASH par rayman223
SCRIPT CORRECTEUR DE PONCTUATION par nebenobo
RÉDUIRE UN TEXTE À N CARACTÈRES SANS COUPER DE MOT par gazetteSDF
ADRESSE ABSOLUE DE LA PAGE EN COURS, AVEC VARIABLES $_GET par Dariumis
Source avec Zip CLASSE D'OBJET DE RECHERCHE DE MOTS DANS DES TABLEAUX ET/OU ... par 8Tnerolf8

 Sources en rapport avec celle ci

Source avec Zip INTYCSV CLASS CSV EN PHP SIMPLE ET INTUITIVE par sledge00
Source avec Zip IMPORT FICHIERS CSV DANS UNE BASE DE DONNÉES par shannara
Source avec Zip Source avec une capture BASH CSVSQL: PARSER UN FICHIER CSV AVEC DES COMMANDES SQL par gentilKiki
Source avec Zip IMPORTER DES DONNER CSV POUR LES METTRES DANS MYSQL par thekid23
Source avec Zip Source avec une capture TABLEUR GENRE EXCEL EN PHP POUR LE CSV par Mrreivax

Commentaires et avis

Commentaire de Flux__ le 23/08/2006 10:03:27

Bonjour,

Le problème relevé est le suivant :
Si la table est vide alors aucun champs ne s'affiche dans la partie champs table.

Je continue de tester et tiens au courrant.

Bonne journée

Commentaire de caviar le 23/08/2006 13:55:43

ouaip ... il faut au moins un enregistrement .. effectivement c'est un petit bug qui devrai être facile à contourner ...Je vais regarder ;)
@++

Commentaire de caviar le 23/08/2006 14:20:03

ça y est j'ai corrigé tout ça ;) ;)
j'ai pas retesté la source mais normalement ça marche :)
++

Commentaire de Flux__ le 23/08/2006 15:02:16

Je l'avais corriger autrement :

function tableVide($resQuery) {
$nbsChamps = mysql_num_fields($resQuery);
while($meta = mysql_fetch_field($resQuery)) {
$nom[] = $meta->name;
}
for ($i=0; $i<$nbsChamps; $i++) {
$html[$i] = "<select name=\"colone$i\">\n";
$html[$i] .= "<option value=\"\" SELECTED>Choisissez une colone</option>\n";
for($j=0;$j<count($nom);$j++) {
$html[$i] .= "<option value=\"$nom[$j]\">$nom[$j]</option>\n";
}
$html[$i] .= "</select>\n";
$html[$i] .= "<br />\n";
}
return $html;
}

et j'ai commenté la partie du code des lignes 169 à 209

j'ai également modifier les parties suivantes :
-----------------------------------------------------------------------------------------------
for ($u=0; $u<$fields; $u++) {
    $colones .=  $_POST["colone$u"];

//pour ne pas ajouter de virgule apres la derniere colone on teste
if ($u < ($fields-1) && !empty($_POST["colone$u"])){
$colones .= ", ";
}
}
$colones = rtrim($colones,", ");
$colones .= " ) ";

------------------------------------------------------------------------------------------
for ($u=1; $u<=($cpt-1) ; $u++) {
$valeurs[$u] = "(" ;
//on remplis les valeurs en fonction du nb de colones
for ($m=0; $m<$fields ; $m++) {
$tempcol = "colonecsv".$m;
//on stocke la valeur sans les espaces avant et après
if (!empty($tabcsv[$u][$_POST[$tempcol]])) {
    $valeurs[$u] .= '\''.addslashes(trim($tabcsv[$u][$_POST[$tempcol]])).'\'';
}
//pour ne pas ajouter de virgule apres la derniere colone on teste
if ($m < ($fields-1)){
$valeurs[$u] .= ", ";
}
}
$valeurs[$u] = rtrim($valeurs[$u],", ");
$valeurs[$u] = eregi_replace(" ,", " '',", $valeurs[$u]);
$valeurs[$u] .= " ) ";
}
------------------------------------------------------------------------------------------------
Cela me permet d'être indépendant du nombre de champs.

Dis moi ce que tu en penses ?

Commentaire de Evangun le 24/08/2006 05:35:59

Salut,
j'aime bien ta source, je pense que je vais l'utiliser !

deux ou trois remarques :
- si tu peux utiliser les ' à la place de " c'est nickel
- je ne vois pas l'intérêt de créer la fonction deconnecter(){mysql_close();}
- si le fichier csv contient une ligne vide, il en fait qd même un enregistrement
- si tu pouvais mettre les fichiers dans un même répertoire ce serait cool : trois répertoires pour trois fichiers, ça fait désordre ^^
- si on se trompe de fichier et qu'il n'a pas la bonne extension, ça fait plein d'erreurs

voilà, merci en tout cas ! je mets 8

Commentaire de Evangun le 24/08/2006 06:00:02

Je repasse...
- ce serait pas mal de mettre un système qui gère les erreurs SQL, je pense en particulier aux doublons, ce qui est énervant, et pire, aux champs uniques/primaires: ça bloque. Je vais peut-être le rajouter, je reviens dire les modifs si c'est le cas.
- tant que j'y suis: requête s'écrit avec un seul "t" et colonne avec deux "n"

ah pour l'histoire de la ligne vide, je t'évite de chercher : tu remplaces ça à la ligne 296 de import.php.

if(!empty($str)){
    $tabcsv[$cpt] = explode (';', $str);
    $cpt ++;
}

à+

Commentaire de Evangun le 24/08/2006 06:34:18

ah bah en fait pour éviter les doublons, il suffit de rajouter IGNORE à côté de INSERT tout à la fin de import.php. On pourrait aussi utiliser On Duplicate key. Mais en regardant de plus près, il me semble que tu ne prends pas du tout en compte les délimiteurs de champ (")? et s'il y a un ";" dans une des valeurs, tu fais comment ? il faut que tu utilises une expression régulière pour ça. Finalement je crois que je vais attendre un peu avant d'utiliser cette source...

Commentaire de caviar le 24/08/2006 11:32:05

salut, merci pour vos réponses ...
pour ma première source ça fait plaisir de voir qu'elle vous intéresse déjà ;) ...
Je vais me pencher sur les différents bugs que vous avez souligné...malheureusement je suis pas (encore) un grand developpeur (ni un dieu de l'aurtohgraffent...lol..bon passons). Enfin je vais faire mon possible :)
J'ai aussi envie de rajouter un champ de texte pour forcer à entrer une valeur dans telle ou telle colonne (avec deux "n" 8-).
J'y retourne ;)
@++

Commentaire de caviar le 24/08/2006 11:39:57

pour l'idée de mettre les fichiers dans un même répertoire ...en fait ils sont dans plusieurs rep car ce petit applicatif fait partie d'un plus gros site où l'arboressence est faite de la sorte...avec plus de fichiers dans les repertoire fonctions, conf et import ... là  j'ai laissé que l'éssentiel ;)
++

Commentaire de malalam le 26/08/2006 13:10:57 administrateur CS

Hello Caviar,

j'utilise -malheureusement- énormément de scripts de parsing de CSV pour insertion dans une bdd (en prod, en travail avec des clients, c'est nécessaire...).
Ce qu'il faut absolument prendre en compte : un csv a deux délimiteurs en général : la virgule ou le point virgule. Ce doit donc être une option. Les champs peuvent aussi être délimités par des apostrophes ou des guillemets ou rien.
Après, il faut parser en fonction. Pas besoin d'expression régulière à mon sens, le paring reste très simple dans tous les cas. Par contre, effectivement, prendre en compte le type des champs de la bdd est nécessaire.
De même qu'avoir un suivi des erreurs générées (donc un log), et une règle à appliquer en cas d'erreurs justement (classe à part à mon sens).
Pour automatiser, une lecture de la table (ou des tables) à mettre à jour est une bonne idéee (show table et compagnie). Cela automatise le traitement et donen moins de travail à l'utilisateur.
Ton code est une très bonne idée...et j'espère que tu vas l'améliorer :-) Je pourrai si tu veux à l'occasion t'envoyer quelques exemples de scripts, qui restent dédiés, et non génériques, selon mes besoins ponctuels au travail.

Commentaire de caviar le 28/08/2006 09:18:39

salut...
yes je continue d'améliorer ce code ...
pour le moment je me penche sur les délimiteurs de champs avec ou sans guillemets...
Pour les erreurs Mysql je regarderai ça après :) Je renvoie des sources dés que c'est mieux fini
++

Commentaire de Startide le 28/08/2006 15:12:31

Excellent !! En effet, ca gère pas les délimiteurs je crois... car j'ai un champ qui contient un ' et ca fait foirer ! mysql_escape ? ;)

Commentaire de caviar le 28/08/2006 16:01:11

J'ai presque fini de gérer les erreurs sql et l'intégrité des fichiers csv ... ;)
c'est pour bientôt ;)
++

Commentaire de caviar le 28/08/2006 16:20:13

ayé ;)
et voila une nouvelle version en ligne ...beaucoup plus fonctionnelle ;)
J'attends vos remarques et suggestions ;)
@+

Commentaire de Startide le 28/08/2006 17:04:23

Pas encore testé, mais j'ai noté des erreurs dans le html (hooo).

Notament sur la gestion des tableaux... comme t'as fait ca avec border=0 t'as pas du voir, mais affiche la bordure tu devrais comprendre ;)

Note aussi : TH remplace un TD, faut donc toujours une ouverture de ligne via TR ;)

J'ai notament remarqué ces petits bugs dans la section de sélection des colonnes, par exemple ton bouton pour passer à l'étape trois il est dans un TD simple, mais il faudrait un colspan="3" puisqu'il est contenu dans une ligne avec 3 colonnes :)

Enfin : faut utiliser <?php, pas <? :D

PS : je teste ta version rapidos ;)

Commentaire de Startide le 28/08/2006 17:28:07

J'ai fait quelques modifs, c'est purement de la mise en forme ;)

j'ai donc viré les bgcolor= car c'est caca, remplacé par des style="background-color:#fff" dans les <tr> (plus rapide et léger donc :D).

J'ai retiré des les echo "html html html"; car ca sert à rien de faire parser php sur du texte ;)

J'ai rajouté un &nbsp; à côté des valeurs des tables pour corriger un bug de IE : si t'as pas de valeur, ta case est vide et n'a pas de bordure... c'est pas beau. théoriquement ca se corrige avec une propriété css (empty-cell de mémoire) pour dire si tu veux toujours la bordure ou pas, mais elle fonctionne pas sous IE :)

J'ai remplacé <? par <?php car c'est plus propre en fait (sur certaines configurations de serveurs ca pose soucis si je ne m'abuse. Et puis c'est le tag "officiel" ^^

J'ai laissé la bordure de tableau à 1, juste pour le test puisque sinon on voit pas si ca s'enchaine proprement :)

[code]function display_one_table($tablename){
//$query="show fields from $tablename";
//$result=mysql_query($query);
$result = requette ("show fields from $tablename");
$rows = mysql_num_rows($result);
?>
<table width ="99%" border="1" cellspacing="1" cellpadding="4" bgcolor="black">
<tr>
<th bgcolor="white" colspan="6" align="center">Informations sur la table <i><?php echo $tablename?></i></th>
</tr>
<tr style="background-color:#fff">
<td>Field</td>
<td>Type</td>
<td>Null</td>
<td>Key</td>
<td>Default</td>
<td>Extra</td>
</tr>
<?php
while ($row = mysql_fetch_row($result)) {
?>
<tr style="background-color:#fff">
<td><?php echo $row[0] ?>&nbsp;</td>
<td><?php echo $row[1] ?>&nbsp;</td>
<td><?php echo $row[2] ?>&nbsp;</td>
<td><?php echo $row[3] ?>&nbsp;</td>
<td><?php echo $row[4] ?>&nbsp;</td>
<td><?php echo $row[5] ?>&nbsp;</td>
</tr>
<?php
}
?>
</table>
<br />
<?php
}[/code]

import.php => la fonction display_one_table ;)

Commentaire de Startide le 28/08/2006 17:43:55

Encore moi ^^

J'ai lu ta note concernant le fait de "remplir" une colonne. Ne vaut-il pas mieux que ton script détecte en fonction de la première ligne le nombre de colonnes à utiliser ? Vu que manifestement la première ligne doit contenir le bon nombre de colonnes (et le nombre maximal d'ailleurs).

Je ne sais pas si c'est géré (car j'ai testé d'autres scripts avant en fait :D) mais pouvoir définir une "clef primaire"... si t'as un doublon ca n'insère pas les données, ca fait une mise à jour de la ligne existante ;)

Histoire de pas faire des insertions multiples comme un gros bill :)

Dernière chose qui pourait être intéressante à faire : définir une colonne à "null". J'ai une colonne de mon fichier CSV que je ne veux pas intégrer dans ma base de données, je sélectionne null et ca la rajoute pas (là si on met "choisir un colonne", note la faute d'orth au fait :D) ca fait tout chier le script ^^

Si t'as besoin d'aide, hésite pas :)

Commentaire de caviar le 28/08/2006 17:55:50

Saluté :)
Il y a des idées achement intérésantes dans ce que tu proposes ;)
Suis un peu mort ce soir là ...mais je regardai tout ça demain sans pb ;)
le coup du update ça me plait bien :)... je vais aussi implémenter la possibilité de forcer une valeur pour une colonne ou de l'avoir à NULL ;)
merci pour tes commentaires ;)
@++

ps : La table que tu as modifié au niveau mise en page c'est un bout de code que j'ai récupéré... mais bon j'ai rien à dire  car je fais souvent les mêmes erreurs en html ;)

++

Commentaire de caviar le 29/08/2006 09:49:26

yep

Ne vaut-il pas mieux que ton script détecte en fonction de la première ligne le nombre de colonnes à utiliser ?

-> Je ne peux pas faire ça car cela empècherai la verrification du bon parsage des valeurs d'une ligne. Pour verrifier une ligne je compare le nombre de valeurs parsées avec le nombre de valeur  normal (celui de la 1ère ligne) ... donc si automatiquement je mets le bon nombre de champs sur ma ligne ça ne marche plus et ça risque de laisser passer des erreurs .. donc pas possible.

Commentaire de Startide le 29/08/2006 10:56:51

Ah merde... c'est vrai que excel fait chi€r à pas proposer de caractère de terminaison pour les lignes des fichiers CSV :/

Alors voyons, tu dis que tu vérifies que chaque ligne est bien parsée, qu'est ce qui pourrait générer un problème de parsage ? Si on élimine les sources "manifestes" de bug on peut alors contourner le problème...

Car dans l'absolu le fichier CSV a un nombre fixe de colonnes, c'est son principe fondateur. Ensuite les erreurs possibles c'est soit l'utilisateur qui fait des conneries, soit le script qui s'embrouille avec les "" ou les caractères spéciaux mal échapés...

PS : un écran intermédiaire, qui afficherait dans des cellules les données parsées, et ensuite tu valides ce "super formulaire" pour insertion dans la base. Ca permettrait de modifier des valeurs, ou encore de décocher certaines lignes pour ne pas les inclures... ce genre de choses.

Enfin je sais pas trop à quoi se destine ton script à la base tu me diras ^^

Commentaire de caviar le 29/08/2006 11:22:08

salut ...Je viens de poster une nouvelle version ...
afficher un écran intermédiaire me semble un peu complexe et pas forcément très utile (quoique...)
Pour l'instant je vais rester sur le fonctionnement actuel ...
Mon script se destine à la base à éviter de se retapper un remplssage de bdd mysql quand on en a une déjà remplie qu'on peut exporter encsv ...lol

J'ai rajouté la possibilité de forcer un champ dans la bdd avec toujours la même valeur ... mais il reste un bug.. Si je choisis deux fois le même champ csv à droite le forcage de valeur ne marche plus ... je capte pas ... Enfin je continuerai un peu demain ..là faut que je bosse sur autre chose ;)

si tu as d'autres idées ;) n'hasites pas
++

Commentaire de Startide le 29/08/2006 11:50:18

Je teste, si je vois des choses à modifier je tenterais ma chance :) Et je te posterais le code modifié ensuite...

Faut aussi que je taffe d'autres trucs, suis pas dév moi normalement :ane:

Commentaire de Startide le 29/08/2006 14:55:30

Tiens autre petite remarque, bonne idée d'avoir joué sur les selected dans tes menus déroulants. Deux remarques :

1/ c'est <option value="test" selected> la bonne structure ;) pas de <option value="test" selected="selected"> ^^

2/ Je te renvois à ce que j'ai posté sur php.net on utilise alors avec élégance le bel opérateur ternaire :)

http://fr3.php.net/manual/en/control-structures.while.php#65243

Ca donnerait qqch dans ce genre là :

while ($i < $fields)
{
$savior = mysql_result($resQuery, $i); // autant sauver ca dans une variable plutôt que de lancer deux fois mysql_result (enfin je pense)
echo '<option value="'.$savior.'"'; // classique...
echo ($i == $j) ? ' selected>' : '>'); // opérateur ternaire => derrière le "?" c'est ce qu'on affiche si condition vraie, sinon c'est derrière le ":"
echo $savior .'</option>'; // Rien d'extraordinaire ici non plus ^^
echo "\n";

Si qqn passe par ici, je veux bien une contribution sur un résultat surprenant, dans ma contribution sur php.net j'ai tout stocké ma chaine de caractères dans une variable concaténée, hors ici ca me donne des temps de parsing monstrueux Oo comprend pas la raison néanmoins.

Voilà, monologue terminé pour l'instant ^^

Commentaire de Startide le 29/08/2006 15:04:05

Mince on peut pas éditer... bon je continue :)

Menu déroulant pour choisir les tables de la base de données, ya une erreur :

while ($row = mysql_fetch_row($result_tables))
{
echo "Table : {$row[0]}\n";
[...]
}
Ce morceau de code est inutile, ca fait rajouter du texte au milieu de ton html et n'est pas afficher à l'écran.

Si tu veux avoir :
<option value="$row[0]>Table : $row[0]</option> c'est entre les balises options qu'il faut rajouter le texte ;)

Out pour le moment :)

Commentaire de Startide le 29/08/2006 15:13:43

Tiens vouais encore un truc ;)

Histoire de pas faire les cochonus...
<html>
<head>
<!-- Ton javascript -->
</head>
</body>
<!-- Reste du Code -->

</body>
</html>

Ca serait quand même mieux hein :ane:

Commentaire de caviar le 29/08/2006 17:26:23

lol :) Merci pour tes remarques :) Pour quelqu'un qui n'est pas dev (comme moi au passage ...) tu as un bon petit niveau quand même :)
Je vais modifier le html pour être bien comme il faut :) ... Je me disais aussi que c'était bizare comme syntaxe ... enfin j'ai regardé ça à partir de Golive la plus grosse m€rd que Adobe a sorti à mon sens ...

pour le javascript il n'est pas dans un head car ce fichier est appelé en include dans un autre fichier en fait ... donc bon ... Je vais laisser comme ça pour l'instant :)
merci @ toi;)
@++

Commentaire de caviar le 30/08/2006 09:42:12

bon j'ai fais quelques tests ...
le bug se situe sur la ligne

// on evite d'afficher un erreur d'index indefini sur la table si on a pas choisi de correspondance de champ avec @
@$valeurs[$numligneval] .= '\''.trim($tabcsv[$u][$_POST[$tempcol]]).'\'';

aux alentours des 500 ... mais je nage un peu moi même là ...lol

alors si ça vous inspire ;)
@+

Commentaire de caviar le 30/08/2006 10:10:03

ayé j'ai trouvé :)
ça marche et c'est mis à jour ;) ;) ;)
@++

Commentaire de Startide le 30/08/2006 11:55:19

Tiens je te balance le mien, j'ai fait du nettoyage et apporté un peu de couleurs :)

<html>
<head>
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_jumpMenu(targ,selObj,restore){ //v3.0
  eval(targ+".location='"+selObj.options[selObj.selectedIndex].value+"'");
  if (restore) selObj.selectedIndex=0;
}
//-->
</script>
</head>
<body>
<?php


// Liste les données de la table
// -------------------------------------------
include ('../conf/config.inc.php');
include ('../functions/mysql.php');

// on affiche les tables de la bdd
//pour que ce script fonctionne il faut au moins un enregistrement dans la table s?lectionn?e
function display_one_table($tablename){
//$query="show fields from $tablename";
//$result=mysql_query($query);
$result = requette ("show fields from $tablename");
$rows = mysql_num_rows($result);
?>

<table width ="95%" cellspacing="0" cellpadding="4" border="1" style="font-family:courier new;font-size:12px" align="center">
<tr style="background-color:silver">
<th colspan="6" style="font-size:14px">Informations sur la table <i><?php echo $tablename?></i></</th>
</tr>
<tr style="background-color:#ddd;font-size:12px">
<td>Field</td>
<td>Type</td>
<td>Null</td>
<td>Key</td>
<td>Default</td>
<td>Extra</td>
</tr>
<?php
while ($row = mysql_fetch_row($result)) {
?>
<tr style="background-color:<?php echo ($i++ %2 == 0 ? '#cee8ce' : '#f0f0f0') ?>">
<td><?php echo $row[0] ?>&nbsp;</td>
<td><?php echo $row[1] ?>&nbsp;</td>
<td><?php echo $row[2] ?>&nbsp;</td>
<td><?php echo $row[3] ?>&nbsp;</td>
<td><?php echo $row[4] ?>&nbsp;</td>
<td><?php echo $row[5] ?>&nbsp;</td>
</tr>
<?php
}
?>
</table>
<br />
<?php
}

///////////////////////
$result_tables = requette("SHOW TABLES FROM `".$bdd."`");
?>

<form action="" name="form_bdd" id="form_bdd" method="post" enctype="multipart/form-data">
<h3>Table de la base de donn&eacute;e qui va re&ccedil;evoir l'import</h3>
<select name="table">
<option value="" <?php if (!isset($_POST['table'])){ echo'selected'; } ?> >Choisissez une table</option>
<?php
while ($row = mysql_fetch_row($result_tables)) {
//   echo "Table : {$row[0]}\n"; // Morceau de code inutile non ? Du moisn incorrect !

   echo " <option ";
   if (isset($_POST['table']) && $row[0]==$_POST['table']){ echo'selected '; }
   echo "value=\"".$row[0]."\">Table : ".$row[0]."</option>";  
  echo "\n";
}
?>
</select>
<p style="font-weight:bold">Fichier CSV ou TXT au format csv</p>
<p style="color:#00f;font-weight:bold">Préparation du fichier : </p>
<p>Ouvrir le fichier dans excel. Créer une nouvelle colonne le plus à droite possible que vous remplirez avec ce que vous voulez... </p>
<p>Enregistrez sous >> CSV.</p>
<p>Cela permet au moment de l'enregistrement  au format CSV de générer le bon nombre de point virgule si certaines lignes n'ont pas d'infos dans leur dernière colonne. En effet excel ne rajoute pas de ";" après la dernière valeur d'une ligne même si il reste des colonnes vides... Au moment de l'import les lignes incomplètes sont ignorées. Il faut donc formatter le fichier csv dans excel grâce à cette petite manip avant de l'enregistrer.</p>

<p><input type="file" name="fichiercsv" size="16">
Délimiteur : <select name="del">
<option value=";" selected>; Point virgule</option>
<option value=",">, Virgule</option>
<option value=":">: Deux points</option>
<option value="-">- Tiret</option>
<option value="/">/ Slash</option>
<option value="|">| Barre</option>
<option value="#"># Dièse</option>
</select>
</p>
<p>
<input type="hidden" name="etape2" value="1">
<input type="submit" value="Etape II > Correpondance des champs">
</p>
</form>

<?php if (isset($_POST['table']) && $_POST['table'] !="" && isset($_POST['etape2'])) {
$del = $_POST['del'];
if( empty($_FILES['fichiercsv']['tmp_name'])){
exit('<p style="color:red;font-weight:bold">Vous n\'avez pas choisi de fichier à uploader</p></body></html>.');
}
?>
<form action="" name="form_import" id="form_import" method="post">
<?php
// on crée cette variable ici avant de faire le test car elle peut servir ? la suppression aussi

$content_dir = 'tmp/'; // dossier où sera déplacé le fichier

//---------------------


      $tmp_file = $_FILES['fichiercsv']['tmp_name'];
    
       if( !is_uploaded_file($tmp_file) )
       {
           exit("Le fichier est introuvable.<br /> Vous n'avez pas choisi de fichier ? uploader.");
       }
    
       // on v?rifie maintenant l'extension
       //$type_file = substr($_FILES['fichier']['name'], strrpos($_FILES['fichier']['name'], "."));
       $type_file = $_FILES['fichiercsv']['type'];
   //echo 'nom du fichier :'.$tmp_file.'<br />';
       //echo  'type du fichier : '.$type_file.'<br />';
  

$extensions_valides = array( 'csv' , 'txt' );
$extension_upload = substr(  strrchr($_FILES['fichiercsv']['name'], '.')  ,1);
if ( in_array($extension_upload,$extensions_valides) ){

       // on copie le fichier dans le dossier de destination
       $name_file = $_FILES['fichiercsv']['name'];
    
       if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
       {
           exit("Impossible de copier le fichier dans $content_dir");
       }
       ?>
<p>Le fichier <span style="color:#00f"><strong><?php echo '<a href="'.$content_dir.'/'.$name_file.'">'.$name_file.'</a>'?></strong></span> a bien été uploadé</p>
       <?php
   display_one_table($_POST['table']);
   echo '<p>&nbsp;&nbsp;&nbsp;</p>';

} else {
?>
<p style="color:red;font-weight:bold">Extension incorrecte. Vous pouvez uploader des <strong>csv, txt. </strong></p>
<?php
}

if(file_exists("$content_dir"."$name_file")) {

//on lis la 1ere ligne pour g?n?rer lles listes
$fp = fopen("$content_dir"."$name_file", 'r');
$str="";
$cpt=0;

$str .= fgets($fp, 99000);
//echo $str;
$str=trim($str);
if (substr($str,-1,1) != $del){
$str .= $del ;
}
//
$tabcsv = explode ($del, $str);
//echo $str;

fclose ($fp);
//on suppr les espaces
//print_r($tabcsv);
?>
<table width ="95%" cellspacing="0" cellpadding="4" border="0" style="font-family:courier new;font-size:12px" align="center">
<tr style="font-weight:bold">
<td>Champ de la table<span style="padding-left:6em">Forcer la valeur</span><hr></td>
<td>Champ du fichier CSV<hr></td>
</tr>
<tr>
<td>
<?php
//génération des listes de gauche avec les champs de la bdd
$resQuery = requette("SHOW FIELDS FROM ".$_POST['table']." FROM ".$bdd);
$fields = mysql_num_rows($resQuery);
if (mysql_num_rows($resQuery) != 0) {
$j = 0;
while ($j < $fields) {
?>
<select name="colone<?php echo $j ; ?>">
<option value="" <?php if (!isset($_POST['colone0'])){ echo'selected'; } ?> >Choisissez une colonne</option>
<?php

// on affiche les champs de la table choisie


  // titre des colonnes

  $i = 0;
    while ($i < $fields) {
    $savior = mysql_result($resQuery, $i);
echo '<option value="'.$savior.'"';
echo ($i == $j ? ' selected>' : '>');
echo $savior.'</option>';
echo "\n";
/*
echo "<option ";

    if ($i == $j){ echo'selected '; }
echo "value=\"";
echo mysql_result($resQuery, $i);
echo "\">";
echo mysql_result($resQuery, $i);
echo "</option>";
echo "\n";
*/
    $i++;
  }
  echo "\n";


?></select>
<input type="text" size="10" name="force<?php echo $j; ?>" style="width:50px;margin-left:1em"><br />
<hr>
<?php  
$j++;
} // fin while j
  
} ?>
</td>
<td>
<?php

// g?n?ration des listes ---------------------------

$j = 0;
while ($j < $fields) {
?>

<select name="colonecsv<?php echo $j ; ?>">
  <option value="" >Choisissez une colone</option>

<?php

// on affiche les champs de la table choisie


  // titre des colonnes

  $i = 0;
  while ($i < count($tabcsv)) {
echo "<option ";
    if ($i == $j){ echo 'selected '; }
echo "value=\"";
echo $i;
echo "\">";
echo $tabcsv[$i];
echo "</option>";  
echo "\n";
    $i++;
  }
  echo "\n";


?>   </select>
<hr>
<?php
$j++;
} //-------------------------------


} else {
echo 'erreur. Fichier csv mal uploadé.<p>&nbsp;&nbsp;&nbsp;</p>';
}

   ?>
</td>
</tr>
<tr>
<td colspan="3">
<input type="hidden" name="content_dir" value="<?php echo $content_dir ; ?>">
<input type="hidden" name="name_file" value="<?php echo $name_file ; ?>">
<input type="hidden" name="table" value="<?php echo $_POST['table'] ; ?>">
<input type="hidden" name="fields" value="<?php echo $fields ; ?>">
<input type="hidden" name="del" value="<?php echo $_POST['del'] ; ?>">
<input type="hidden" name="nb_colones_csv" value="<?php echo count($tabcsv)-1 ; ?>">
<input type="hidden" name="listeok" value="1">
<input type="submit"  value ="Etape III > Importer dans la bdd">
</td>
</tr>
</table>
</form>
<?php } //fin du if isset
else if (isset($_POST['etape2'])){
?>
<p style="color:red;font-weight:bold">Vous n'avez pas choisi de table où importer les données !</p>
<?php
}
?>

<?php if (isset($_POST['listeok'])){
echo '<strong>Traitement du fichier CSV</strong> <br /><br />';
$del = $_POST['del']; //choix du d?limiteur
$content_dir = $_POST['content_dir'];
$name_file = $_POST['name_file'];
$table = $_POST['table'];
//nb de champs dans la table
$fields = $_POST['fields'];
$nb_colones_csv = $_POST['nb_colones_csv'];

//on lis la 1ere ligne pour g?n?rer lles listes
$fp = fopen("$content_dir"."$name_file", 'r');
$str="";
$cpt=0;
while (!feof($fp)) {
$str = fgets($fp, 99000);


//on ?vite les lignes vides
if(!empty($str)){
//si on a pas de ; ? la fin d'une ligne on en ajoute une
//$str = "azerty";
$str=trim($str);
//echo 'dernier car de la ligne = '.substr($str,-1,1).'<br>';
if (substr($str,-1,1) != $del){
$str .= $del ;
}
//on remplace les ' par \'
$str = str_replace ("'","\'",$str);

$nbcar = strlen($str);
//on cherche les caract?res de s?paration
//echo 'nb de char sur la ligne='.$nbcar.'<br>';
$valligne [] ="";
// pour placer la valeur chaque fois dans la case suivante du tableau temporaire valligne
$vallignecpt = 0;


//PARSAGE DES VALEURS
// SI ON DEBUTE PAR UN "

while ($nbcar != 0){

$pos1=0;
if (substr($str,0,1) == '"'){
$pos1 = 1;
$trouve=0;
for ($pos=0 ; $trouve!= 1; $pos++){
$sepa = substr($str,$pos,2);
//echo 'caractere analis?='.$sepa.'<br>';
if( $sepa== '"'.$del){
$pos2 = $pos; //on r?cup?re la position du debut de l'enregistrement
//echo 'pos1='.$pos1.'<br>';
//echo 'pos2='.$pos2.'<br>';
$long = $pos2 - $pos1; //longueuur de la chaine à extraire
$tempstr = substr($str, $pos1, $long ); //on recup le reste de la ligne
//echo 'compteur ='. $vallignecpt.'<br>';
//on regarde si on a remplis le champ pour forcer la valeur
$tempforce = 'force'.$vallignecpt;
if (isset($_POST[$tempforce]) && $_POST[$tempforce] != ""){
$valligne [$vallignecpt] = trim($_POST[$tempforce]);
} else {
//sinon on remplis avec la valeur trouvée
$valligne [$vallignecpt] = $tempstr ;
}
$vallignecpt++;
//echo "<strong>Valeur ajoutée=</strong>".$tempstr.'<br><br>';
$trouve=1;
$str = substr ($str, ($pos2+2));
//echo 'Nouvelle Phrase='.$str.'<br>';
$nbcar = strlen($str);
}
}
} else {
$pos1 = 0;
$trouve=0;
for ($pos=0 ; $trouve!= 1; $pos++){
$sepa = substr($str,$pos,1);
//echo 'caractere analis?='.$sepa.'<br>';
if( $sepa == $del){
$pos2 = $pos; //on r?cup?re la position du debut de l'enregistrement
//echo 'pos1='.$pos1.'<br>';
//echo 'pos2='.$pos2.'<br>';
$long = $pos2 - $pos1; //longueuur de la chaine ? extraire
$tempstr = substr($str, $pos1, $long ); //on recup la valeur
//echo 'compteur ='. $vallignecpt.'<br>';
//on regarde si on a remplis le champ pour forcer la valeur
$tempforce = 'force'.$vallignecpt;
if (isset($_POST[$tempforce]) && $_POST[$tempforce] != ""){
$valligne [$vallignecpt] = trim($_POST[$tempforce]);
} else {
//sinon on remplis avec la valeur trouvée
$valligne [$vallignecpt] = $tempstr ;
}
$vallignecpt++;
//echo "<strong> valeur ajout?e=</strong>".$tempstr.'<br><br>';
$trouve=1;
$str = substr ($str, ($pos2+1));
//echo 'nouvelle Phrase='.$str.'<br>';
$nbcar = strlen($str);
}
}

}

}

//print_r ($valligne);
$tabcsv[$cpt] = $valligne;
$valligne = "";
$cpt ++;
//echo $str.'<br>';
}
}
fclose ($fp);
//print_r ($tabcsv);






//g?n?ration de la requette



$colones = "(" ;
for ($g=0; $g<$fields; $g++) {

$colones .=  '`'.$_POST["colone$g"].'`';
//pour ne pas ajouter de virgule apres la derniere colone on teste
if ($g < ($fields-1)){
$colones .= ", ";
}
}
$colones .= " ) ";
//echo '<br>colones = '.$colones;
//echo '<br> csv : ';
//echo $_POST['colonecsv0'];

echo $nb_colones_csv.' champs dans le fichier '.$name_file.'<br />';
echo $fields.' champs dans la table '.$table.'<br />';

//génération de la requette
$numligneval = 1;//compteur qui va donner le numero ? la ligne des valeurs ...pour ne pas avoir de trou dans l'index du tableau
//on incr?mente les lignes
for ($u=1; $u<=($cpt-1) ; $u++) {
// on verrifie que le parsage de la ligne soit bien fait en regardant que tabcsv contient bien le même nombre de champs pour cette ligne que le nombre de champs de la 1ere ligne du fichier csv
if (count($tabcsv[$u]) == $nb_colones_csv) {
$valeurs[$numligneval] = "(" ;
//on remplis les valeurs en fonction du nb de colones
for ($m=0; $m<$fields ; $m++) {

$tempcol = 'colonecsv'.$m;



//on stocke la valeur sans les espaces avant et après


// on evite d'afficher un erreur d'index indefini sur la table si on a pas choisi de correspondance de champ avec @
@$valeurs[$numligneval] .= '\''.trim($tabcsv[$u][$_POST[$tempcol]]).'\'';

//pour ne pas ajouter de virgule apres la derniere colone on teste

if ($m < ($fields-1)){
$valeurs[$numligneval] .= ", ";
}
}
$valeurs[$numligneval] .= " ) ";
$numligneval++;
} else {
//print_r ($tabcsv[$numligneval]);
//echo'<br>';
echo '<font color="red">Ligne '.($numligneval+1).' du fichier '.$name_file.' -> Erreur : '.count($tabcsv[$u]).' champs au lieu de '.$nb_colones_csv.' </font> - Ligne ignor?e. <br />';
//on remplis quand m?me le tableau des valeurs mais cette ligne sera ignor?e lors des insert ... ?a permet de garder le compteur des lignes ? jour au niveau du journal des erreurs sql
$valeurs[$numligneval] = "";
$numligneval++;
}

}



// FONCTIONS D'IMPORT DANS LA BDD
/* ?a n'est pas tout ? fait la m?me que dans mysql.php qui est en include
car celle ci affiche les erreurs sans couper le traitement en cas d'erreurs.
C'est celle l ? qu'on va donc utiliser */

function requette_avec_erreur($str_query, $connect=1)
{
if ($connect==1){connecter();} // si connect =1 on se connect
$resultat = mysql_query($str_query);
if ($connect==1){deconnecter();} // si connect =1 on se deconnect
if ($resultat)
{
return $resultat;
}
else
{
return 0;
//erreur(3); //si on veux renvoyer ? une action pr?cise en cas d'erreur
}
}
echo '<br /><strong>import en cours</strong> <br /><br />';
$erreur_sql = ""; //on initialise le journal des erreurs

//insert dans la base
echo 'La ligne 1 du fichier CSV correspond à la définition des champs. <br />';
connecter();
for ($u=1; $u<$numligneval; $u++) {
if ($valeurs[$u] != ""){
$req = "INSERT INTO $table $colones VALUES $valeurs[$u] ";
echo "<br>".$req.'<br />';

if (requette_avec_erreur($req,0)) {
echo 'ajout de la ligne '.($u+1).' du fichier '.$name_file.'.<br />';
} else {
$erreur_sql .= '<span style="color:red">Ligne '.($u+1).' du fichier '.$name_file.' -> Erreur SQL '.mysql_errno().' : '.mysql_error().'</span><br />';
echo '<font color="red">ligne '.($u+1).' -> Erreur SQL</font><br />';
}
}

}

deconnecter();
?>
<br /><strong>Fin de l'import</strong><br />
<strong> JOURNAL DES ERREURS SQL</strong><br />
<?php
if (!empty($erreur_sql))
{
echo $erreur_sql;
}
else
{
?>
Pas d'erreurs détectées lors de l'import
<?php
}
?>
<?php
}
?>
</body>
</html>

Commentaire de caviar le 30/08/2006 14:07:44

wahou :) lol
je vais regarder ça ...
ça en fait des lignes au final :)
merci
@++

Commentaire de caviar le 31/08/2006 14:55:24

et une petite maj de plus :)
possibilité de faire un md5 sur nimporte quelle valeur :)
++

Commentaire de Bimpson le 04/09/2006 17:18:16

Salut,

je viens d'essayer ton code, il marche nickel toutes les infos sont bien en place.
le seul petit soucis c'est que tous les champs sont "cryptés", j'explique :
j'ai "1efb20f4c3f28a30b57cbaa008dba012" au lieu de "Reference", ce qui est un peu gênant :)
avez-vous une réponse?

Merci d'avance Bimpson

Commentaire de Startide le 06/09/2006 14:53:14

Ben il a été passé à la sauce md5 ^^ doit y avoir un bug, ou alors t'as coché un truc pour crypter les champs vu que ca vient d'être rajouté.

Clef usb perdue, donc j'ai pas testé les nouvelles versions de ce code source :/ :(

Pi surtout d'autres trucs à faire au taf...

Commentaire de Startide le 08/09/2006 10:30:28

Poy, j'aimerais bien faire un "update" des champs quand il trouve une valeur d'une colonne spécifique déjà existante. Je un peu farfouillé ton code, mais j'avoue que ce morceau là reste asser obscur en ce qui me concerne :)

Une idée pour le gérer ? Même en "hardcodé" ca m'ira perso :D

Commentaire de caviar le 13/09/2006 12:24:04

?? quelqu'un d'autre à eu le bug du md5 partout où c'est une erreur d'utilistation de Bimpson ?
pas trop le tps de regarder là mais si c'est un réel bug je m'y penche ...
++

Commentaire de Bimpson le 13/09/2006 14:14:26

excuse moi caviar de ne pas avoir répondu avant..
mais c'est une erreur de manip de ma part... eh oui je suis un boulet! ;)
En tout cas ton script fonctionne super bien!
A+

Commentaire de Startide le 13/09/2006 15:17:56

Pas eu de soucis en ce qui me concerne :)

Sinon pour update ? :D :ane:

Commentaire de caviar le 15/09/2006 09:30:53

ah ouai c'est vrai j'avais oublié ce coup là du update ...
je m'y pencherai surement ... mais pas dessuite j'ai un oscommerce à modifier en ce moment ...je vous raconte pas la prise de tête ... c'est pas le même niveau là ... lol
mais j'y pense ;)
@++

Commentaire de Anardil le 15/11/2006 16:51:41

Salut,

J'ai un problème avec mon champ prix. Mes prix sont à virgules : 29,50 dans mon fichier csv. Dans ma table mysql j'ai comme type de champ pour prix DECIMAL(5,2). Quand je fais l'import je me retrouve avec des prix : 29.00 au lieu de 29,50. Ce qui est très embêtant !! comment je pourrais éviter ce problème?

Merci d'avance

Commentaire de alpha386 le 18/11/2006 05:26:50

Salut

Petite info, dans <form action='', c'est quoi que je dois mettre pour enfin réussir à importer des données dans ma base de données. Tout est correct, le programme affiche correctement mais il ne fais rien car l'action est vide. Il me serait très utile de savoir car cela arrive souvent de restaurer...

merci

Commentaire de gaeil le 20/11/2006 21:59:32

Bonjour,
je pense que ce programme est très utile.
c'est indiqué nulle part, mais je présume qu'on exécute le fichier import.php ?
j'ai bien configuré le fichier config. la base est crée, mais dans la boite déroulante, "choisissez une table" il n'y a rien... je n'ai pas de message d'erreur. j'arrive à bien choisir le fichier excel, mais sans plus, car il me dit que je n'ai pas choisi la table.
c'est d'autant plus bizarre qu'on indique le nom de la table dans le fichier config.
merci

Commentaire de caviar le 04/12/2006 23:20:17

salut ... ça fait un moment que je n'ai pas repris ce code et là comme ça je ne pourrai pas vous expliquer l'origine de vos problèmes ... je vais cependant m'y pencher....
juste une infos pour alpha 386 quand dans une form l'action est vide cela signifie que la form recharge la même page en lui passant les nouvelles variables...
@++

Commentaire de proinfo35 le 18/12/2006 18:23:09

Salut,

je viens de tester cette source. C'est très utile. Mais j'ai un soucis : il ne prend pas les doublons. impossible d'avoir un champ avec la même valeur sur toutes les entrées.

Si quelqu'un a une idée pour résoudre ce problème

Commentaire de titou0666 le 01/04/2007 17:28:04

j'ai galleré paendant des heures pour trouver un truc dans le genre et voila je viens d'installer le script et ça MARCHE impec !!! encore merci !!!

www.astrozorg.net

Zorg

Commentaire de caviar le 12/04/2007 14:29:08

proinfo35 > salut .. c'est ta bdd qui n'accepte pas les doublons sur une clef unique je pense .. non ? le script en tout cas ne regarde pas les données pour les comparer entre elles ...
sinon tu as la possibilité de forcer une valeur en entrant quelque chose ds le champ de texte ;)
++

Commentaire de ZOD31 le 26/07/2007 10:08:36

Salut avez-vous une idée pour que le transfert soit fait via un fichier xls ( traduction que ma page php le convertisse en csv et l'envoie sur ma bdd; et que l'utilisateur ne le fasse pas lui-même) puisque je galère la dessus depuis quelque temps. Merci d'avance.

Commentaire de pooks le 13/08/2007 15:25:38

Il tourne au poil ton script!
A quand une version qui permet de remplir plusieurs tables en même temps?

Commentaire de g_barthe le 13/08/2007 17:47:32

Bonjour à tous,
Cette source vient de m'etre très utile.

Marche au poil. c'est vrai que remplir plusieurs tables en même temps serait bien. Mais bon on va pas etre exigeant.

Le boulot est déjà fort.

Et la présentation est sobre et agréable.

Félicitation.

Commentaire de benoistd le 07/09/2007 17:51:01

Bonjour,

je viens de rencontrer un problème via un cvs gros gros taille

voici le message d'erreur

----
Traitement du fichier CSV


Fatal error: Maximum execution time of 30 seconds exceeded in /home.10.13/photoset/www/test/xlsmagique/import/import.php on line 380
----

celui ci intervient apres la seconde étape.

Merci de votre aide

Commentaire de g_barthe le 09/09/2007 00:11:45

Benoistd,
Là dans ton cas, je crois que c'est apache ou ton navigateur web qui a un timeout trop faible pour exécuter le script avec une trop gros csv.

SOit tu change le timeout ou tu découpe ton fichier pour les faire en plusieurs fois. C'est ce que je ferais. Changer le timeout n'est pas forcément judicieux (niveau sécurité).

@+

Commentaire de Moreno541 le 19/12/2007 16:09:55

Bonjour j'ai un probleme avec ton script j'ai ce message d'erreur : "Impossible de copier le fichier dans tmp/

Commentaire de Sebe2 le 09/02/2008 12:43:18

Salut,

Pour mes besoins, je devais utiliser ce petit outil très sympa mais impossible car quelques erreurs qui ne passaient sur mon navigateur (genre '<?' au lieu de '<?php'). Je peux filer les correctifs à l'auteur s'il veut mettre le package à disposition de tous !

A+

Commentaire de maxofnice le 03/03/2008 10:16:18 10/10

Bonjour,

J'en ai bcp sué avant de trouver ce script. Merci beaucoup à CAVIAR et STARTIDE. C'est tout simplement merveilleux.

Bonne journée

Commentaire de maxofnice le 07/03/2008 11:12:27

Bonjour,

Deux petits soucis :
1/ Le fichier texte que je récupère est délimité par des tabulations. J'ai essayé d'ajouter dans le groupe des délimiteurs \t ou [\t], mais ça ne marche pas. Quelqu'un a-t-il une idée, et le délimiteur tab est-il possible ?
2/ Le fichier texte que je récupère comprend des dates au format fr soit 07/03/2008. Ma table mysql ne veut que du format 2008-03-07. J'ai essayé :
$date = explode('/',$date);
echo $date[0],'-',$date[1],'-',$date[2];
et aussi
  $date = $date_us;
  $date_us = implode('-',array_reverse  (explode('/',$date)));
placé avant la ligne
fclose ($fp);
Marche pas. L'idéal serait une case à cocher dans le dernier tableau de correspondance dans le même esprit que la case "md5", mais j'ai déjà atteint mon niveau d'incompétence :)

Si quelqu'un passe par là, merci d'avance de son aide.

Commentaire de ham_mer le 03/06/2008 13:11:48

Génial ce script, très pratique !

Par contre je ne sais pas si ça vient de php5 mais comme il a été dit plus haut, il faut remplacer les <? par <?php sinon plantage du code !

Commentaire de jietch le 12/06/2008 11:23:54

Sinon quelqu'un aurait une idée pour l'update et la gestion des clés étrangères?
Sinon ce code est géniale et trés pratique!

Commentaire de Limahl19 le 02/09/2008 17:23:58

alors moi le script marche bien....
j'ai pris celui de STARTIDE posté plus haut.

la requeste d'insert qui s'affiche est

INSERT INTO test2 (`id`, `datesaisie`, `datefin`, `nom`, `prenom`, `adresse`, `ville`, `cp`, `tel`, `email`, `marque`, `modele`, `annee`, `kilometre`, `etat`, `description`, `affichercontact`, `duree`, `photo1`, `photo2`, `photo3`, `photo4`, `photo5`, `petite1`, `petite2`, `petite3`, `petite4`, `petite5` ) VALUES ('', '', '', '', '', '', 'PUYCORNET', '82220', '', '', 'WI', 'NULL', '1967', '1', '', 'JEEP WILLYS DIES. D', '', '', '', '', '', '', '', '', '', '', '', '' )

pourtant dans ma base de données le cp qui s'affiche est que 8 au lieu de 82220.

est ce que quelqu'un pourrait m'aider?

Commentaire de 34140bruno le 20/10/2008 14:34:07

Bonjour,

Je débute et souhaite mettre en ligne un site, pour cela je tente depuis 3h d'utiliser ta contribution mais je suis tellement nul que nada .
Alors le "blaireau" que je suis demande si on peut m'assister dans l'utilisation de ce prog.

Merci à tous

Cordialement

Bruno

Commentaire de pifou25 le 30/10/2008 08:50:50

bonjour,
Bon script apparement au vu des commentaires. Les pb de <? à la place de <?php, balise courte ou balise longue c'est au niveau du serveur (apache ou php) que ça se règle. la norme c'est quand même les balises longues en principe ;)
Bon moi j'aurais un pb de fichier trop gros à uploader, il faudrait une liste déroulante pour sélectionner le fichier qui aurait été transféré par FTP dans le rép TMP (par exemple) donc zapper l'étape de l'upload par formulaire. D'ailleurs pour la suite la requête devrait optimiser les inserts par paquets plutôt que ligne par ligne.

Commentaire de caviar le 07/11/2008 21:08:44

wahou ! ça faisait un bai que j'étais pas passé sur ma source. lol
ben merci pour tous les commentaires encourageants :) ça fait plaisir même deux ans plus tard (déjà !).
Je reçois régulièrement des emails pour me demander de l'aide pour utiliser cette source mais j'avoue que ça fait tellement longtemps que e l'ai pondue que je suis aussi paumé que vous. lol
Entre temps si c'est juste pour traiter du BATCH j'ai découvert un soft qui s'appelle EMS MySQL manager ... et ça importe les CSV trèèèès bien.
vala
merci encore et @ ++

Commentaire de eenn52 le 07/12/2008 15:49:39 10/10

Je viens de l'essayer sur mes contacts outlook express ca marche impeccablement .Merci.

Commentaire de corresp le 26/12/2008 17:36:56

Hello
Je viens de télécharger ce script mais contrairement à ce qui est dit, moi j'ai des erreurs dès le début:
1 - Notice: Undefined variable: result in C:\Program Files\EasyPHP 2.0b1\www\import\import\import.php on line 43
2 - Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in C:\Program Files\EasyPHP 2.0b1\www\import\import\import.php on line 43
3 - Fatal error: Call to undefined function requette() in C:\Program Files\EasyPHP 2.0b1\www\import\import\import.php on line 60

Y a-t-il un version définitive et corrigée de ce script ?
Merci

Commentaire de mikhal le 29/12/2008 10:41:14

tout simplement magnifique ton code!!

Commentaire de ChRom le 02/03/2009 20:23:40

Super code :) Rien a dire parfait pour les exports

Commentaire de settoken le 03/09/2009 23:17:16

Impossible de tester ce code à cause d'une erreur incompréhensible

Parse error: parse error in C:\WAMP\www\ImportCSV_V3\import\import.php on line 59

c'est l'accolade qui ferme la fonction display_one_table, je ne comprend pas ce qui cloche.

Commentaire de bansai1986 le 25/09/2009 14:18:42

Bonjour, super code, j'ai pu gagner du temps pour mon projet.
Ca marche sur Wamp 2.0, apache 2.2, PHP 5.3

@ Settkonen et à ceux qui ont ce problème:

1) Modifier les balises <? par <?php

2)Enlever le mysql_close dans la fonction déconnexion de mysql.php car sans variable à l'intérieur, apache te fait un jolie message d'erreur. Il faudrait mettre la variable $connexion dedans mais ca passe pas.

Commentaire de airbud le 08/01/2010 12:05:55 10/10

Excellent source, simple, utile et fonctionnel ! Le code qui fait gagner du temps...Perso je compte l'utiliser pour migrer une base FileMaker vers MySQL, et le fait de selectionner les champs source et destination et crucial (ma structure de base va pas mal changer au passage). Il se pourrait que j'utilise ce code sur d'autres projets et qu'au passage j'y ajoute ma touche, auquel cas je repasserai ici. Merci merci !

Commentaire de lanner le 08/01/2010 17:06:27 10/10

Salut

Quelqu'un aurait une source "propre", trop d'erreur sur celle ci (ligne 85, elle ne fonctionne d'ailleurs je pense sur nouvelles mises à jour php 5

merci d'avance

Commentaire de fscalda le 12/05/2010 10:40:11

J'étais bien em** avant de trouver ton programme, franchement, de la bombe !
LANNER, j'insère mon CSV dans ma base en local avec un bon vieux easyphp 1.8 et ça fonctionne, ensuite je l'exporte et ré-importe sur ma base en php5 définitive, ça ait un peu bricolage, mais ça me permet de vérifier si tout se passe bien. Si ça peut t'aider ;)

Commentaire de Hades28 le 26/05/2010 11:32:33

Bonjour, beau boulot pour ce script CAVIAR, malheureusement, il ne marche absolument pas chez moi :'(
La connexion de s'effectue pas, le nombre d'erreur qui sont corrigé lors de la suppression des commentaires est énormes, j'ai bien corriger les soucies <? en <?php mais cela n'y fait rien, je ne comprend pas, j'y suis depuis 8h ce matin et malgré tout mes testes, des erreurs "magiques" sont encore la, y'a t'il une nouvelle version plus récente ( s'adaptant au PHP5 et a MySQL ) ou cela est-il déjà arriver à quelqu'un ( et peut-il me donner la solution ?) d'avance merci

Commentaire de Hades28 le 28/05/2010 09:10:06

Ok, j'ai trouvé, merci !

Commentaire de shannara le 07/06/2010 14:29:31

salut

Pour les besoins de mon stage,
j'ai utilisé ton script.
Avec mon tuteur, j'ai débugué et optimisé le script.
j'ai mis en ligne le code source.
Voci le lien:
http://www.phpcs.com/codes/IMPORT-FICHIERS-CSV-DANS-BASE-DONNEES_51860.aspx

Commentaire de cosmexpert le 06/10/2010 18:50:59

même remarque que corresp le 26/12/2008: la fonction requette() lui est inconnue!
Ayant eu ce message dès le départ, j'ai utilisé la version dite déboguée de shannara le 07/06/2010 ...ce qui ne change rien!
Merci de votre aide.

Commentaire de nicov29280 le 14/01/2011 19:18:08

Je suis moi aussi bloqué par la fonction requette. Quelqu'un aurait-il réussi à trouver d'où vient le bug ?

Commentaire de bigthulhu le 26/01/2011 23:03:33

Tres bonne demo ...

Excusez moi les amis ??!!

En faite je travail sur ce scrypt depuis 2 jours et je n'arrive pas a le transformer un peux, ce que je vouderai faire c'est metre le nom de la table par defaut sans avoir a choisir dans un menu deroulant, et aussi rendre le menu deroulant du choix de colones comme celuis du choix de la table sur votre demo (sans avoir toute les lignes des colones qui s'affichent une en bas de l'autre) question de reduire la taile de la page si on a trop de colone sur notre base de donnees,

Merci pour votre soutient.

Commentaire de lelapinvert le 28/03/2011 08:58:50

Bonjour,
Moi aussi j'ai un problème à l'appelle de la fonction 'requette':
$result_tables = requette("SHOW TABLES FROM `".$bdd."`");

il me dit que la fonction n'est pas défini

J'utilise le fichier de Startide (je l'ai nommé test.phtml) avec le code de caviar.

Je pense que le pb vient de :
include ('functions/mysql.php');

je sais que le chemin est bon car si je le change il me met une d'erreur à cette ligne.

Si je copie colle la fonction 'requette' (du fichier mysql.php) au dessus ben la il la voie bien mais l'erreur est que la variable $bdd n'est pas défini.

Donc 'include' fonctionne mal mais je ne sais pas pourquoi...
J'ai même mis tout les fichiers dans le même répertoire mais sa change rien.
Petite précision : je suis sous windows.

Commentaire de omisse le 07/12/2011 11:10:55

J'ai télécharger le zip, configurer conf.inc.php, j'ai déplacer le dossier vers htdocs, mais en essayant 'http://localhost/import_CSV/import/import.php', ca m'afficher rien.
Quelqu'un pourrait m'aider ??

Commentaire de claude77260 le 21/09/2012 12:04:46

Bonjour,
et même en 2012 il est très utile
j'ai pris le script amélioré de Startide

fonctionne du premier coup un miracle sur le net

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

importer fichier csv [ par candice9 ] Salut!j'ai repris le code de xabivalencia pour importer des fichiers csv vers la base de donnees et ca marche bien.mais j'aimerais que l'enregistremen export vers excel [ par nariel1 ] Bonjour,Je sais que cette question à deja ete possé mais je n'ai pas trouvé mon bonheurvoila je veux faire un export d'une vers excel . J'ai donc fait import csv [ par fistal ] bonjour il est possible de m'explique comment on fait un import d'un fichié csv dans phpmysql pasque la c'est vraiment la galère je comprend rien a se Ouvrir un fichier csv [Excel] [ par xactise ] Bonjours j'ai creer une requete PHP qui envoie des champs d'une table SQL dans un fichier *.csv (Excel) donc jouvre le fichierj'insere le contenuje le importer des données de l'excel vers phpmyadmin [ par hajarkoui ] Je travail actuellement sur une base de donnée sur phpmyadmin. Je souhaiterai importer le contenu d'un fichier excel dans une table de cette base de d CSV à Mysql : probleme des accents sur les majuscules [ par kataVB ] boujour tout le mondeboujour tout le mondePour un site j'ai eu besoin de faire un petit script pour importer des fichies csv vers une table Mysql. <br import xml dans mappage excel [ par liloo81 ] bonjour, je souhaiterais importer des données au format xml dans un fichier excel contenant un mappage xml formaté par les utilisateurs puis uploadés EXCEL --> CSV [ par sidf ] Bonjour,read excel  que je pensais utiliser ne conserve pas certains caractères - genre N° tel (66) 250-693  transformé en 66250693et je suis donc obl comment importer une fichier excel dans mysql avec phpmyadmi [ par fraisa1985 ] Salut a tous, j'ai une fichier excel sous format csv qui contient deux champ "word" et "nombre d'occurences" .Cette table contient 50000 champs. comm


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,978 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales