Problème de SELECT * INSERT INTO

Résolu

Bonjour

je galère sur une syntaxe que je n'arrive pas à corriger. Je voudrais faire la sauvegarde de mes données annuelles en fichier csv, excel ou autre. J'ai parcouru les sites et tous semblent indiquer la même chose, mais de façon incomplète. Merci de corriger ma requête si possible. Mon dossier reste désespéramment vide mais je n'ai aucun message d'erreur. Je précise que ceci avec ou sans le while, et que si je ne mets pas le  into outfile etc.. elle fonctionne

Merci d'avance

$myreq = "select * from adherents where annee = $exer into outfile 'C:\\temp\\CSV.csv'";
	$result = mysqli_query($conn, $myreq);
	while ($row = mysqli_fetch_array($result)) 
	{
    echo "ID".$row[0]." ". $row[2]." ".$row[3]." ".$row[4]."  ".$row[5]." ".$row[6]." ".$row[7]." ".$row[8]." ".$row[9]." ".$row[10]." ".$row[11]." ".$row[12]." ".$row[13]."<br>";
	}

5 réponses

  1. Voili, voila! J'ai trouvé comment détourner ce fichu outfile.

    J'ai créé un fichier sauvegarde.doc puis avec fwrite je complète mon fichier.

    Pour le moment j'ai une seule ligne (la dernière) qui s'écrit mais je vais peaufiner.la requête pour avoir toutes mes lignes et séparation en SPV.

    Le fichier sera plus facile à rapatrier.

    $file = "./sauvegarde.doc";
        $fh = fopen($file, 'r+');
        while ($row = mysqli_fetch_array($result)) 
        {
        $donnees="ID".$row[0].", ". $row[2]." ,".$row[3].", ".$row[4]." , ".$row[5]." ,".$row[6].", ".$row[7].", ".$row[8].", ".$row[9].", ".$row[10]." ,".$row[11].", ".$row[12].", ".$row[13]."/n";
        fwrite($fh, $donnees);
        }
        fclose($fh);

    1. Version finale qui fonctionne très bien :

      <?php  
      $conn=mysqli_connect($DBserveur, $DBlogin, $DBpassword,$DBbase);
      $lines = file("https://pmcc.wf/fichier-2024.csv");
      // Affiche toutes les lignes du tableau comme code HTML
      foreach ($lines as $line_num => $line) 
      {
      $myfile= explode(';', htmlspecialchars($line));
          $prenom= $myfile[0]; 
          $nom= $myfile[1]; 
          $adhes= $myfile[2];
          $don= $myfile[3];
      ///le nom est obligatoire ///////
          if (strlen($nom)>2)
          {
          $myreq="INSERT INTO `adherents`(prenom, nom, annee, adhesion) VALUES ('$prenom','$nom','2324', '$adhes')";
       //On vérifie la connexion
                  if($conn->connect_error)
                  {
                      die('Erreur : ' .$conn->connect_error);
                  } 
          $exec=mysqli_query($conn,$myreq);
          }
      }
      // Utilisation de drapeau
      $trimmed = file('somefile.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
      ?>

      C'est peut être scolaire et on doit trouver mieux; mais c'est ma solution pour ce input outfile qui ne doit écrire que dans le fichier parent...si on a l'autorisation pour ce faire.

      Merci à tous

  2. Modérateur

    Bonjour,

    Une suggestion. Il est fort probable que php ne puisse pas écrire par défaut hors du contexte du serveur web et de sa racine /, et même les dossiers du serveur web devraient par sécurité être interdits en écriture. Tu peux au moins vérifier avec un nom de fichier

    into outfile 'CSV.csv' 

    que tu pourrais retrouver dans le même répertoire que le source php.

    Après pour régler les droits d'accès aux répertoires cela doit se faire dans ton serveur web (apache ?).


    1. Contributeur

      Je pense que c'est la db qui écrit dans le fichier, par le php.

    2. J'ai essayé en vain... mais j'ai trouvé une solution de rem^placement avec fwrite qui fonctionne très bien. Création de fichier en SPV dans la racine. Il ne me reste plus qu'à trouver comment rapatrier automatiquement ce document pour transmettre un site fonctionnel.

      Merci pour l'aide, l'ami

  3. Oui... tout est nickel tant que je ne tente pas le into outfile

    1. Contributeur

      bonjour,

      si tu supprimes la cause into, la page affiche bien tes enregistrements? 

      1. Oui... tout est nickel tant que je ne tente pas le into outfile. C'est pour cela que je me suis même surpris a supprimer le while.

      2. Contributeur
        @clé de 12

        Tu as bien vérifié que le fichier n'existait pas avant d'exécuter la requête?

        Le fichier est donc créé par la requête, mais est vide?

    2. Modérateur

      bonjour 

      commence par mettre des quotes autour de l'année 

      $myreq = "select * from adherents where annee = '$exer' into outfile 'C:\\temp\\CSV.csv'";
      

      et si ca ne marche toujours pas, fais un echi de ta variable $myreq pour voir à quoi elle ressemble puis teste la directement dans ta bdd via phpmyadmin par exemple.

      n'hésite pas non plus à afficher les eventuelles erreurs après l'exécution de la requête via

      echo("Error description: " . mysqli_error($conn));
      }

      1. Non, j'ai tenté tes conseils... Aucune erreur sur la condition

        echo("Error description: " . mysqli_error($conn));
        }
        et $exe fonctionne bien (int)
        
      2. @clé de 12

        je vais chercher encore un peu puis je ferai des sauvegardes directement sur la table...

        Connais tu la syntaxe pour sauvegarder les données d'une table (le contraire de DROP).

        Mais ce n'est pas le but du jeu car je compte déléguer au président de l'association (qui est plus nul que moi en informatique) une version quasi automatique

        Merci quand même

      3. le description error reste à nul. mais ma requête s'affiche... je continue à creuser. Merci quand même de t'être penchée sur mon problème. Si je trouve je mets la solution dans mon post