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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] exportation base de données en excel via php/mysql

Re: exportation base de données en excel via php/mysql

par davkosky » 14 oct. 2014, 19:04

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

Re: exportation base de données en excel via php/mysql

par ynx » 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') 

Re: exportation base de données en excel via php/mysql

par davkosky » 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

Re: exportation base de données en excel via php/mysql

par ynx » 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

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

par davkosky » 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