PHP vers sql ou excel

Mammouth du PHP | 687 Messages

12 avr. 2011, 18:39

Merci Vraiment!
J'apprécie ton aide!
Très bien pour le résultat des tests en MP pas de problème. ;-)
Pour répondre à ta question il n'y a qu'un seul fichier (.TXT) source avec tous les textes.
En fait tous les textes se trouvent dans un fichier TXT que je corrige pour qu'il puisse avoir la forme |intitulé#, une fois cette opération effectuée je fais une importation dans la base sql, pour que le programme que tu as créé puisse agir sur cette table...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2011, 22:04

Oui mais tu peux avec le programme qu'on est en train de finaliser, utiliser le fichier TXT directement pour extraire les valeurs sans le passer dans la base au préalable. Mais dans ce cas, il faut séparer les annonces qui se trouvent dans le fichier texte par un saut de ligne marqué par un délimiteur exemple : ^P pour que le programme sache combien d'enregistrements (annonces) il doit extraire.

Par exemple :
|nom#LEGRAND
|prenom#Aline
|Adresse#12 rue des mouettes
|Ville#72000
|Pays#France
^p
|nom#LEDUC
|prenom#Pauline
|Adresse#23 rue de la gare
|Ville#72000
|Pays#France
^p
|nom#REQUIN
|prenom#Sébastien
|Adresse#3 rue racine
|Ville#72000
|Pays#France
^p
|nom#LEROY
|prenom#Daniel
|sexe#M
|Adresse#20 rue nationale
|Ville#72000
|Pays#France
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

12 avr. 2011, 22:09

AH oui d'accord je vois. Le problème c'est qu'il y a des centaines de lignes donc le traitement manuel risque de prendre quelques années... :lol:
A la limite je préfère importer manuellement dans phpmyadmin.
Du coup comment peut-on procéder pour la base? on fait comme tu as dit?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2011, 23:11

Houla, on trouvera bien une solution #-o

En tout cas, Voici le programme final réadapté :
<?php
// Source de données à importer avec le délimiteurs suivants :
// ^p : saut de ligne entre les enregistrements
// | nom du champ #
// # texte valeur du champ précédent (saut de ligne ou fin de fichier)
//
// données sous forme de fichier texte externe
$source_data = file_get_contents("data1.txt");

// diviser la source en lignes d'enregistrements (délimiteur ^p)
$tab_source_data = explode('^p', $source_data);
//echo "<pre>"; print_r($tab_source_data); echo "</pre>";

// Extraction des données dans le tableau final
$tab_final = array();
$file_attente_sql = array(); // file d'attente SQL qui va contenir le lot de requêtes à exécuter
foreach($tab_source_data as $j=>$enregistrement){
	// initialisation de la requête INSERT/SET pour cet enregistrement
	$sql_insert = "INSERT INTO `module_appel_doffre` SET ";

	// Extraction des couples champ/valeur
	$couples_champs_valeurs = explode('|', $enregistrement);
	//echo "<pre>"; print_r($couples_champs_valeurs); echo "</pre>";
	// Exctraction de chaque champ et sa valeur, puis stockage de $tab_final
	foreach($couples_champs_valeurs as $intitulé_valeur){
		$temp = explode('#', $intitulé_valeur);
		if (count($temp)>=2) { // 2 champs attendus
			list($intitulé, $valeur) = $temp;
			if (trim($intitulé)!='') {
				//conversion de l'intitulé d'un champ éliminer des caractères indésirables
				$intitulé = conversionCar($intitulé);
				//transformation: attention sous MySQL, la taille max nom du champ = 64 car
				$intitulé = trim(substr($intitulé, 0,64));    
				// stockage dans $tab_final et requête SQL
				$tab_final[$j][trim($intitulé)] = trim($valeur); // $j = n°ligne enregistrement
				$sql_insert .=  " `" . trim($intitulé) . "` = '" . addslashes(trim($valeur)). "',";
			}
		}
    }
	// ajouter la requête à la file d'attente SQL
	$file_attente_sql[]['requête'] = preg_replace('#(,)\s*$#', ';', $sql_insert);  // remplacer la dernière virgule dans SQL par ;
}

// affichage juste pour le test
//echo "<pre><b>Tableau Final</b> : "; print_r($tab_final); echo "</pre>";

// Exécution des requêtes de la file d'attente SQL
mysql_select_db("test", mysql_connect("localhost", "root")) or die(mysql_error());
if (count($file_attente_sql)>0){
	foreach($file_attente_sql as $i=>$sql){
		if (trim($sql['requête'])!='' && @mysql_query($sql['requête'])) $file_attente_sql[$i]['état']='Ok'; 
		else $file_attente_sql[$i]['état']='kO ('.mysql_errno().') : '.mysql_error();		
	}
}
mysql_close();
// affichage de l'état d'exécution des requêtes
echo "<pre>"; print_r($file_attente_sql); echo "</pre>"; 

// FIN DU PROGRAMME PRINCIPAL

// fonction de conversion utilisée pour transformer des caractères indésirables
function conversionCar($intitulé){
   // Tableau de conversion : la première chaine des array peut être enrichi dans le temps
   $conversion = array( 
      array('[,?;.:/!&~’"\#\\\'}{)(\]\[+*=§%µ$£€¤¨`\<>]', ''), // tous les caractères spéciaux sont effacés
      // Remplacement des caractères accentués
      array('[éèêë]', 'e'),
      array('à', 'a'),
      array("ç", 'c'),
      array('ù', 'u'),
      // Attention: les règles suivantes sont enchainées et doivent rester les dernières
      array('(-)', ' '), // un tiret => un seul espace
      array('(\s+)', ' '), // plusieurs espace => un seul espace
      array('\s', '_') //  un espace => un souligné _
    );
       
        foreach($conversion as $regle){
                list($car_indesirable, $car_valide) = $regle;
                $intitulé = preg_replace('#'.$car_indesirable.'#', $car_valide, trim($intitulé));
        }
        return strtolower(trim($intitulé)); // en minuscule
}
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

12 avr. 2011, 23:16

Merci.
Je vais le tester tout de suite.
EN attendant sais-tu comment je peux faire pour que lorsque je clique sur le lien "lire la suite" du résultat de la recherche pour que la page d'affichage appelée affiche les données corresponds au choix du clique car actuellement lorsque je clique dessus j'ai les infos de la première fiche de la base... :cry:

Je pense qu'il faut faire un WHERE, non?
WHERE objet_du_marche = '$_GET[mots_cles]'

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2011, 23:28

Attends, j'ai fais des modifications, voici le nouveau code :
[php]
<?php
// Source de données à importer avec le délimiteurs suivants :
// ^p : saut de ligne entre les enregistrements
// | nom du champ #
// # texte valeur du champ précédent (saut de ligne ou fin de fichier)
//
// données sous forme de fichier texte externe
$source_data = file_get_contents("data1.txt");

// diviser la source en lignes d'enregistrements (délimiteur ^p)
$tab_source_data = explode('^p', $source_data);
//echo "<pre>"; print_r($tab_source_data); echo "</pre>";

// Extraction des données dans le tableau final
$tab_final = array();
$file_attente_sql = array(); // file d'attente SQL qui va contenir le lot de requêtes à exécuter
foreach($tab_source_data as $j=>$enregistrement){
	// initialisation de la requête INSERT/SET pour cet enregistrement
	$sql_insert = "INSERT INTO `module_appel_doffre` SET ";

	// Extraction des couples champ/valeur
	$couples_champs_valeurs = explode('|', $enregistrement);
	//echo "<pre>"; print_r($couples_champs_valeurs); echo "</pre>";
	// Exctraction de chaque champ et sa valeur, puis stockage de $tab_final
	foreach($couples_champs_valeurs as $intitulé_valeur){
		$temp = explode('#', $intitulé_valeur);
		if (count($temp)>=2) { // 2 champs attendus
			list($intitulé, $valeur) = $temp;
			if (trim($intitulé)!='') {
				//conversion de l'intitulé d'un champ éliminer des caractères indésirables
				$intitulé = conversionCar($intitulé);
				//transformation: attention sous MySQL, la taille max nom du champ = 64 car
				$intitulé = trim(substr($intitulé, 0,64));    
				// stockage dans $tab_final et requête SQL
				$tab_final[$j][trim($intitulé)] = trim($valeur); // $j = n°ligne enregistrement
				$sql_insert .=  " `" . trim($intitulé) . "` = '" . addslashes(trim($valeur)). "',";
			}
		}
    }
	// ajouter la requête à la file d'attente SQL
	$file_attente_sql[]['requête'] = preg_replace('#(,)\s*$#', ';', $sql_insert);  // remplacer la dernière virgule dans SQL par ;
}

// affichage juste pour le test
//echo "<pre><b>Tableau Final</b> : "; print_r($tab_final); echo "</pre>";

// Exécution des requêtes de la file d'attente SQL
mysql_select_db("test", mysql_connect("localhost", "root")) or die(mysql_error());
if (count($file_attente_sql)>0){
	foreach($file_attente_sql as $i=>$sql){
		if (trim($sql['requête'])!='' && @mysql_query($sql['requête'])) $file_attente_sql[$i]['état']='Ok'; 
		else $file_attente_sql[$i]['état']='kO ('.mysql_errno().') : '.mysql_error();		
	}
}
mysql_close();
// affichage de l'état d'exécution des requêtes
echo "<pre>"; print_r($file_attente_sql); echo "</pre>"; 

// FIN DU PROGRAMME PRINCIPAL

// fonction de conversion utilisée pour transformer des caractères indésirables
function conversionCar($intitulé){
   // Tableau de conversion : la première chaine des array peut être enrichi dans le temps
   $conversion = array( 
      array('[,?;.:/!&~’"\#\\\'}{)(\]\[+*=§%µ$£€¤¨`\<>]', ''), // tous les caractères spéciaux sont effacés
      // Remplacement des caractères accentués
      array('[éèêë]', 'e'),
      array('à', 'a'),
      array("ç", 'c'),
      array('ù', 'u'),
      // Attention: les règles suivantes sont enchainées et doivent rester les dernières
      array('(-)', ' '), // un tiret => un seul espace
      array('(\s+)', ' '), // plusieurs espace => un seul espace
      array('\s', '_') //  un espace => un souligné _
    );
       
        foreach($conversion as $regle){
                list($car_indesirable, $car_valide) = $regle;
                $intitulé = preg_replace('#'.$car_indesirable.'#', $car_valide, trim($intitulé));
        }
        return strtolower(trim($intitulé)); // en minuscule
}
[/php]
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

12 avr. 2011, 23:32

Merci.
ça tombe bien car je viens de le tester et l'affichage du tableau se faisait bien. J'ai réussi à intégrer dans le fichier le symbole "^p" comme tu me l'avais suggéré mais les infos ne se charge pas dans la base.
Je vais tester celui-ci. je te dis ça tout de suite...

Mammouth du PHP | 687 Messages

12 avr. 2011, 23:37

Je viens de tester le nouveau programme et le tableau final s'affiche correctement mais ne se charge pas dans le base...
Il ne créé pas les intitulés de la base comme le précédent programme?

Mammouth du PHP | 687 Messages

13 avr. 2011, 00:12

du coup je viens de recréer la table correspondant au programme en espérant que les intitulés correspondront à chaque fois.
Je rencontre cette erreur : [état] => kO (1110) : Column 'courriel' specified twice
J'ai regardé dans ma table et il n'y a qu'un champs "courriel" je pense que cette erreur provient du fichier .TXT...?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 avr. 2011, 00:36

wi dans la requête générée et/ou dans le fichier TXT.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

13 avr. 2011, 00:39

C'est bien ce qu'il me semblait mais le problème c'est que parfois dans une fiche il y a 2x tél ou 2x courriel etc...

Mammouth du PHP | 687 Messages

13 avr. 2011, 00:44

tu sais je ne veux pas trop te déranger. tu m'aides depuis le début donc si tu en as marre je comprendrais que tu veuilles arrêter...
Attention ce n'est pas ce que je souhaite car tu m'aides vraiment beaucoup et tu comprends exactement ce que je souhaite.
Mais je ne veux pas être trop envahissant... :oops:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 avr. 2011, 00:53

Ne t'en fais pas aller au travail. :lol:

Voici une modif du code qui évite 2 champs homonymes même s'ils se trouvent dans le fichier TXT l'un après l'autre dans le même enregistrement c'est le dernier qui sera pris. Et si tu veux avoir 2 tél par exemple il faut leur donner 2 noms différents dans le fichier TXT et dans la base.

Le code retouché (modif= séparer le bloc de génération SQL de celui qui extrait dans $tab_final)
<?php
// Source de données à importer avec le délimiteurs suivants :
// ^p : saut de ligne entre les enregistrements
// | nom du champ #
// # texte valeur du champ précédent (saut de ligne ou fin de fichier)
//
// données sous forme de fichier texte externe
$source_data = file_get_contents("data1.txt");

// diviser la source en lignes d'enregistrements (délimiteur ^p)
$tab_source_data = explode('^p', $source_data);
//echo "<pre>"; print_r($tab_source_data); echo "</pre>";

// Extraction des données dans le tableau final
$tab_final = array();
foreach($tab_source_data as $j=>$enregistrement){
	// Extraction des couples champ/valeur
	$couples_champs_valeurs = explode('|', $enregistrement);
	//echo "<pre>"; print_r($couples_champs_valeurs); echo "</pre>";
	// Exctraction de chaque champ et sa valeur, puis stockage de $tab_final
	foreach($couples_champs_valeurs as $intitulé_valeur){
		$temp = explode('#', $intitulé_valeur);
		if (count($temp)>=2) { // 2 champs attendus
			list($intitulé, $valeur) = $temp;
			if (trim($intitulé)!='') {
				//conversion de l'intitulé d'un champ éliminer des caractères indésirables
				$intitulé = conversionCar($intitulé);
				//transformation: attention sous MySQL, la taille max nom du champ = 64 car
				$intitulé = trim(substr($intitulé, 0,64));    
				// stockage dans $tab_final et requête SQL
				$tab_final[$j][trim($intitulé)] = trim($valeur); // $j = n°ligne enregistrement
			}
		}
    }
}

// affichage juste pour le test
//echo "<pre><b>Tableau Final</b> : "; print_r($tab_final); echo "</pre>";

// file d'attente SQL qui va contenir le lot de requêtes à exécuter
$file_attente_sql = array(); 
foreach($tab_final as $enregistrement){
	// initialisation de la requête INSERT/SET pour cet enregistrement
	$sql_insert = "INSERT INTO `module_appel_doffre` SET ";
    foreach($enregistrement as $champ=>$valeur){
		$sql_insert .=  " `" . trim($champ) . "` = '" . addslashes(trim($valeur)). "',";
	}
	// ajouter la requête à la file d'attente SQL
	$file_attente_sql[]['requête'] = preg_replace('#(,)\s*$#', ';', $sql_insert);  // remplacer la dernière virgule dans SQL par ;
}

// Exécution des requêtes de la file d'attente SQL
mysql_select_db("test", mysql_connect("localhost", "root")) or die(mysql_error());
if (count($file_attente_sql)>0){
	foreach($file_attente_sql as $i=>$sql){
		if (trim($sql['requête'])!='' && @mysql_query($sql['requête'])) $file_attente_sql[$i]['état']='Ok'; 
		else $file_attente_sql[$i]['état']='kO ('.mysql_errno().') : '.mysql_error();		
	}
}
mysql_close();
// affichage de l'état d'exécution des requêtes
echo "<pre>"; print_r($file_attente_sql); echo "</pre>"; 

// FIN DU PROGRAMME PRINCIPAL

// fonction de conversion utilisée pour transformer des caractères indésirables
function conversionCar($intitulé){
   // Tableau de conversion : la première chaine des array peut être enrichi dans le temps
   $conversion = array( 
      array('[,?;.:/!&~’"\#\\\'}{)(\]\[+*=§%µ$£€¤¨`\<>]', ''), // tous les caractères spéciaux sont effacés
      // Remplacement des caractères accentués
      array('[éèêë]', 'e'),
      array('à', 'a'),
      array("ç", 'c'),
      array('ù', 'u'),
      // Attention: les règles suivantes sont enchainées et doivent rester les dernières
      array('(-)', ' '), // un tiret => un seul espace
      array('(\s+)', ' '), // plusieurs espace => un seul espace
      array('\s', '_') //  un espace => un souligné _
    );
       
        foreach($conversion as $regle){
                list($car_indesirable, $car_valide) = $regle;
                $intitulé = preg_replace('#'.$car_indesirable.'#', $car_valide, trim($intitulé));
        }
        return strtolower(trim($intitulé)); // en minuscule
}
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

13 avr. 2011, 01:16

Merci !
Pour le programme aie...
Car en fait chaque numéro de tél est différent donc il faut que je puisse les récupérer... Mais je ne peux pas modifier le .TXT manuellement car il y a beaucoup trop de tél...
Donc je pense que le mieux c'est de repartir sur la base du premier programme en utilisant cette fonction:
function conversionCar($intitulé){
   // Tableau de conversion : la première chaine des array peut être enrichi dans le temps (format expressions régulières)
   $conversion = array(
      array('[,?;.:/!&~’"\#\\\'}{)(\]\[+*=§%µ$£€¤¨`\<>]', ''), // tous les caractères spéciaux sont effacés
      // Remplacement des caractères accentués
      array('[éèêë]', 'e'),
      array('à', 'a'),
      array("ç", 'c'),
      array('ù', 'u'),
      // Attention: les règles suivantes sont enchainées et doivent rester les dernières
      array('(-)', ' '), // un tiret => un seul espace
      array('(\s+)', ' '), // plusieurs espace => un seul espace
      array('\s', '_') //  un espace => un souligné _
    );
Le soucis que j'avais eu c'est qu'il ne remplaçait pas les "é", "è" etc. par le "e"...

Voici comment je vois la chose, et vraiment si tu peux me donner ton avis n'hésite pas, tu as toute la technique toi, donc tu pourras me dire ce qu'il est possible de faire ou pas... :wink:

1) j'importe mon .txt
2) je lance le programme V.1 qui s'occupe de récupérer les intitulés et les informations qui vont avec selon les conditions imposées par les |et les #
3) Page de recherche avec le lien en savoir plus (ce lien permet d'afficher les informations concernant la fiche qui vient d'être recherchée) ==> Actuellement la fiche qui s'affiche ne correspond en rien au résultat de la recherche
4) Un fois que le lien "en savoir plus"sera valide, nous pourrons lui demander d'afficher la suite des informations sous forme de fiche (fiche que je suis en train de créer)

Voila ce qu'il reste à faire c'est donc:
1) Voir comment nous pouvons gérer l'intégration des données et des intitulés dans la base
2) voir comment faire le lien entre la page des résultats de recherche et la page page d'affichage de la fiche complète

Je pense que c'est tout, tu me diras c'est déjà pas mal mais le plus dur est fait je pense...
Surtout n'hésite pas à me dire comment tu perçois les choses au vu de ton œil extérieur et professionnel.

Merci!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 avr. 2011, 19:29

En fait, les 2 programmes qu'on a fait la V1 et la V2 sont complémentaires et pratiquement les mêmes au niveau de l'importation des valeurs. De toutes façons, la création des colonnes dans la base de données va se faire une fois contre plusieurs importations de données.

Pour la question du lien "lire la suite" de ta question 3
3) Page de recherche avec le lien en savoir plus (ce lien permet d'afficher les informations concernant la fiche qui vient d'être recherchée) ==> Actuellement la fiche qui s'affiche ne correspond en rien au résultat de la recherche
si le programme que t'as déjà fait ne fonctionne pas à ce niveau c'est qu'il y a un problème de conception de cette méthode de recherche. En voici donc l'analyse:
En principe, une page affiche la liste des offres avec un lien pour chaque offre pour en afficher le détail. Pour ce faire, le lien envoi vers une page PHP qui doit chercher l'offre sélectionnée par le critère associé au lien et passé dans $_GET. Pour que le programme php de recherche puisse réussir sa requête SELECT/WHERE et trouver le détail de l'enregistrement ciblé, il faut que le critère envoyé par le lien soit un champ de la table interrogée et soit un critère unique comme un identifiant qui identifie un enregistrement de la table. Bon moi je ne connais pas vraiment la structure de la table interrogée mais je donnerai un exemple simple :

Soit la table suivante déjà créé et remplie: client(id clé primaire, nom, prénom, adresse, tél, ...)
Supposons qu'on a affiché les clients par nom dans une liste avec un lien "Détail" pour afficher les autres données d'un client sélectionné. Cette liste peut être comme suit (au format html pour simplifier l'exemple):
<p>
9  	LEGRAND  	<a href="afficherDetailClient.php?id=9">Lire de détail</a><br />
10 	LEDUC 	<a href="afficherDetailClient.php?id=10">Lire de détail</a><br />
11 	REQUIN     <a href="afficherDetailClient.php?id=11">Lire de détail</a><br />
12 	LEROY      <a href="afficherDetailClient.php?id=12">Lire de détail</a><br />
</p>
Le programme PHP qui est appelé par les liens hypertexte est "afficherDetailClient.php" et il reçoit le paramètre $_GET['id'] qui représente le critère à rechercher dans la table client pour trouver les infos supplémentaires du client ciblé.
La requête SQL qui fait cette recherche dans le programme afficherDetailClient.php est la suivante :
$sql = "SELECT * FROM client WHERE id = " . $_GET['id'];
Si on suit le lien du client "LEGRAND" l'id transmis au programme sera 9, la requête SQL trouvera donc l'enregistrement correspondant à l'id=9 dans la table client.

Voilà pour ce point. Pour le problème des [éèêë] moi, je n'ai pas de problèmes. Essaye d'exécuter le programme de test suivant pour en être sûr :
<?php
// fonction de conversion utilisée pour transformer des caractères indésirables
function conversionCar($intitulé){
   // Tableau de conversion : la première chaine des array peut être enrichi dans le temps
   $conversion = array( 
      array('[,?;.:/!&~’"\#\\\'}{)(\]\[+*=§%µ$£€¤¨`\<>]', ''), // tous les caractères spéciaux sont effacés
      // Remplacement des caractères accentués
      array('[éèêë]', 'e'),
      array('à', 'a'),
      array("ç", 'c'),
      array('ù', 'u'),
      // Attention: les règles suivantes sont enchainées et doivent rester les dernières
      array('(-)', ' '), // un tiret => un seul espace
      array('(\s+)', ' '), // plusieurs espace => un seul espace
      array('\s', '_') //  un espace => un souligné _
    );
       
        foreach($conversion as $regle){
                list($car_indesirable, $car_valide) = $regle;
                $intitulé = preg_replace('#'.$car_indesirable.'#', $car_valide, trim($intitulé));
        }
        return strtolower(trim($intitulé)); // en minuscule
}

//
echo conversionCar("éèêë");
?>
Si le problème persiste, c'est que le codage de caractères dans ton fichier texte n'est pas standard.

A+
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène