PHP vers sql ou excel

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 avr. 2011, 18:40

Cette erreur veut dire que tu as une erreur SQL de syntaxe dans ta requête :
SELECT * FROM `pefac_rechercher_appel_doffre` WHERE `C16_OBJET_DU_MARCH_é` = \'ETUDE DE RECONNAISSANCE DES SOLS.\'
Pourquoi ces caractères bizarres : é dans le nom du champ : `C16_OBJET_DU_MARCH_é` ? c'est possible que ce soit ça le problème.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

10 avr. 2011, 19:59

Bonjour,
il y a é car ça s'affiche comme ça en HTML quand je lance la requête echo $sql; via le php.

Je viens de tester dans phpmyadmin:
SELECT * FROM rechercher_appel_doffre
ET
SELECT * FROM `rechercher_appel_doffre` WHERE `C6_OBJET_DU_MARCHE` = 'C6_OBJET_DU_MARCHE' 
ça fonctionne...
Je ne comprends vraiment pas pourquoi il ne veut pas m'afficher les résultat...
Dans le php lorsque je retire le WHERE l'erreur disparait mais toujours pas d'affichage des requêtes.

Je te remets le php final:
<?php
//------------------------------------------------------------------------------------------    
        $conn = db_connect();
        $sql = "SELECT * FROM `rechercher_appel_doffre` WHERE `C16_OBJET_DU_MARCHE` = '"  . $_GET["objet_marche"] .  "'";
        $result = mysql_query($sql, $conn);
        $dossier = mysql_fetch_array($result);
//------------------------------------------------------------------------------------------
?>
<fieldset class="fieldset"><legend class="legend">AVIS DE MARCHE</legend>
 
 <?php
 
 echo "objet :".$dossier['C16_OBJET_DU_MARCHE']."<br>";
 echo "D&eacute;partement :".$dossier['C2_D_éPARTEMENT']."<br>";
 echo $sql;

 ?>
L'erreur:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /homez.333/www/HOME/afficher_appels_doffre.php on line 43
Ce qui correspond à:
$dossier = mysql_fetch_array($result);

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

10 avr. 2011, 22:09

Dans ce cas c'est le contenu du champ transmis dans le GET n'est pas bon. Essaye de change le lien "Lire la suite" comme ça:
<a href=\"afficher_appels_doffre.php?objet_marche=".$row['C16_OBJET_DU_MARCH_é']."\">Lire la suite<a/>
et dans la requête SQL comme ça :
$sql = "SELECT * FROM `rechercher_appel_doffre` WHERE `C16_OBJET_DU_MARCH_é` = '"   . addslashes($_GET["objet_marche"]) .   "'";
Mais reste une question : Dans ta base dans la table "rechercher_appel_doffre" le champ est-il nommé `C16_OBJET_DU_MARCH` ou `C6_OBJET_DU_MARCHE` ?? parce qu'un coup tu utilises le premier et d'un autre coup tu utilises l'autre. Je n'ai pas compris pourquoi !!
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

10 avr. 2011, 23:25

Je viens de me rendre compte que dans ma base il y a 2 objets de marchés... d'où la confusion...
la bonne requête est donc:
$sql = "SELECT * FROM `rechercher_appel_doffre` WHERE `C6_OBJET_DU_MARCH_é` = '".addslashes($_GET["objet_marche"])."'";
Mais même après toutes les modifications j'ai toujours cette même erreur...
affichage du résultat :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /homez.333/www/HOME/afficher_appels_doffre.php on line 43

AVIS DE MARCHE 
objet :
Département :
SELECT * FROM `rechercher_appel_doffre` WHERE `C6_OBJET_DU_MARCH_é` = 'acquisition d\'un générateur de DIOXYDE de chlore avec matériel complémentaire pour le renouvellement de l\'existant Production d\'aurice. Lieu d\'exécution et de livraison: production d\'aurice, 40500 Aurice. Caractéristiques principales : marché à lot unique comprenant les prestations suivantes 1) Acquisition d\'un générateur de dioxyde de chlore voie chlore gazeux 2) Acquisition du matériel assurant l\'alimentation en chlore gazeux 3) Acquisition du matériel assurant le dosage et l\'injection dioxyde de chlore Refus des variantes. Date prévisionnelle de début des prestations (fournitures/services) :1.e.r juillet 2011. Les candidatures et les offres seront entièrement rédigées en langue française ainsi que les documents de présentation associés . Unité monétaire utilisée, l\'euro . Critères d\'attribution : Offre économiquement la plus avantageuse appréciée en fonction des critères énoncés dans le cahier des charges (règlement de la consultation, lettre d\'invitation ou document descriptif). Type de procédure :procédure adaptée. Date limite de réception des offres :27 avril 2011, à 12 heures. Délai minimum de validité des offres : 120 jours à compter de la date limite de réception des offres. Autres renseignements : Renseignements complémentaires :renseignements administratifs et techniques : M. LAILHEUGUE Jean-François, à l\'adresse indiquée ci-dessus ou à [email protected].' 
Le php : afficher_appels_doffre.php
<?php
//------------------------------------------------------------------------------------------    
        $conn = db_connect();
        $sql = "SELECT * FROM `rechercher_appel_doffre` WHERE `C6_OBJET_DU_MARCH_é` = '".addslashes($_GET["objet_marche"])."'";
        $result = mysql_query($sql, $conn);
        $dossier = mysql_fetch_array($result);
//------------------------------------------------------------------------------------------
?>
<fieldset class="fieldset"><legend class="legend">AVIS DE MARCHE</legend>
 
 <?php
 
 echo "objet :".$dossier['C6_OBJET_DU_MARCH_é']."<br>";
 echo "D&eacute;partement :".$dossier['C2_D_éPARTEMENT']."<br>";
 echo $sql;

 ?>
ET LE PHP module_recherche_appels_doffre.php
<?php
    
 ///////////////////////////
// recherche par mot-clé
///////////////////////////
if (isset($_GET["mots_cles"])){
	?>
<fieldset class="fieldset"><legend class="legend">R&eacute;sultat de votre recherche</legend>
<?php
        // objectif 1: lister les colonnes de la table  `rechercher_appel_doffre`
        $colonnes_table = array();
        $sql = "SHOW COLUMNS FROM `rechercher_appel_doffre`";
        // Exécution  requête mysql_select_db("", mysql_connect("", "", "")) or die(mysql_error());
        $result = mysql_query($sql) or die(mysql_error());
        while ($result && $row = mysql_fetch_array($result)){
                $colonnes_table[] = $row["Field"]; // champ "field" contient le nom d'une colonne de la table
        }
       
        // objectif 2: réaliser une recherche du mot-clé envoyé par le formulaire dans toutes les colonnes de la table
        if (count($colonnes_table)>0){
                $sql = "SELECT * FROM  `rechercher_appel_doffre` WHERE "; // début de la requête SELECT
                $sql .= "CONCAT(`" . implode("`,`", $colonnes_table) . "`) "; // pour avoir le format: CONCAT(champ1, champ2, ...)
                $sql .= " LIKE '%" . $_GET["mots_cles"] . "%'"; // pour avoir le format LIKE '%valeur du mot-clé%'
				$sql .= " AND C1_ANNONCE_PUBLI_éE_LE_ like '%".$date_publication."%' AND C2_D_éPARTEMENT like '%".$departement."%' LIMIT 0,20";
                // on obtient : SELECT * FROM `rechercher_appel_doffre` WHERE CONCAT(champ1, champ2, ...) LIKE '%valeur du mot-clé%'
                // Exécution  requête mysql_select_db("", mysql_connect("", "", "")) or die(mysql_error());
                $result = mysql_query($sql) or die(mysql_error());
				                if (mysql_num_rows($result)>0){
                        // affichage sous forme de table html
						

                        // lignes détail => valeurs des cases du tableau
                        
							echo "<br><div style='overflow: scroll; border: #000000 0px solid; height: 800px; margin-left: 5px; margin-right: 5px;'>";
                                echo "<table cellpadding=\"5\" border=\"1\" bgcolor=\"#F2F3FF\" width=\"100%\">";
								echo "<tr>";
								

								echo "<th style=\"text-align:center\"><b>Date de publication</b></th>";
								echo "<th style=\"text-align:center\"><b>Objet du marché</b></th>";
								echo "<th style=\"text-align:center\"><b>Dépt.</b></th>";
								
								echo "</tr>";
								
								while ($result && $row = mysql_fetch_array($result)){
								

								echo " <tr><td width=\"30%\"> ".stripslashes($row['C1_ANNONCE_PUBLI_éE_LE_'])."</td>";
								echo " <td width=\"60%\"> ".substr(stripslashes($row['C6_OBJET_DU_MARCH_é']),0,100)."...<br><a href=\"afficher_appels_doffre.php?objet_marche=".$row['C6_OBJET_DU_MARCH_é']."\">Lire la suite<a/></td>";
								echo " <td width=\"10%\"  style=\"text-align:center\"> ".stripslashes($row['C2_D_éPARTEMENT'])."</td>";
								}
								echo "</tr></table>";
													
						echo "</div>";
                }
                else {
                        echo "<p>Mot-clé '", $_GET["mots_cles"], "' non trouvé!</p>";
                }
     
		}
} // fin if isset($_GET["mots_cles"])
?>
</fieldset>
Depuis tout à l'heure je regarde partout avec attention, je fais des tests avec phpmyadmin, les requête fonctionnent mais impossible de les faire fonctionner via le PHP... #-o

Mammouth du PHP | 687 Messages

11 avr. 2011, 01:40

Bon je sais d'où vient le problème...
En fait c'est à cause de la table qui est créé automatiquement par le premier PHP...
Les caractères générés par ce php ne sont pas appréciés par phpmyadmin et php

Je viens de faire un test en remplaçant deux intitulés de colonne:

C2_D_éPARTEMENT devient dept
C3_ANNONCE_NO_ devient num

OU

C2_D_éPARTEMENT c2_d_epartement
C3_ANNONCE_NO_ c3_annonce_no_

En remplaçant ces deux intitulés les informations s'affichent correctement... donc je pense après avoir fait plusieurs tests que les majuscules et les accents ne sont pas pris en comptes par php ou phpmyadmin d'où le fait que les informations ne s'affichent pas...
Est-ce qu'il y a un moyen pour que la base créée automatiquement soit toujours en minuscules et sans accents?

En tout cas je suis content d'avoir trouvé ça. J'ai pas mal galéré, pas mal testé mais au moins je sais maintenant... :D

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

11 avr. 2011, 09:46

Parfait. Effectivement, les noms des champs doivent être re-formatés pour simplifier leur usages dans les programmes.

Pour cela il faut revenir au niveau de la procédure de création des champs dans le premier programme d'importation des données.

Voici une idée : Utiliser une expression régulière ou un système de remplacement de caractères pour transformer tout caractère indésirable par un autre caractère valide.
Pour cela on va énumérer les caractères indésirables et leurs formats valides dans un tableau de conversion. Exemple:
 // fonction de conversion utilisée pour transformer des caractères indésirables
function conversionCar($texte){
   $conversion = array( // le première chaine des array peut être enrichi dans le temps
      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: ces 2 règles suivantes sont enchainées et doivent rester les dernières
      array('\s*', ' '), // 1. plusieurs espace => un seul espace
      array('\s', '_') // 2. un espace => un souligné _
    );
	
	foreach($conversion as $regle){
	 	list($car_indesirable, $car_valide) = $regle;
	 	$texte = preg_replace('#(['.$car_indesirable.'])#', $car_valide, trim($texte));
	}
	return strtolower(trim($texte)); // en minuscule
}
?>
Le tableau est donc une liste de règles de conversion (ici il y a 6 règles) dont chacune est représentée sous forme de sous-tableau (array) qui stock un couple de 2 chaines la première contient les caractères indésirables et la seconde contient le caractère de remplacement.
Il suffit donc de créer un convertisseur qui impose ces règles à tous les caractères d'un champ de table avant de la créer.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

11 avr. 2011, 10:33

Merci.
Effectivement c'est exactement ça qu'il faut.
je vais essayer de mettre ce système en place en fonction du premier php.
Je te dirai si tout à fonctionner ou pas.
;-)

Mammouth du PHP | 687 Messages

11 avr. 2011, 16:28

bon alors je viens d'essayer t'intégrer le code au php mais quoi que je fasse la fonctionne ne s'applique pas, je pense que je dois mal l'employer...
Voici le PHP de base:
 <?php
$rs = mysql_query("SELECT * FROM annonces_appels_doffre"); // exécution de la requête

// tableau final à construire
$tab_final = array();

// parcours des résultats
while ($row=mysql_fetch_assoc($rs)) {
  // extraire les couples (titulé # valeur) séparés par |
  $t1 = explode('|',  $row['annonces_marche']);
  //echo "<pre>"; print_r($t1); echo "</pre>";

  foreach ($t1 as $intitulé_valeur){
                // extraire chaque intitulé et sa valeur séparés par #
                $intitulé = ""; $valeur = "";
				
                if (trim($intitulé_valeur)!="") { // si bien sur la chaine traitée n'est pas vide
                        $t2 = explode("#", trim($intitulé_valeur));
						
						
                // stocker l'intitulé et sa valeur dans le tableau final
                if (count($t2)>1) {$intitulé = trim($t2[0]); $valeur = trim($t2[1]);}
                        if ($intitulé!="") $tab_final[$intitulé][] = trim($valeur);  // toutes les valeurs ayant le même intitulé seront stockées ici sous le même index $intitulé
                }      
  }
}

// à la fin du traitement du résultat de la requête, on a un tableau d'activités rempli
// affichage du tableau juste pour le test
//echo "<pre>"; print_r($tab_final); echo "</pre>";

// entêtes de colonnes => les index du tableau
$colonnes = array_keys($tab_final);
if (count($colonnes) <=0) { die ("Désolé aucun intitulé n'est trouvé!"); } // sortir du programme car aucune colonne

// Insertion du résultat final dans la table "module_appel_doffre"
// préparation des requêtes Create et Insert
// les champs:
$sql_create = "CREATE TABLE IF NOT EXISTS `rechercher_appel_doffre` ( ";
$sql_insert = "INSERT INTO `rechercher_appel_doffre` (";

 
foreach ($colonnes as $index=>$intitulé){
	
        $intitulé = "C".$index."_".$intitulé; // numéroter pour rendre unique le nom d'un champ
            $intitulé = preg_replace_callback("#(\w*)\s*#","formatMot",trim($intitulé)); // transformation: mots en maj abrégés à 10 car
        $intitulé = trim(substr($intitulé, 0,50));    // transformation: attention sous MySQL, la taille max nom du champ = 64 car
        $sql_create .=  "`" . $intitulé . "` text,";
        $sql_insert .=  "`" . $intitulé . "`,";
}
//
$sql_create = preg_replace('#(,)$#', ');', $sql_create);   // remplacer la dernière virgule qui traine par );
$sql_insert = preg_replace('#(,)$#', '', $sql_insert);   // enlever la dernière virgule qui traine
$sql_insert .=  ") VALUES ";

// les valeurs :
$colonne1 = $colonnes[0]; // une colonne pour déterminer le nombre de lignes à afficher
for ($i=0; $i<count($tab_final[$colonne1]); $i++){  // parcourir les lignes
    $sql_insert .=   "(";
        foreach ($colonnes as   $colonne){ // afficher les lignes par colonne
        if (isset($tab_final[$colonne]) && isset($tab_final[$colonne][$i])) {
                $sql_insert .=   "'" . addslashes($tab_final[$colonne][$i]) . "',";
        }
        else {  $sql_insert .=   "'',"; } // valeur vide ''
        }
    $sql_insert = preg_replace('#(,)$#', '', $sql_insert);  // enlever la dernière virgule qui traine
    $sql_insert .=   "),";
}
$sql_insert = preg_replace('#(,)$#', ';', $sql_insert);  // remplacer la dernière virgule qui traine par ;

// affichage juste pour le test
echo "<pre>"; print($sql_create); echo "</pre>";
echo "<pre>"; print($sql_insert); echo "</pre>";

// Exécution des requêtes
mysql_select_db("", mysql_connect("", "", "")) or die(mysql_error());
mysql_query($sql_create) or die(mysql_error());
mysql_query($sql_insert) or die(mysql_error());
mysql_close();
echo "<p>Les donn&eacute;es sont enregistr&eacute;es dans la table</p>";

// FIN DU PROGRAMME PRINCIPAL

// fonction callback utilisée pour transformer les mots en maj limités à 10 car max
function formatMot($matches){
    if (trim(substr($matches[0],0,10))=="") return "";
        else return strtoupper(trim(substr($matches[0],0,12))) . "_";
}
?>
ET LA LE CODE QUE J'AI TENTE DE MODIFIE ET D'INTEGRER AU PHP DE BASE
 <?php
 // fonction de conversion utilisée pour transformer des caractères indésirables
function conversionCar($intitulé){
   $conversion = array( // le première chaine des array peut être enrichi dans le temps
      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: ces 2 règles suivantes sont enchainées et doivent rester les dernières
      array('\s*', ' '), // 1. plusieurs espace => un seul espace
      array('\s', '_') // 2. 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
}
?>
Et est-ce qu'il est possible de faire en sorte que :
$intitulé = "C".$index."_".$intitulé; // numéroter pour rendre unique le nom d'un champ
Ne soit pas numéroté? Car s'il y a un décalage dans les intitulés, les php seront faussés... Problème s'il y a 2 intitulés identique la base sql risque de faire une erreur 1062, non?

Merci

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

11 avr. 2011, 20:13

Oui tu peux enlever la numérotation car ça ne risque pas d'avoir 2 champs identiques puisque l'importation originale se fait déjà dans un tableau dont les intitulés sont les index uniques. Et puisqu'on parle de ce fameux tableau d'importation originale qu'on a nommé $tab_final, en fait, il faut faire la conversion et le formatage des intitulés au moment de son remplissage au lieu de faire ça au moment de la génération du Create. Pour gagner du temps.

De ce fait voici comment utiliser la fonction de conversion :
$rs = mysql_query("SELECT * FROM annonces_appels_doffre"); // exécution de la requête

// tableau final à construire
$tab_final = array();

// parcours des résultats
while ($row=mysql_fetch_assoc($rs)) {
  // extraire les couples (titulé # valeur) séparés par |
  $t1 = explode('|',  $row);
  //echo "<pre>"; print_r($t1); echo "</pre>";

  foreach ($t1 as $intitulé_valeur){
	// extraire chaque intitulé et sa valeur séparés par #
	$intitulé = ""; $valeur = "";
	if (trim($intitulé_valeur)!="") { // si bien sur la chaine traitée n'est pas vide
		$t2 = explode("#", trim($intitulé_valeur));
		// stocker l'intitulé et sa valeur dans le tableau final
 		if (count($t2)>1) {$intitulé = trim($t2[0]); $valeur = trim($t2[1]);}
		if ($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));    
			$tab_final[$intitulé][] = trim($valeur);  // toutes les valeurs ayant le même intitulé seront stockées ici sous le même index $intitulé
		}
	}      
  }
}
// à la fin du traitement du résultat de la requête, on a un tableau d'activités rempli
// affichage du tableau juste pour le test
//echo "<pre>"; print_r($tab_final); echo "</pre>";

// entêtes de colonnes => les index du tableau
$colonnes = array_keys($tab_final);
if (count($colonnes) <=0) { die ("Désolé aucun intitulé n'est trouvé!"); } // sortir du programme car aucune colonne

// Insertion du résultat final dans la table "module_appel_doffre"
// préparation des requêtes Create et Insert
// les champs:
$sql_drop = "DROP TABLE IF EXISTS `module_appel_doffre`;"; // si nécessaire
$sql_create = "CREATE TABLE IF NOT EXISTS `module_appel_doffre` (`id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ";
$sql_alter = array();
$sql_insert = "INSERT INTO `module_appel_doffre` (";
foreach ($colonnes as $index=>$intitulé){
        //$intitulé = "C".$index."_".$intitulé; // numéroter pour rendre unique le nom d'un champ
        //$intitulé = trim(substr($intitulé, 0,64));    // transformation: attention sous MySQL, la taille max nom du champ = 64 car
        $sql_alter[] =  "ALTER TABLE `module_appel_doffre` ADD `" . $intitulé . "` text;";
        $sql_insert .=  "`" . $intitulé . "`,";
}
//
$sql_insert = preg_replace('#(,)$#', '', $sql_insert);   // enlever la dernière virgule qui traine
$sql_insert .=  ") VALUES ";

// les valeurs :
$colonne1 = $colonnes[0]; // une colonne pour déterminer le nombre de lignes à afficher
for ($i=0; $i<count($tab_final[$colonne1]); $i++){  // parcourir les lignes
    $sql_insert .=   "(";
        foreach ($colonnes as   $colonne){ // afficher les lignes par colonne
        if (isset($tab_final[$colonne]) && isset($tab_final[$colonne][$i])) {
                $sql_insert .=   "'" . addslashes($tab_final[$colonne][$i]) . "',";
        }
        else {  $sql_insert .=   "'',"; } // valeur vide ''
        }
    $sql_insert = preg_replace('#(,)$#', '', $sql_insert);  // enlever la dernière virgule qui traine
    $sql_insert .=   "),";
}
$sql_insert = preg_replace('#(,)$#', ';', $sql_insert);  // remplacer la dernière virgule qui traine par ;

// affichage juste pour le test
//echo "<pre>"; print($sql_create); echo "</pre>";
//echo "<pre>"; print($sql_insert); echo "</pre>";

// Exécution des requêtes
mysql_select_db("test", mysql_connect("localhost", "root")) or die(mysql_error());
//@mysql_query($sql_drop); // si nécessaire
@mysql_query($sql_create);
if (count($sql_alter)>0) { foreach($sql_alter as $sql) @mysql_query($sql); }
mysql_query($sql_insert) or die(mysql_error());
mysql_close();
echo "<p>Les données sont enregistrées dans la table</p>";

// 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 (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é _
    );
    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
}
?>
Heu, il y a aussi dans ce code, quelques modifications sur la manière de créer les champs dans la table, qui consiste à exécuter d'abord une requête Create Table avec un seul champ id comme clé primaire, suivi d'une rafale de requête Alter Table pour ajouter les colonnes dont les intitulés sont collectés par le tableau $tab_final. Avec cette méthode, on peut ajouter dynamiquement des colonnes à une table existante sans la recréer. C'est pourquoi le create Table est maintenant séparé de l'Alter Table.

Mais bon, moi je ne fais que te répondre avec des solutions techniques qui peuvent t'intéresser sans savoir pourquoi justement tu veux faire comme ça. sachant que cette technique de création dynamique de la base est conceptuellement une solution non stable. On verra par la suite.

Voilà.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 687 Messages

11 avr. 2011, 23:12

Oui je comprends ce que tu veux dire maintenant... car par exemple lorsque dans phpmyadmin il y a dans la table 2 fois adresse_internet, lorsque je lance une requête elle ne s'affiche pas...
Exemple de requête:
  <?php echo "D&eacute;partement :".$dossier['adresse_internet ']."<br>"; ?>
Alors que celle-ci fonctionne car elle est seule:
<?php echo "objet :".$dossier['annonce_publiee_le']."<br>"; ?>
Je voulais faire ça car parfois il peut y avoir des décalages dans les textes du genre (exemple) :
TEXTE 1 :
-référence
-Tél:
-Télécopie

TEXTE 2
-référence
-Télécopie
-Tél:
sur le texte n°2 télécopie et tél sont inversés donc si on avait fait avec les intitulés du type:
TEXTE 1 :
-C0_référence
-C1_Tél:
-C2_Télécopie

TEXTE 2
-C0_référence
-C1_Télécopie
-C2_Tél:
J'avais peur que les résultats des requêtes ((afficher_appels_doffre.php) soient faussés à cause de l'ordre... DOnc c'est pour ça que j'avais pensé à ça...
Sinon j'avais pensé à faire un truc du style:

Si un intitulé existe déjà alors on ajoute à la fin du doublon un "a" ou "b" ou "c" etc. ou même "1" ou "2" ou "3" mais je ne sais pas si c'est possible... #-o

Sinon Je viens de lancer le programme, la table se construit bien en minuscule mais les "é" et "è" ne sont pas modifiés en "e" alors que dans le PHP il y a array('[éèêë]', 'e'),

A part ça chapeau car je ne suis pas facile à comprendre par moment et tu assures ! MERCI!

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2011, 00:25

Une autre question : Est-ce que tu connais à l'avance les intitulés de tous les champs qui peuvent exister dans les sources de données à importer?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
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, 00:51

Oui je les connais, c'est toujours les mêmes sauf que parfois ils peuvent être placés quelques lignes en dessous ou au dessus.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2011, 10:23

Bonjour,

Dans ce cas on n'a pas besoin de recréer la structure de la table, il faut créer la table une fois pour toute avec les bon champs et le programme doit faire simplement l'importation des données conformément aux champs voulus ; peu importe leur ordre dans la source de données.

Exemple:
On a la table suivante :
T1 (a text, b text, c text)
On veut importer les données suivantes:
Lot de Données n°1:

Code : Tout sélectionner

|a # la valeur 1 de a | c # la valeur 1 de c | b # la valeur 1 de b
Lot de Données n°2:

Code : Tout sélectionner

| b # la valeur 2 de b |a # la valeur 2 de a | c # la valeur 2 de c
Lot de Données n°3:

Code : Tout sélectionner

| a # la valeur 3 de a |b # la valeur 3 de b | c # la valeur 3 de c
Le résultat attendu est :
INSERT INTO T1 (a, b, c) 
VALUES 
('la valeur 1 de a', 'la valeur 1 de b', 'la valeur 1 de c'),
('la valeur 2 de a', 'la valeur 2 de b', 'la valeur 2 de c'),
('la valeur 3 de a', 'la valeur 3 de b', 'la valeur 3 de c');
Alors comment le faire ?
Avec le même type de programme sauf qu'on connait les noms des champs (c'est un avantage) donc on va les détecter dans la source un par un car un champ dans la source est délimité entre | et # et sa valeur entre # et |.
L'avantage aussi de connaitre les champs c'est qu'on peut savoir à l'avance quand se termine un enregistrement de données. C'est à dire quand on aura importé un lot de valeurs de tous les champs, on saura qu'on a importé un enregistrement et donc on peut poursuivre l'importation pour le lot suivant et ainsi de suite jusqu'à la fin de la source de données.

Voici l'algorithme :
soit le tableau de départ représentant la structure de champs de base de la table T1 de l'exemple précédent :
// tableau correspondant à un enregistrement type de la table T1 préparé pour extraire les données
$modele_enreg = array( 'a'=>'', 'b'=>'', 'c'=>'' );
Ce tableau servira à explorer la source de données pour rechercher et placer les valeurs à importer et à les stocker dans un tableau final. à chaque remplissage total de ce tableau on sait qu'un enregistrement est terminé on peut donc le vider pour passer à l'enregistrement suivant.

"En utilisant ce tableau modèle comme outil d'extraction de données, c'est comme si on utilisait un jalon de 1 litre, par exemple, pour extraire une quantité bien définie d'eau litre par litre."

Voici le résultat attendu du programme de remplissage du tableau final avec cette technique :
[b]Tableau Final:[/b]
Array
(
    [0] => Array
        (
            [a] => la valeur 1 de a
            [b] => la valeur 1 de b
            [c] => la valeur 1 de c
        )

    [1] => Array
        (
            [a] => la valeur 2 de a
            [b] => la valeur 2 de b
            [c] => la valeur 2 de c
        )

    [2] => Array
        (
            [a] => la valeur 3 de a
            [b] => la valeur 3 de b
            [c] => la valeur 3 de c
        )

)
Avec cette structure finale le reste du programme est simplifié car il s'agit tout simplement de construire la requête INSERT par rapport à ce tableau final.

Bien. Si tout le monde a compris, alors à vos plumes :wink: ,

Le travail à faire : Ecrire le programme PHP qui remplie le tableau final selon la technique décrite.
Voici la structure générale du programme à compléter:
<?php
// Source de données à importer
$source_data = "
| a # la valeur 1 de a | c # la valeur 1 de c | b # la valeur 1 de b
| b # la valeur 2 de b | a # la valeur 2 de a | c # la valeur 2 de c
| a # la valeur 3 de a | b # la valeur 3 de b | c # la valeur 3 de c
";

// tableau correspondant à un enregistrement type de la table T1 préparé pour extraire les données
$modele_enreg = array( 'a'=>'', 'b'=>'', 'c'=>'' );

// tableau final où il faut stocker les enregitrements extraits de la source de données
$tab_final = array();

// ... Ecrire le code d'extraction ici
// ...
// ...

// affichage du tableau final obtenu
echo "<pre>"; print_r($tab_final); echo "</pre>";
/* Voici le résultat attandu: 
* Tableau Final :
* 
Array
(
    [0] => Array
        (
            [a] => la valeur 1 de a
            [b] => la valeur 1 de b
            [c] => la valeur 1 de c
        )

    [1] => Array
        (
            [a] => la valeur 2 de a
            [b] => la valeur 2 de b
            [c] => la valeur 2 de c
        )

    [2] => Array
        (
            [a] => la valeur 3 de a
            [b] => la valeur 3 de b
            [c] => la valeur 3 de c
        )

)
*/
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
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, 11:32

Bonjour,
Petite question... avant de digérer tout ça, mais super boulot en tout cas!

|a # la valeur 1 de a | c # la valeur 1 de c | b # la valeur 1 de b
je dois l'écrire comme ça?
|a # |Référence du BOAMP # | c # ""| b # ""
| b # | tél. # |a #| tél. # | c # | tél. #
un truc du genre?
ça ce sont les champs que je viens d'extraire, ils sont bien au bon format?:
|Référence du BOAMP #
| Annonce publiée le#
| BOAMP n°#
|Nom et adresse officiels de l'organisme acheteur #
| Annonce n°#
|Correspondant #
| tél. #
|télécopieur #
| courriel #
|adresse internet #
|Adresse internet du profil d'acheteur #
|Principale(s) activité(s) du pouvoir adjudicateur #
|Objet du marché #
|Catégorie de services #
| C.P.V. - Objet principal #
| Lieu d'exécution #
| Code NUTS #
| Caractéristiques principales #
| La présente consultation comporte #
|une tranche ferme #
| tranche conditionnelle 1 #
|tranche conditionnelle 2 #
| Des variantes seront-elles prises en compte #
| La procédure d'achat du présent avis est couverte par l'accord sur les marchés publics de l'OMC #
| Prestations divisées en lots #
|Durée du marché ou délai d'exécution #
| Cautionnement et garanties exigés #
| Modalités essentielles de financement et de paiement et/ou références aux textes qui les réglementent #
| Forme juridique que devra revêtir le groupement d'opérateurs économiques attributaire du marché #
| L'exécution du marché est soumise à d'autres conditions particulières #
| Conditions de participation #
| Critères de sélection des candidatures #
| Situation juridique - références requises #
| Capacité économique et financière - références requises #
| Référence professionnelle et capacité technique - références requises #
| Marché réservé #
| Justifications à produire quant aux qualités et capacités du candidat #
| Type de procédure #
| Date limite de réception des candidatures #
| Numéro de référence attribué au marché par le pouvoir adjudicateur/l'entité adjudicatrice #
| Renseignements complémentaires #
| Conditions et mode de paiement pour obtenir les documents contractuels et additionnels #
| Date limite d'obtention #
| Date d'envoi du présent avis à la publication #
| Instance chargée des procédures de recours #
| Organe chargé des procédures de médiation #
| Service auprès duquel des renseignements peuvent être obtenus concernant l'introduction des recours #
|Renseignements relatifs aux lots #
|Critères d'attribution #
|Conditions de remise des offres ou des candidatures # 
| Date d'envoi du présent avis à la publication 1# 
|Département de publication # 
|Date prévisionnelle de commencement des travau1x. e#
|Conditions de remise des offres ou des candidatures #
|Date limite de réception des offres # 
|Délai minimum de validité des offres # 
|Autres renseignements #
|Nom et adresse officiels de l'organisme acheteur #
|Adresse auprès de laquelle des renseignements d'ordre administratif peuvent être obtenus #
|Lieu d'exécution # 
|Adresse auprès de laquelle des renseignements d'ordre administratif et technique peuvent être obtenus #
|Correspondant #
|Caractéristiques principales #
|Documents à produire dans tous les cas au stade de l'attribution du marché # 

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

12 avr. 2011, 18:22

Bonjour,
|Référence du BOAMP #
| Annonce publiée le#
| BOAMP n°#
|Nom et adresse officiels de l'organisme acheteur #
| Annonce n°#
|Correspondant #
| tél. #
|télécopieur #
| courriel #
|adresse internet #
|Adresse internet du profil d'acheteur #
|Principale(s) activité(s) du pouvoir adjudicateur #
|Objet du marché #
|Catégorie de services #
| C.P.V. - Objet principal #
| Lieu d'exécution #
| Code NUTS #
| Caractéristiques principales #
| La présente consultation comporte #
|une tranche ferme #
| tranche conditionnelle 1 #
|tranche conditionnelle 2 #
| Des variantes seront-elles prises en compte #
| La procédure d'achat du présent avis est couverte par l'accord sur les marchés publics de l'OMC #
| Prestations divisées en lots #
|Durée du marché ou délai d'exécution #
| Cautionnement et garanties exigés #
| Modalités essentielles de financement et de paiement et/ou références aux textes qui les réglementent #
| Forme juridique que devra revêtir le groupement d'opérateurs économiques attributaire du marché #
| L'exécution du marché est soumise à d'autres conditions particulières #
| Conditions de participation #
| Critères de sélection des candidatures #
| Situation juridique - références requises #
| Capacité économique et financière - références requises #
| Référence professionnelle et capacité technique - références requises #
| Marché réservé #
| Justifications à produire quant aux qualités et capacités du candidat #
| Type de procédure #
| Date limite de réception des candidatures #
| Numéro de référence attribué au marché par le pouvoir adjudicateur/l'entité adjudicatrice #
| Renseignements complémentaires #
| Conditions et mode de paiement pour obtenir les documents contractuels et additionnels #
| Date limite d'obtention #
| Date d'envoi du présent avis à la publication #
| Instance chargée des procédures de recours #
| Organe chargé des procédures de médiation #
| Service auprès duquel des renseignements peuvent être obtenus concernant l'introduction des recours #
|Renseignements relatifs aux lots #
|Critères d'attribution #
|Conditions de remise des offres ou des candidatures # 
| Date d'envoi du présent avis à la publication 1# 
|Département de publication # 
|Date prévisionnelle de commencement des travau1x. e#
|Conditions de remise des offres ou des candidatures #
|Date limite de réception des offres # 
|Délai minimum de validité des offres # 
|Autres renseignements #
|Nom et adresse officiels de l'organisme acheteur #
|Adresse auprès de laquelle des renseignements d'ordre administratif peuvent être obtenus #
|Lieu d'exécution # 
|Adresse auprès de laquelle des renseignements d'ordre administratif et technique peuvent être obtenus #
|Correspondant #
|Caractéristiques principales #
|Documents à produire dans tous les cas au stade de l'attribution du marché # 
Oui comme ça c'est bien. Les valeurs sont bien sûr après les # dans la source de données.

Attends je vais tester le programme de mon côté avec tes champs et si tu veux bien envoyer quelques extraits de tes données champs+valeurs envoi-les (ici ou en MP si tu veux) ça serait préférable.

Mais j'ai une autre question : Est-ce que les données à extraire se trouvent tous dans une même source ou alors dans plusieurs sources où chacune contient les valeurs d'un enregistrement (ensemble de champs)?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène