[RESOLU] exportation base de données en excel via php/mysql

Eléphanteau du PHP | 15 Messages

13 oct. 2014, 11:09

j'ai un fichier ou on fait le choix de un ou plusieurs numeros à extraire de la base de données sous format excel (.csv)

choixNumeros.php

 <?php
   @$uuser=$_GET['user'];
   require('pages/base.php');
echo '<form method="post">';

 //$select = "SELECT * FROM commande WHERE user='$uuser'  ";
//afficher uniquement les commandes n'ayant pas été traités c-a-d etat=0
// connection &agrave; la DB  user='$uuser'  AND
$link = mysql_connect ($host,$user,$password) or die ('Erreur : '.mysql_error() );
mysql_select_db($bd) or die ('Erreur :'.mysql_error());
$select = "SELECT * FROM commande WHERE traiter=1";
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
         
 while($row=mysql_fetch_assoc($result))
    {
                             
        echo '<input  type="checkbox" name="commandes['. $row['num_com'].']"  value="'.$row['num_com'].'" />'. $row['num_com'] . '&nbsp;&nbsp;|&nbsp;&nbsp;';
        
     }
;



//soumission du formulaire puis exécution de la requête update
//if( isset( $_POST['commandes'] ) ){
	
  // $ids="('".implode(',',$_POST['commandes']) ."')";
 // $sql ="UPDATE commande SET traiter=1 WHERE  num_com  IN $ids ";
// $result = mysql_query($sql,$link) or die ('Erreur : '.mysql_error().$sql );
// echo $sql;
//}
?>
le fichier qui recupère les numéros pour les exporté en un fichier excel (.csv)

export3.php


<?php
//ce fichier montre un exemple permettant de generer un fichier excel (on peut remplacer le .csv par .xls)

//parametres de connexion a la bdd
//include("config.php");
require('pages/base.php');
$link=mysql_connect("$host","$user","$password") or die('<font color=red>Erreur de connnection</font><br> '.mysql_error() );
 // selectionner la base des données
 mysql_select_db("$bd") or die('<font color=red>Base inexistante</font><br> '.mysql_error() ); 

//Premiere ligne = nom des champs (si on en a besoin)
$csv_output = "numero;commande;patient;type prothèse";
$csv_output .= "\n";



//$ids=array();
if( isset( $_POST['commandes'] ) ){
	
	foreach( $_POST['commandes'] as $val  ){
  //$ids[] = $val;
        
   $ids="('".implode(',',$_POST['commandes']) ."')";
//Requete SQL
//$traiter='1';
$compt=count($ids);
  for($i=0;$i<$compt;$i++){
$query = "SELECT * FROM commande WHERE num_com IN $ids ";
$result = mysql_query($query)
or die('Erreur SQL !<br />' . $query . '<br />' . mysql_error());
} //fin boucle for
}//fin grang if


//Boucle sur les resultats
while($row = mysql_fetch_array($result)) {
$csv_output .= "$row[id_com];$row[num_com];$row[patient];$row[type_proth];$ids\n ";
}

header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=Expedition_".$ids.".". date("Ymd").".csv");
header("Content-Type: text/csv; charset=utf-8");
print $csv_output;
exit;}
?>

mon problème est que quand je fais le choix d'un seul numéro le fichier excel est crée avec les informations voulu mais si je choisis 2 ou plusieurs numéros le fichier est crée avec seulement le nom des colonnes deja predefinis et les lignes en dessous restent vident

ynx
Mammouth du PHP | 586 Messages

13 oct. 2014, 14:18

Salut,

Pour commencer tu n'as pas besoin de faire de boucle pour parcourir le tableau $_POST['commandes'] puisque tu utilises la fonction implode pour cela (la preuve est les variables de tes boucles $val et $i ne sont pas utilisées).

Ton problème vient de l'ajout des guillemet autour de implode pour construire ta requête, ceci fonctionne pour un seul élément :
SELECT * FROM commande WHERE num_com IN ('13')
mais ne fonctionne pas avec plusieurs :
SELECT * FROM commande WHERE num_com IN ('13, 25, 42')
la syntaxe de la requête générée n'est pas correcte : on cherche les commandes dont le num_com vaut '13, 25, 42' au lieu de chercher les commandes dont le num_com vaut '13' ou '25' ou '42'.

Puisque tes identifiants sont des entiers, pas besoin de les entourer de guillemets.
Ce qui donne une fois corrigé :
<?php
require('pages/base.php');
$link=mysql_connect("$host","$user","$password") or die('<font color=red>Erreur de connnection</font><br> '.mysql_error() );
// selectionner la base des données
mysql_select_db("$bd") or die('<font color=red>Base inexistante</font><br> '.mysql_error() );

//Premiere ligne = nom des champs (si on en a besoin)
$csv_output = "numero;commande;patient;type prothèse";
$csv_output .= "\n";

if(isset($_POST['commandes'])){
	$ids="(" . implode(',', $_POST['commandes']) . ")";
		
	$query = "SELECT * FROM commande WHERE num_com IN $ids";
	$result = mysql_query($query) or die('Erreur SQL !<br />' . $query . '<br />' . mysql_error());
	
	//Boucle sur les resultats
	while($row = mysql_fetch_array($result)) {
		$csv_output .= "$row[id_com];$row[num_com];$row[patient];$row[type_proth];$ids\n ";
	}

	header("Content-type: application/vnd.ms-excel");
	header("Content-disposition: attachment; filename=Expedition_".$ids.".". date("Ymd").".csv");
	header("Content-Type: text/csv; charset=utf-8");
	print $csv_output;
	exit;
}
La requête générée avec plusieurs éléments est alors correcte :
SELECT * FROM commande WHERE num_com IN (13, 25, 42)
Bonne journée

Eléphanteau du PHP | 15 Messages

13 oct. 2014, 15:48

j'ai esayé ta methode mais il y eu une erreur

Erreur SQL !
SELECT * FROM commande WHERE num_com IN (CIAZERTY23,CI00023)
Unknown column 'CIAZERTY23' in 'where clause'

donc il doit avoir un problème au niveau des quotes

ynx
Mammouth du PHP | 586 Messages

14 oct. 2014, 09:12

Si tes identifiants ne sont pas des entiers, il faut les entourer de guillemets (et protéger ta requête contre les injections sql au passage).

Une solution possible pour transformer directement les éléments du tableau $_POST['commandes'] en valeur sql safe est d'utiliser la fonction array_map comme ceci :
require('pages/base.php');
$link=mysql_connect("$host","$user","$password") or die('<font color=red>Erreur de connnection</font><br> '.mysql_error() );
// selectionner la base des données
mysql_select_db("$bd") or die('<font color=red>Base inexistante</font><br> '.mysql_error() );

//Premiere ligne = nom des champs (si on en a besoin)
$csv_output = "numero;commande;patient;type prothèse";
$csv_output .= "\n";

if(isset($_POST['commandes'])){
        $postSafe = array_map('myQuote', $_POST['commandes']);
        $ids="(" . implode(',', $postSafe) . ")";
               
        $query = "SELECT * FROM commande WHERE num_com IN $ids";
        $result = mysql_query($query) or die('Erreur SQL !<br />' . $query . '<br />' . mysql_error());
       
        //Boucle sur les resultats
        while($row = mysql_fetch_array($result)) {
                $csv_output .= "$row[id_com];$row[num_com];$row[patient];$row[type_proth];$ids\n ";
        }

        header("Content-type: application/vnd.ms-excel");
        header("Content-disposition: attachment; filename=Expedition_".$ids.".". date("Ymd").".csv");
        header("Content-Type: text/csv; charset=utf-8");
        print $csv_output;
        exit;
}

// fonction pour entourer une valeur avec des guillemets et contrer les injections sql
// la connexion avec mysql_connect doit être faite avant d'utiliser cette fonction
function myQuote($value) {
	return "'" . mysql_real_escape_string($value) . "'";
}
La requête générée devrait alors être de la forme :
SELECT * FROM commande WHERE num_com IN ('CIAZERTY23','CI00023') 

Eléphanteau du PHP | 15 Messages

14 oct. 2014, 19:04

Bien YNX , j'ai reussi la manip , çà marche ! :) :) :) :) :)