8726 sujets

Développement web côté serveur, CMS

upload/1572341354-77505-export.png

Bonjour,

Je cherche à faire un export .csv des champs situé dans une liste liée avec menu déroulant.
J'ai déja créé le code html pour créer le bouton "export" dans mon "index.html" et j'aimerais utiliser la fonction php "fputcsv" dans mon "traitement.php".

Comment feriez vous? Merci pour votre aide.

Structure de mon code:

Je dispose d'un fichier index.php qui récupère les champs d'une Base SQL via PDO->fetch et qui les affichent dans une liste avec menu déroulant.

Et j'ai un deuxième fichier traitement.php qui récupère en $POST un champ permettant de faire une 2eme requête SQL et qui affiche les résultats dans une 2eme liste liée .


<html>
	<head>
		<title>COMPTES</title>
		<script type='text/javascript'>
 
			function getXhr(){
                                var xhr = null; 
				if(window.XMLHttpRequest) // Firefox et autres
				   xhr = new XMLHttpRequest(); 
				else if(window.ActiveXObject){ // Internet Explorer 
				   try {
			                xhr = new ActiveXObject("Msxml2.XMLHTTP");
			            } catch (e) {
			                xhr = new ActiveXObject("Microsoft.XMLHTTP");
			            }
				}
				else { // XMLHttpRequest non supporté par le navigateur 
				   alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); 
				   xhr = false; 
				} 
                                return xhr;
			}
 
/**
			* Méthode qui sera appelée sur le click du bouton
			*/
			function go(){
				var xhr = getXhr();
				// On défini ce qu'on va faire quand on aura la réponse
				xhr.onreadystatechange = function(){
					// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
					if(xhr.readyState == 4 && xhr.status == 200){
						leselect = xhr.responseText;
            // On se sert de innerHTML pour rajouter les options a la liste
						document.getElementById('apprenant').innerHTML = leselect;
					}
				}


// Ici on va voir comment faire du post
xhr.open("POST","include/traitement.php",true);
				// ne pas oublier ça pour le post
				xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
				// ne pas oublier de poster les arguments
				// ici, l'id de l'auteur
				sel = document.getElementById('GROUPE');
				idgroupe = sel.options[sel.selectedIndex].value;
				xhr.send("CODE_GROUPE="+idgroupe);
			}
		</script>
	</head>



    <body>
		<form>
			<fieldset style="width: 1100px">
				
				<label>Groupe</label>
      
        <select name='GROUPE' id='GROUPE' onchange='go()'>
        <option value='-1'>Choisir un Groupe</option>

   <?php
        /* Fetch records and display in a loop */
   
        $pdo = new PDO("sqlsrv:Server=SRV-TEST\TEST_MSSQL,50000;Database=TESTDATA", "YP", "Pass");
        
        if( $pdo ) {
          echo "Connexion établie";
   
     }else{
          echo "La connexion n'a pu être établie.<br />";
          die( print_r( sqlsrv_errors(), true));
     }




    $sql1="select dbo.groupe.code_groupe AS CODE_GROUPE,dbo.groupe.nom_groupe AS GROUPE,dbo.calendrier.date_deb AS DEBUT,dbo.calendrier.date_fin AS FIN
    FROM dbo.GROUPE,dbo.FORMATION,dbo.CALENDRIER
    
    WHERE calendrier.DATE_DEB > '20180101'
    AND calendrier.code_calendrier = groupe.code_calendrier
    AND groupe.code_formation = formation.code_formation
    
    ORDER BY groupe.nom_groupe";

    $result1= $pdo->query($sql1);

   // echo $sql1;    
    
    while ($row=$result1->fetch() )

{

 echo '<option value="'.($row['CODE_GROUPE']).'">'.$row['GROUPE']."$nbsp ----- du ".$row['DEBUT']."$nbsp au: ".$row['FIN'].'</option>';

}
?>

</select>

<label>Apprenants</label>
				<div id='apprenant' style='display:inline'>
				<select name='apprenant'>
					<option value='-1'>Liste des Apprenants</option>
				</select>
				</div>

<div id='apprenant' style='display:inline'>
<button onclick="Export()" >Export CSV </button>
</div>

<script>
        function Export()
        {
            var conf = confirm("Export users to CSV?");
            if(conf == true)
            {
                window.open("include/traitement.php", '_blank');
            }
        }
    </script>

			</fieldset>
		</form>
	</body>
</html>


et le fichier traitement.php :


<?php
	echo "<select name='apprenant'>";
	if(isset($_POST["CODE_GROUPE"])){

		$pdo = new PDO("sqlsrv:Server=SRV-TEST\TEST_MSSQL,50000;Database=TESTDATA", "YP", "Pass"");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $result2= $pdo->query("select a.NOM_APPRENANT AS NOM_APPRENANT,a.PRENOM_APPRENANT AS PRENOM_APPRENANT,nu.nom_net_utilisateur AS NETUSER
          FROM apprenant a
          inner join INSCRIPTION i on (a.CODE_APPRENANT = i.CODE_APPRENANT)
          inner join FREQUENTE f on (i.CODE_INSCRIPTION = f.CODE_INSCRIPTION)
          inner join GROUPE g on (f.CODE_GROUPE = g.CODE_GROUPE)
          inner join NET_UTILISATEUR nu on (a.code_apprenant = nu.code_ressource and nu.type_ressource = 7500)
          WHERE g.code_groupe=".$_POST["CODE_GROUPE"]."");
          

        while ($row=$result2->fetch() )
 
        {
  echo "<option value='".$row["CODE_APPRENANT"]."'>".$row["NOM_APPRENANT"]." ".$row["PRENOM_APPRENANT"]." ".$row["NETUSER"]."</option>";

    }
  
	}
  echo "</select>";

?>

Modifié par avb (29 Oct 2019 - 10:30)
Salut,
Déjà, dans ta balise <form> tu devrais ajouter:
<form method="POST" action="traitement.php">


A mon avis ton script JS doit faire un "submit" de ton formulaire et pas un include (mais je connais très mal le javascript alors ta méthode est peut-être la bonne^^). Tu as fait un var_dump de $_POST sur ta page traitement.php afin de voir si tes infos sont bien arrivées?

Sinon pour le CSV, la méthode générale est la suivante:

$csv_file = fopen('Chemin_de_ton_fichier.csv', 'w+'); //Créée le fichier
fputcsv($csv_file, $tableau_de_tes_valeurs, $delimiteur); //Ajoute une ligne au fichier CSV
fclose($csv_file);

En général, tu feras un fputcsv() "seul" au départ pour créer la ligne de titres, et ensuite une boucle pour faire un fputcsv() à chaque ligne de données que tu dois insérer dans ton fichier csv
Modifié par Mathieu8337 (31 Oct 2019 - 15:08)