Supprimer des dossiers avec des cases à cocher.

Rechercher

Supprimer des dossiers avec des cases à cocher.

Par pataugas  -  57 reponses  -  Le 11/09/2016 19:01  -  Editer  - 

Bonjour, :)

Parce que j'en ais assez des passer des heures à chercher à comprendre les scripts que je copie/colle, je me suis enfin décidé à apprendre le PHP et c'est comme cela que j'ai découverts votre site et ses merveilleux tutoriels.

Bon, il va me falloir un peu de temps pour assimiler tout cela et en attendant, pourriez-vous m'aider à solutionner mon problème du moment.

J'ai un script qui me liste des répertoires d'un dossier que jusqu'à présent je supprimais à l'aide d'un formulaire.

Dans ma page de traitement, je récupérais le "name" du form dans une variable et tout marchait très bien.

Seulement, je veux me "moderniser" et utiliser des cases à cocher mais c'est une autre histoire. Je commence à ne plus savoir faire.

a. Utiliser le même principe avec une page de traitement
b. Utiliser les fonctions unlink et rmdir pour supprimer direct sur la même page. (préférence)

J'ai plus ou moins compris qu'il me faudrait utiliser une boucle foreach pour ce faire mais c'est là que ça se corse. J'ai commencé à nager. ;)

Voici mon script.

<?php

$dir_nom = 'sites'; // dossier listé (pour lister le répertoir courant : $dir_nom = '.'  --> ('point')
$dir = opendir($dir_nom) or die('Erreur de listage : le répertoire n\'existe pas'); // on ouvre le contenu du dossier courant
$fichier= array(); // on déclare le tableau contenant le nom des fichiers
$dossier= array(); // on déclare le tableau contenant le nom des dossiers

while($element = readdir($dir))

{

    if($element != '.' && $element != '..' && $element != 'core' && $element != 'plugins' && $element != 'readme' && $element != 'themes' && $element != 'update' && $element != 'data')
{


        if (!is_dir($dir_nom.'/'.$element)) {$fichier[] = $element;}
        else {$dossier[] = $element;}
    }
}

closedir($dir);

if(!empty($dossier)) {
    sort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
    echo "Liste des dossiers accessibles dans '$dir_nom'  (mon script)\n\n";
    echo "\t\t<ul>\n";

        foreach($dossier as $lien){
        echo "\t\t\t<li><input type=\"checkbox\" name=\"choix[]\" value=\"1\"><a href=\"$dir_nom/$lien/ \"$lien\"  '\"><img src=\"../../icone-site-web.tb.png\">  $lien </a></li>\n";

        }

    echo "\t\t</ul>";
}

if(!empty($fichier)){
    sort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
    //echo "Liste des fichiers/documents accessibles dans '$dir_nom' : \n\n";
    //echo "\t\t<ul>\n";
        foreach($fichier as $lien) {
            //echo "\t\t\t<li><a href=\"$dir_nom/$lien \">$lien</a></li>\n";
        }
    echo "\t\t</ul>";
 }

echo '<form action="" method="post"><input type="submit" value="Supprimer" /></div></form>';

?>
 

Réponses apportées à cette discussion

Par Cyrano  -  Le 12/09/2016 08:00  -  Haut de page  - 

Salut,
en regardant d'un peu plus près ce code, il apparait que le code qui arrive dans le navigateur est une curiosité : ça ne peut pas fonctionner.

Visuellement, ça affiche certainement un paquet de cases à cocher, mais le formulaire lui-même ne contient qu'un bouton de suppression et n'envoie aucune autre donnée que celles concernant cet bouton.

Voici le code à peine modifié qui devrait notablement améliorer les choses, j'ai ajouté les commentaires d'explications là où les modifications sont faites :

<?php
$dir_nom = 'sites'; // dossier listé (pour lister le répertoir courant : $dir_nom = '.'  --> ('point')
$dir     = opendir($dir_nom) or die('Erreur de listage : le répertoire n\'existe pas'); // on ouvre le contenu du dossier courant
$fichier = array(); // on déclare le tableau contenant le nom des fichiers
$dossier = array(); // on déclare le tableau contenant le nom des dossiers

while($element = readdir($dir))
{
    if($element != '.' && $element != '..' && $element != 'core' && $element != 'plugins' && $element != 'readme' && $element != 'themes' && $element != 'update' && $element != 'data')
    {
        if (!is_dir($dir_nom.'/'.$element))
        {
            $fichier[] = $element;
        }
        else
        {
            $dossier[] = $element;
        }
    }
}

closedir($dir);
// On commence par ouvrir le formulaire
echo '<form action="" method="post"><div>\n';
// Ensuite seulement on y met le contenu principal
if(!empty($dossier))
{
    sort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
    echo "Liste des dossiers accessibles dans '$dir_nom'  (mon script)\n\n";
    echo "\t\t<ul>\n";
    foreach($dossier as $lien)
    {
        echo "\t\t\t<li><input type=\"checkbox\" name=\"choix[]\" value=\"1\"><a href=\"$dir_nom/$lien/ \"$lien\"  '\"><img src=\"../../icone-site-web.tb.png\">  $lien </a></li>\n";
    }
    echo "\t\t</ul>";
}

if(!empty($fichier))
{
    sort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
    //echo "Liste des fichiers/documents accessibles dans '$dir_nom' : \n\n";
    //echo "\t\t<ul>\n";
    foreach($fichier as $lien)
    {
        //echo "\t\t\t<li><a href=\"$dir_nom/$lien \">$lien</a></li>\n";
    }
    echo "\t\t</ul>";
}
// Maintenant on ajoute le bouton et on ferme le formulaire
echo '<input type="submit" value="Supprimer" /></div></form>';
?>

À tester, reviens avec la suite au besoin.

 
Par pataugas  -  Le 12/09/2016 13:28  -  Haut de page  - 

Merci Cyrano pour le coup de pouce mais ça ne fonctionne pas sans doute parce que je ne sais pas le paramétrer. :-//

Avant tout, un petit espace de démonstration pour la cause ici.

(Désolé si je fais des erreurs car je ne suis pas (encore) familiarisé avec Markdown.)

Voici comme est pour le moment mon formulaire et je pense que je me fais des nœuds au niveau de l'information à passer à la page de traitement (delfiles.php) à moins qu'il ne me manque quelque chose à cette dernière.

Pour info, j'ai réalisé une petite application pour installer automatiquement des sites de test de mon CMS favori. :)

<pre><code>
<-- va nous créer un nouveau site -->
<h2>Creer un nouveau site</h2>
<form action="creation.php" method="post" class="nextum"target=_blank></p>

<p>
    <!--<label for="data">Exemple jack:</label>-->
    <input id="data" name="depart"  maxlength="255" value="">

<input type="submit" value="Envoyer" />
</p>
</form>
<br>

<?php
$dir_nom = 'sites'; // dossier listé (pour lister le répertoir courant : $dir_nom = '.' --> ('point')
$dir = opendir($dir_nom) or die('Erreur de listage : le répertoire n\'existe pas'); // on ouvre le contenu du dossier courant
$fichier = array(); // on déclare le tableau contenant le nom des fichiers
$dossier = array(); // on déclare le tableau contenant le nom des dossiers

while($element = readdir($dir))
{
if($element != '.' && $element != '..' && $element != 'core' && $element != 'plugins' && $element != 'readme' && $element != 'themes' && $element != 'update' && $element != 'data')
{
if (!is_dir($dir_nom.'/'.$element))
{
$fichier[] = $element;
}
else
{
$dossier[] = $element;
}
}
}

closedir($dir);
// On commence par ouvrir le formulaire
echo '<form action="delfiles.php" method="post"target=_blank><div>\n';
// Ensuite seulement on y met le contenu principal
if(!empty($dossier))
{
sort($dossier); // pour le tri croissant, rsort() pour le tri décroissant
echo "Liste des dossiers accessibles dans '$dir_nom' <br /><strong>ATTENTION: </strong>Pour me moment, il faut recharger la page pour voir le nouveau site\n\n";?>

<input type="button" onclick='window.location.reload(false)' value="Rafraichir"/>

<?php
echo "\t\t<ul>\n";
foreach($dossier as $lien)
{
echo "\t\t\t<li><input type=\"checkbox\" name=\"choix[]\" value=\"1\"><a href=\"$dir_nom/$lien/ \"$lien\" '\"><img src=\"../../icone-site-web.tb.png\"> $lien </a></li>\n";
}
echo "\t\t</ul>";
}

if(!empty($fichier))
{
sort($fichier);// pour le tri croissant, rsort() pour le tri décroissant
//echo "Liste des fichiers/documents accessibles dans '$dir_nom' : \n\n";
//echo "\t\t<ul>\n";
foreach($fichier as $lien)
{
//echo "\t\t\t<li><a href=\"$dir_nom/$lien \">$lien</a></li>\n";
}
echo "\t\t</ul>";
}
// Maintenant on ajoute le bouton et on ferme le formulaire
echo '<input type="submit" value="Supprimer" /></div></form>';
?></code></pre>
Page de traitement delfiles.php.

<code><pre>

<?php

$a_del = $_POST['choix[]'];

echo "Bravo ! Le site $a_del est parti aux oubliettes.<br />";
$a_del =$choix; // <- nom du répertoire à effacer est passé en variable

clearDir($a_del);
function clearDir($dossier) {
$ouverture=opendir($dossier);
if (!$ouverture) return false;
while($fichier=readdir($ouverture)) {
if ($fichier == '.' || $fichier == '..') continue;
if (is_dir($dossier."/".$fichier)) {
$r=clearDir($dossier."/".$fichier);
if (!$r) return false;
}
else {
$r=unlink($dossier."/".$fichier);
if (!$r) return false;
}
}
closedir($ouverture);
$r=rmdir($dossier);
rename($dossier,"trash");
return true;
}
?>

</pre></code>

 
Par Cyrano  -  Le 12/09/2016 13:58  -  Haut de page  - 

Ok, on va reprendre un peu le code du fichier delfile.php.

Un des point important à comprendre dans la programmation, c'est que les instructions sont exécutées dans leur ordre d'apparition. Là, on a un problème parce que l'appel à la fonction clearDir() est effectué avant la définition de la fonction elle-même. Donc là, ça ne fait rien du tout, et logiquement, ça doit même afficher un message d'erreur.
S'il n'y a pas de message d'erreur, il faut activer ça dans le paramétrage du php.ini :
- display_error doit avoir la valeur ON;
- error_reporting doit avoir la valeur E_ALL;

Autre élément important, lorsqu'on utilise un IF, il est utile de prévoir un ELSE avec une action alternative, de cette manière on va avoir une meilleure idée de ce qui se passe réellement.

Alors d'abord le code revu et corrigé, mais attention, il va y avoir d'autres correctifs à effectuer avant de l'utiliser :

<?php
function clearDir($dossier)
{
    $ouverture = opendir($dossier);
    if (!$ouverture)
    {
        return false;
    }
    while($fichier=readdir($ouverture))
    {
        if ($fichier == '.' || $fichier == '..')
        {
            continue;
        }
        if (is_dir($dossier."/".$fichier))
        {
            $r = clearDir($dossier."/".$fichier);
            if (!$r)
            {
                return false;
            }
        }
        else
        {
            $r = unlink($dossier."/".$fichier);
            if (!$r)
            {
                return false;
            }
        }
    }
    closedir($ouverture);
    $r = rmdir($dossier);
    rename($dossier,"trash");
    return true;
}

// On commence par récupérer ce qui a été envoyé : attention, les cases à cocher sont
// dans un tableau, mais on ne récupère pas "choix[]" mais seulement "choix" sans les
// crochets.
$a_del = (isset($_POST['choix'])) ? $_POST['choix'] : array();
// Maintenant, on va compter combien il y a de lignes dans le tableau, et s'il y en a au moins 1, on va exécuter.
if(count($a_del) > 0)
{
    // ATTENTION, $a_del est un tableau, donc on doit pointer sur un index particulier, donc
    // on va devoir traiter ça dans une boucle
    foreach($a_del as $i => $site)
    {
        if(false != clearDir($a_del))
        {
            echo "Bravo ! Le site  ". $a_del[$i] ." est parti aux oubliettes.<br />";
        }
        else
        {
            echo "Échec ! Le site  ". $a_del[$i] ." est n'a pu être supprimé.<br />";
        }
        $a_del = $choix;  // <- nom du répertoire à effacer est passé en variable // <=== Ça sert à quoi ça ?
    }
}
else
{

    echo("Aucun fichier ni répertoire à supprimer");
}
?>

Ok, mais maintenant, le problème qu'on a, c'est que tel quel, ça ne fonctionne pas. Pourquoi ? Tout simplement parce qu'il manque une valeur exploitable dans $a_del[$i] correspondant à l'attribut value de la case à cocher correspondante.

Donc relis tout ça en détail, réfléchis un peu et reviens si tu as des questions plus particulières.

 
Par pataugas  -  Le 12/09/2016 15:24  -  Haut de page  - 

$a_del = $choix; // <- nom du répertoire à effacer est passé en variable // <=== Ça sert à quoi ça ?

Ben justement.

Dans ma compréhension (du moment), cette ligne récupère la valeur du "name" de la checkbox mais dans le cas présent, il semble que ce soit un reliquat d'un des multiples test et je ne sais plus à quoi ça sert.

>>parce qu'il manque une valeur exploitable dans $a_del[$i] correspondant à l'attribut value de la case à cocher correspondante.

Sans doute ce qu'il manque un truc de ce genre...

$a_del[$i] = $_POST["choix"];

Mais le test me raconte "Echec ! Le site 1 n'a pu etre supprime" et je ne sais pour le moment aller plus loin.

En mutualisé, je n'ai pas de php.ini mais j'ai mis dans mes pages...

<?php

ini_set('display_errors','on');
error_reporting(E_ALL);

?>

 
Par Cyrano  -  Le 12/09/2016 15:39  -  Haut de page  - 

Ok, alors règle de base du développeur : on travaille en local sur sa machine, ensuite seulement on met ça en ligne pour le tester éventuellement.

Ce qui veut dire qu'il faudrait que tu installes un environnement de développement local, : Apache, PHP, MySQL.
Il existe des packages qui mettent tout ça en place en une seule fois, comme par exemple WampServer, Xampp voire EasyPHP. Je recommande le premier ou le second.
À partir de là, on ajuste la configuration comme on veut, de façon stricte de préférence et ainsi, lorsqu'on met en ligne sur un environnement mutualisé, on a pas de surprise.

Ensuite, une petite astuce : en début de fichier delfile.php, il faudrait ajouter ceci juste le temps du développement :

echo("<pre>\n");
var_dump($_POST);
echo("</pre>\n");

Et ça va afficher ce qui est reçu depuis le formulaire, c'est très utile, en particulier quand on débute, ça facilite la compréhension.

 
Par pataugas  -  Le 12/09/2016 17:14  -  Haut de page  - 

Ok pour...

echo("<pre>\n");
var_dump($_POST);
echo("</pre>\n");

Pour installer Wampp sur ma machine (ubuntu), cela me complique les choses et j'en ais assez à faire sur ce coup. Lol !

Je verrai ça quand j'aurai résolu ce problème et bien potassé les tutos PHP de ce site. ;)

 
Par Cyrano  -  Le 12/09/2016 17:21  -  Haut de page  - 

Wamp ne fonctionnera pas sous Ubuntu, par contre XAMPP est prévu pour tous les systèmes d'exploitation, incluant Linux.

Ceci dit, selon la manière dont est installé ta distribution, il devrait déjà y avoir PHP, MySQL, et un serveur Apache, donc il n'y a peut-être pas besoin d'installer quoi que ce soit.

Autre astuce en attendant pour tester en ligne : activer les directives dynamiquement en PHP en début de code :

ini_set('display_error', 1;
ini_set('error_reporting', E_ALL);
 
Par pataugas  -  Le 12/09/2016 17:33  -  Haut de page  - 

Sauf que...

ini_set('display_error', 1;
ini_set('error_reporting', E_ALL);

Me donne une page blanche et que ...

ini_set('display_errors','on');
error_reporting(E_ALL);

fonctionne très bien. ;)

 
Par Cyrano  -  Le 12/09/2016 17:40  -  Haut de page  - 

ok, j'ai oublié de fermer une parenthèse sur la première ligne, mais l'idée reste la même.

 
Par pataugas  -  Le 12/09/2016 17:48  -  Haut de page  - 

Sans doute mais même avec la fermeture, il ne donne pas la belle erreur à laquelle on a droit.

 
Par pataugas  -  Le 12/09/2016 18:45  -  Haut de page  - 

Je voulais écrire XAMPP bien évidemment.

Pour en revenir à mes suppressions, j'ai beau m'y crever les yeux et faire bouillonner ma cervelle, je ne trouve pas la colle.

Une autre piste pour comprendre ?

 
Par Cyrano  -  Le 12/09/2016 19:00  -  Haut de page  - 

AS-tu regardé ce que donne le var_dump suggéré plus tôt ?

 
Par pataugas  -  Le 12/09/2016 19:13  -  Haut de page  - 

Oui, oui, mais je ne sais pas le lire donc m'en servir. Cela donne...

array (1) {
[ "Choix"] =>
array (1) {
[0] =>
string (1) "1"
}
}
 
Par Cyrano  -  Le 12/09/2016 19:27  -  Haut de page  - 

Ok, alors on va traduire.

« array », ça veut dire « tableau ». Ce qui se trouve entre des crochets, ce sont des index. On va réaligner un peu ça pour une lecture plus facile :

array (1)
{
    ["Choix"] => array (1)
    {
        [0] => string (1) "1"
    }
}

Ici, on a donc ce que contient $_POST. C'est un tableau qui contient un index ( le « 1 » entre parenthèses), ce qui s'affiche « array (1) ».
Cet unique index est indiqué entre les crochets, on voit ici « ["Choix"] » qui correspond à l'attribut « name » d'un champ de formulaire. Mais, petit détail important, on voit que c'est aussi un tableau. On a donc un tableau imbriqué dans un autre tableau.
Enfin, le contenu de "Choix" comporte un seul index, numérique cette fois-ci, et on peut voir la valeur : « [0] => string (1) "1" »
Ça se traduit par : l'index 0 est une chaine de caractères (string) d'une longueur de 1 et dont la valeur est "1".

Partant de là, ça devrait te permettre d'avancer un peu mieux, mais pour l'instant, je préfère te laisser affiner ton raisonnement à partir de ces éléments, ce sera plus efficace, on complètera si nécessaire au fur et à mesure.

 
Par pataugas  -  Le 12/09/2016 19:36  -  Haut de page  - 

>... On a donc un tableau imbriqué dans un autre tableau.

Tiens, voilà autre chose ! ;)

Justement; je suis en train de re-lire la page "Les tableaux (ou arrays)" qui cause de ça mais bien sûr, ça a du mal à entrer car bien nouveau pour moi. Une vraie prise de tête pour débutants. Lol !

Bon, mon système attends un chemin valide pour s'exécuter en cherchant une valeur.

Je continue à la chercher. :)

 
Par pataugas  -  Le 12/09/2016 22:01  -  Haut de page  - 

>> Ça se traduit par : l'index 0 est une chaine de caractères (string) d'une longueur de 1 et dont la valeur est "1".

Ce "1" semble ressembler à la value de la case à cocher ce que je pige pas puisque c'est sur la valeur de "name" (choix) que le script travaille.

En plus, je n'arrive pas à comprendre cette variable "$site" et l'ensemble est encore un peu trop ardue pour moi. Je ne suis pas assez avancé et j'en suis vraiment désolé. :-//

 
Par Cyrano  -  Le 12/09/2016 22:19  -  Haut de page  - 

Il faut comprendre plusieurs choses par rapport aux champs de formulaires.

Un champ doit avoir un attribut name et selon le cas un attribut value.

Si dans un formulaire j'ai par exemple les champs nom, prenom, age, le tableau à l'arrivée ($_POST) ressemblera à ceci :

array(3)
{
    ["nom"]    => string(10) 'Tartempion'
    ["prenom"] => string(5) 'Jules'
    ["age"]    => string(2) '35'
}

L'index, c'est l'attribut name qui permet de cibler un champ précis du formulaire, quant à la valeur, c'est ce qu'on trouve dans l'attribue value s'il y en a un, sinon, c'est généralement ce qu'on a défini pour une case à cocher ou un bouton radio, ou encore le contenu dans un textarea ou l'option sélectionnée dans un select.

Est-ce qu'à ce stade c'est plus clair ?

 
Par pataugas  -  Le 12/09/2016 22:31  -  Haut de page  - 

Clair, clair, il faut le dire vite car en PHP, même si j'arrive à "deviner" certaine fonctions, écrire des petits trucs vraiment simples ou même parfois débugger quand j'y mets du coeur, j'en suis tout de même au stade du "Hello Word !"

Ce n'est pas que tu explique mal, bien au contraire, mais j'ai l'impression de prendre un train en route pour lequel je n'aurais pas de billet.

Je ne peux pas évidement te demander d'expliquer chaque ligne mais sur ce coup, il va me falloir de l'entrainement pour pouvoir te suivre.

Aide-moi STP à finaliser l'actuel afin que j'ai l'esprit libre pour potasser les tutoriels et le prochain coup, quand je poserai une question, je saurai de quoi je parle.

Merci pour ta compréhension Cyrano. :)

 
Par Cyrano  -  Le 12/09/2016 22:33  -  Haut de page  - 

Pas de soucis, on va y aller à ton rythme.

Dis-moi sur quel point tu bloques, ça me donnera des pistes pour tenter de te donner des explications adaptées.

 
Par pataugas  -  Le 12/09/2016 22:50  -  Haut de page  - 

Hou là-là, cela sera vite fait. :D

J'ai compris que le dossier doit être ouvert avant toute chose :opendir
Que le script lit le dossier dans une boucle : While
Qu'il fabrique un tableau (array), dans notre cas "$a_del" dans lequel il case le résultat du $_POST c'est à dire "choix".

Il compte les lignes dans le tableau et exécute une boucle foreach qui donne à la variable "$i" les valeurs trouvées dans "$a_del" mais je ne m'explique pas "=> $site"

Ensuite, la concatenisation de ". $a_del[$i] ." est un mystère pour moi et je ne vois toujours pas où il va pécher la valeur qui nous intéresse et ce qu'il nous manque pour l'afficher ou du moins pour que le script fonctionne.

Bon, tu aura remarqué que je ne "pense" pas encore PHP mais ça devrait venir dans les jours, semaines ou mois à venir. ;)

 
Par Cyrano  -  Le 12/09/2016 22:55  -  Haut de page  - 

Ok, alors deux points :

-1- Tu ne penses pas encore en PHP ? C'est heureux, parce qu'il faut d'abord penser fonctionnel, ensuite tu traduira en PHP quand tu saura exactement ce que doit fonctionnellement faire ton code.

-2- La valeur reçu n'est pas celle attendue : normal, parce que tu ne t'es pas posé la bonne question : où est définie cette valeur ? Comment faire en sorte qu'elle soit correctement définie au niveau du formulaire pour être correctement reçue par le script de traitement ?

Voilà, cogite déjà là-dessus, on verra la suite demain ;)

 
Par pataugas  -  Le 12/09/2016 23:02  -  Haut de page  - 

Comment je ne me suis pas posé la bonne question ? J'y ais passé la journée ! :-D :D :D

En fait, si, j'y ais été dans le formulaire en me disant que c'était bien possible qu'il faille introspecter dans le coin et même essayé de modifier le valeur de "value" par autre choses.

echo "\t\t\t<li><input type=\"checkbox\" name=\"choix[]\"    value=\"1\"><a href=\"$dir_nom/$lien/ \"$lien\"  '\"><img src=\"../../icone-site-web.tb.png\">  $lien </a></li>\n";

Mais je n'ai pas eu de chance. ;)

Bonne nuit, bon repos et merci pour tout ce que j'ai appris aujourd'hui grâce à toi. :)

 
Par Cyrano  -  Le 13/09/2016 08:35  -  Haut de page  - 

Ok, revenons à nos moutons : essaye de ne pas mettre la charrue avant les boeufs,sinon tu vas te prendre les pieds dans le tapis et te vautrer.

Reprenons ton champ de formulaire :

<input type="checkbox" name="choix[]" value="1" />

Là, nous avons quoi ?

  1. Un champ de type case-à-cocher;
  2. Ce champ a pour nom « choix[] », on sait donc qu'il enverra un élément de tableau qu'on récupèrera dans $_POST['choix'] avec un index numéroté automatiquement;
  3. Ce champ a pour valeur « 1 »;

Bien, nous disions plus tôt que cette valeur ne nous servait à rien pour identifier quel dossier doit être traité. Donc il faudrait mettre à la place une valeur utilisable avec laquelle on pourrait identifier un dossier précis, je pense que tu sera d'accord avec ça.

Donc, en toute logique, c'est au moment où nous construisons la liste des cases à cocher pour le formulaire HTML que nous devons affecter une valeur spécifique telle qu'on voudra pouvoir la récupérer lors du traitement.

La construction des cases à cocher avec les liens se fait ici :

foreach($dossier as $lien)
{
    echo "\t\t\t<li><input type=\"checkbox\" name=\"choix[]\" value=\"1\"><a href=\"$dir_nom/$lien/ \"$lien\"  '\"><img src=\"../../icone-site-web.tb.png\">  $lien </a></li>\n";
}

On va donc modifier pour que chaque case ait une valeur identifiable :

foreach($dossier as $lien)
{
    // On commence par définir le chemin vers le lien dans une variable;
    $chemin_cible = $dir_nom . DIRECTORY_SEPARATOR . $lien;
    // On construit maintenant le champ de formulaire et le lien en utilisant cette valeur;
    echo "\t\t\t" . '<li><input type="checkbox" name="choix[]" value="'. $chemin_cible .'"><a href="'. $chemin_cible .'"><img src="../../icone-site-web.tb.png">'. $lien .'</a></li>' . "\n";
}

Le résultat, si les trois cases sont cochées, c'est que nous allons récupérer des valeurs exploitables. Exemple, si nous avons par exemple un dossier qui se nomme « infos » et les liens « site_1 », « site_1 » et « site_1 », nous récupèrerons ceci :

array (1)
{
    ["choix"] => array (3)
    {
        [0] => string (12) "infos/site_1"
        [1] => string (12) "infos/site_2"
        [2] => string (12) "infos/site_3"
    }
}

Je te laisse analyser ça, relis attentivement, ça devrait commencer à apparaitre moins compliqué.

 
Par pataugas  -  Le 13/09/2016 10:20  -  Haut de page  - 

Bonjour et oui, cela commence à s'éclaircir de bon matin. :)

Toutefois, cela ne fonctionne pas encore comme on peut le constater ici...

(http://ecole.reseauk.info/cyrano.php)

Le résultat du var_dump est

array(1) {
  ["choix"]=>
  array(3) {
    [0]=>
    string(8) "sites/ob"
    [1]=>
    string(13) "sites/obliger"
    [2]=>
    string(10) "sites/papa"
  }
}

...ce qui m'emmène à chercher à comprendre à quoi correspond la valeur de la chaîne string (). C'est quoi ce chiffre ? Tu en as parlé hier mais... :-//

 
Par Cyrano  -  Le 13/09/2016 11:24  -  Haut de page  - 

ce chiffre, c'est la longueur de la chaine de caractères.

« sites/ob » => 8 caractères;
« sites/obliger » => 13 caractères;
etc..

C'est une information assez secondaire.

 
Par pataugas  -  Le 13/09/2016 11:33  -  Haut de page  - 

Oui, j'avais compris cela mais ne comprends pas à quoi cela correspond.

Par exemple, sites/ob, le nom du site fait 2 caractères.

Alors, cette "chaîne de caractère", c'est quoi ?

Autre chose mais qui n'a rien à voir, sur ce forum, quand je cherche à prévisualiser la réponse, je ne la vois pas sinon la fenêtre d'édition.

Un truc que je rate ?

 
Par Cyrano  -  Le 13/09/2016 11:56  -  Haut de page  - 

Pour la chaine : « ob » ne compte effectivement que 2 caractères, mais la chaine, ce n'est pas ça, c'est « sites/ob ».

Il n'y a pas de prévisualisation ici. Si c'est pour voir avant de poster quand il y a du code : pour que le code s'affiche correctement avec le système Markdown, il faut, pour un bloc de code, laisser une ligne vide, mettre le code en le décalant entièrement de 4 espaces vers la droite, et terminer par une ligne vide avant de continuer le texte normal.

 
Par pataugas  -  Le 13/09/2016 12:08  -  Haut de page  - 

Oui, ce Markdown est déroutant quand on le découvre mais ça va finalement finir par le faire. ;)

Ok pour la chaîne de caractère. Je pige maintenant.

Je viens d'installer sur mes test un petit système pour afficher le code source à améliorer sûrement mais qui fonctionne.

Bon, pourquoi cela ne fonctionne-il toujours pas ?

 
Par Cyrano  -  Le 13/09/2016 12:19  -  Haut de page  - 

Là, il va falloir cogiter un peu. Pourquoi ça ne fonctionne pas, tel quel je n'en sais rien, mais je n'ai pas tous les éléments.

As-tu installé (ou activé) un environnement de développement local ? Sinon, as-tu bien activé dynamiquement l'affichage des erreurs ? Et le cas échéant, est-ce que des erreurs s'affichent ?
À cette dernière question, je n'en ai pas vu en testant l'url, ce qui tendrait à m'indiquer que la réponse à la question précédente est non.

Si on part du principe que la partie formulaire est correcte, on doit s'occuper de la partie traitement : il faut savoir ce qui se déroule, et comment. On peut pour ça faire afficher des informations au fur et à mesure un peu partout dans le code. : si le résultat attendu s'affiche, tout va bien, mais si c'est autre chose, c'est qu'il y a une anomalie ou un oubli dans le code.

Tu as mis le var_dump en place qui montre bien les données reçues, c'est bien, mais il faudrait faire le même genre de choses sur d'autres variables plus loin dans le code, et même dans les boucles.
Essaye de suivre ton code en réfléchissant à son déroulement : à tel endroit, il doit se passer ça, pour vérifier, je vais faire afficher ceci, et sinon, je dois faire afficher autre chose, à quel endroit est-ce que je dois mettre cette autre chose ? etc, etc.. déroule ton code en mettant des points de repère et l'affichage temporaire d'informations.

 
Par pataugas  -  Le 13/09/2016 12:38  -  Haut de page  - 

Oui, j'ai bien activé dynamiquement l'affichage des erreurs

<?php ini_set('display_errors','on');
error_reporting(E_ALL);
echo("<pre>\n");
var_dump($_POST);
echo("</pre>\n");
?>

...et l'on peut le constater en tentant de supprimer un site sur la page de traitement qui affiche en ce moment...

Warning: opendir() expects parameter 1 to be a valid path, array given in /home/reseauk/public_html/ecole/delfiles.php on line 14

>>...mais il faudrait faire le même genre de choses sur d'autres variables plus loin dans le code, et même dans les boucles

Là Houps et il fa falloir me donner un exemple.

>>...mais je n'ai pas tous les éléments.

C'est exactement pour cela que j'ai installé un système pour montrer le code source. ;)

D'ailleurs, dans delfiles.php il y a une ligne à la fin (entre les deux "else") que tu avais déjà remarqué et je ne sais pas trop quoi en faire. Je l'ai commentée pour le moment. Il s'agit de...

$a_del = $_POST["choix"];  // <- nom du répertoire à effacer est
passé en variable // <=== Ça sert à quoi ça ?

Pour l'environnement de tests en local, puisque tu insiste, je vais installer ça aujourd'hui. :)

 
Par Cyrano  -  Le 13/09/2016 13:23  -  Haut de page  - 

Ok, j'avais pas vu le message d'erreur, on va le décortiquer :

Warning: opendir() expects parameter 1 to be a valid path, array given in /home/reseauk/public_html/ecole/delfiles.php on line 14

Warning, c'est un avertissement, pas fatal pour le reste de l'exécution du code, mais la ligne n'est pas exécutée correctement pour autant;
Ensuite, traduisons le message :

opendir() attend en premier paramètre un chemin valide, reçu un tableau

Enfin, l'erreur est repérée à la ligne 14 dans le fichier delfiles.php

Partant de là, observe cette ligne, et vérifie ce que tu indiques exactement comme paramètre à la fonction opendir().

 
Par pataugas  -  Le 13/09/2016 13:41  -  Haut de page  - 

Je viens d'installer apache sur mon Ubuntu mais bien sûr, comme je ne l'utilise pas d'habitude, il va (aussi) falloir que je m'y forme et je rencontre un premier problème.

Ma page PHP m'affiche les codes comme on peut le voir sur cette image.

http://ecole.reseauk.info/data/medias/copie-apache.jpg

Bon, j'ai commencé à chercher la soluce sur les forums mais ça va me bouffer mon temps.

Si tu sais m'indiquer le bon paramétrage...

Pour le reste, je regarde. :)

 
Par Cyrano  -  Le 13/09/2016 13:58  -  Haut de page  - 

Apache, c'est bien, mais est-ce que PHP est installé ?

 
Par pataugas  -  Le 13/09/2016 14:07  -  Haut de page  - 

Ben,logiquement oui mais va savoir. ://

Je l'ai chopé ici...

https://doc.ubuntu-fr.org/apache2

Sinon, quelle est la manip pour vérifier ?

 
Par Cyrano  -  Le 13/09/2016 14:10  -  Haut de page  - 

quelle url as-tu utilisé pour afficher ta page en local ?

 
Par pataugas  -  Le 13/09/2016 14:12  -  Haut de page  - 

http://localhost/test-sites/

Ma page cyrano.php est ici renommée en index.php

 
Par Cyrano  -  Le 13/09/2016 14:12  -  Haut de page  - 

Sinon, regarde cette autre page pour tout installer (sauf apache du coup)

https://doc.ubuntu-fr.org/lamp

 
Par pataugas  -  Le 13/09/2016 14:13  -  Haut de page  - 

J'y suis dessus. ;)

 
Par pataugas  -  Le 13/09/2016 14:27  -  Haut de page  - 

Bon, aussi paradoxal que cela puisse paraître, c'était bien ça.

Cela fonctionne maintenant. :)

 
Par Cyrano  -  Le 13/09/2016 14:30  -  Haut de page  - 

Ben voilà.

Partant de là, tu peux configurer PHP en mode strict en éditant le fichier php.ini et en mettant directement les bonnes valeurs sur les directives display_error et error_reporting.
Attention, lorsque tu modifie le php.ini, ne pas oublier de redémarrer Apache pour la prise en compte des modifications.
Ensuite, retirer les ini_set du code PHP puisque ça devient inutile.

Toujours développer et tester en local, et ne mettre en ligne que du code testé et corrigé si besoin est AVANT.

 
Par pataugas  -  Le 13/09/2016 14:35  -  Haut de page  - 

Ouaip !

Il va falloir que je change les habitudes et je ne te cache pas que c'est prise de tête pour moi car il me faut tout réapprendre car le moindre pépin m'oblige à faire des recherches pour solutionner.

Mais ça vas aller. On n'a rien sans rien. :)

Pour la ligne 14, (opendir), j'ai examiné, testé d'autres variables mais suis arrivé au bout.

Il est où le secret ce coup-ci ?

 
Par Cyrano  -  Le 13/09/2016 14:52  -  Haut de page  - 

essaye en faisant un var_dump du paramètre juste avant la ligne 14, tu vas voir : ce qui est attendu, c'est une chaine de caractère qui soit un chemin valide, si tu vois autre chose (int ou array), alors il y a un problème à corriger.

 
Par pataugas  -  Le 13/09/2016 15:00  -  Haut de page  - 

array(1) {
["choix"]=>
array(1) {
[0]=>
string(1) "1"
}
}

 
Par pataugas  -  Le 13/09/2016 15:06  -  Haut de page  - 

Attend, il y a un loup quelque part. Désolé.

sur un autre test (j'en fais plusieurs en parallèle), ça me donne

array(1) {
["choix"]=>
array(1) {
[0]=>
string(9) "sites/444"
}
}

Warning: opendir() expects parameter 1 to be a valid path, array given in /home/reseauk/public_html/ecole/delfiles.php on line 17

 
Par Cyrano  -  Le 13/09/2016 15:12  -  Haut de page  - 

Ok, c'est donc un tableau qui est reçu et non une chaine : exerce donc ta logique : quelle est la chaine qui doit être passée en paramètre et comment l'isoler pour la passer à la fonction ?

 
Par pataugas  -  Le 13/09/2016 15:21  -  Haut de page  - 

Hum ! Ma logique ?

Là, je sèche. :(

 
Par Cyrano  -  Le 13/09/2016 15:27  -  Haut de page  - 

Hé, il te faut apprendre : si je te dis quoi faire, tu n'appendras pas, mais si je t'indique le chemin, tu gagneras en autonomie pour à terme ne plus avoir besoin d'aide.

Petit exercice :

Il y a deux aspects dans la programmation : la logique, et le langage. pour ce qui est du langage, tu as pour l'instant les bases nécessaires, il te faut améliorer ta logique.

Tu as un tableau $_POST qui contient ceci :

array(1) {
    ["choix"]=> array(1) {
        [0]=> string(9) "sites/444"
    }
}

Pour afficher le tableau, il te suffit de faire var_dump($_POST) : comment dois-tu écrire la commande qui n'affichera que la chaine « sites/444 » ?

var_dump(???); // remplacer les ???
 
Par pataugas  -  Le 13/09/2016 15:32  -  Haut de page  - 

Ben écoute, je n'ai même pas vraiment compris ce qu'étaient les chaines et il m'est difficile d'inventer. ;)

 
Par Cyrano  -  Le 13/09/2016 15:39  -  Haut de page  - 

On parle de « chaînes de caractères », c'est à dire une succession de caractères qui forment un ensemble, ça peut être un ou plusieurs mots, une url ou bien d'autres choses du même genre, mais toujours une suite de caractères : pas un tableau (array) ni un numérique entier (int) ou flottant (float).

Lorsque tu affiches ce tableau, il te montre les index, le type (string, int, float ou array), sa longueur (en nombre de caractères pour une chaine ou un flottant, la valeur pour un entier, ou bien le nombre d'éléments pour un tableau imbriqué.
Ici, on voit quoi ?un seul index « 0 » qui est de type « string (9) », donc, une chaine composée de 9 caractères, et, en l'occurrence, il s'agit de « sites/444 » : c'est cette valeur que je voudrais que tu affiches à partir de $_POST.

 
Par pataugas  -  Le 13/09/2016 15:46  -  Haut de page  - 

C'est du coté de $chemin_cible que ça se passe non ?

echo "\t\t\t" . '<li><input type="checkbox" name="choix[]" value="'. $chemin_cible .'"><a href="'. $chemin_cible .'"><img src="../../icone-site-web.tb.png">'. $lien .'</a></li>' . "\n";

 
Par Cyrano  -  Le 13/09/2016 15:50  -  Haut de page  - 

Non, ce n'est pas ce que je te demande : tu as une variable super-globale $_POST qui contient des données. Ce que tu semble ne pas avoir saisi, c'est comment traiter ces données individuellement.

Là, ce que je voudrais, c'est que tu fasse afficher, avec un simple var_dump pour l'instant, la donnée qu'il y a à l'index 0 du tableau $_POST.

 
Par pataugas  -  Le 13/09/2016 15:58  -  Haut de page  - 

Non, là, je sature et finis par ne plus rien comprendre.

Il faut essayer autrement. :-//

 
Par Cyrano  -  Le 13/09/2016 16:09  -  Haut de page  - 

La documentation sur les tableaux aurait pu t'apprendre pas mal de choses, il faudra y revenir.

Sommairement, on affiche les choses de la façon suivante :

  1. Un tableau :

    $tableau = array(
        "chaine 1",
        "chaine 2"
    );
    echo("<pre>\n");
    var_dump($tableau);
    echo("</pre>\n");
    // affiche donc :
    // array(2){
    //     [0] string(8) "chaine 1"
    //     [1] string(8) "chaine 2"
    // }
    
  2. la chaine du premier index de ce même tableau, le premier index étant ici « 0 »

    echo("<pre>\n");
    var_dump($tableau[0]);
    echo("</pre>\n");
    // affiche donc :
    // string(8) "chaine 1"
    
  3. Pour traiter un tableau en boucle, on va utiliser foreach :

    echo("<pre>\n");
    foreach($tableau as $index => $valeur)
    {
        echo($tableau[$index] ." ou encore ". $valeur ."<br />\n");
    }
    echo("</pre>\n");
    // affiche donc :
    // chaine 1 ou encore chaine 1
    // chaine 2 ou encore chaine 2
    

Teste ça, fais le parallèle avec le code de ton traitement de fichiers et reviens avec des questions si tu bloques encore sur un élément ou un autre.

 
Par pataugas  -  Le 13/09/2016 16:43  -  Haut de page  - 

Oui, il faut que j'assimile ces histoires de tableaux et de chaines.

Je vais reprendre les tutos et ça va bien finir par entrer.

Après, il n'y aura plus qu'à.

Merci et à bientôt. :)

 
Par pataugas  -  Le 14/09/2016 18:20  -  Haut de page  - 

J'ai fais mieux que "regarder ces histoires de tableaux" en commençant un vrai cours de PHP.

Le résultat ne s'est pas fait attendre et est visible ici.

Encore merci Cyrano de m'avoir "poussé" à travailler et aidé à obtenir ce résultat. :)

 
Par Cyrano  -  Le 14/09/2016 18:28  -  Haut de page  - 

Salut,ça a l'air de très bien fonctionner.

Si tu te lances dans d'autres développements, n'hésite pas à revenir, on regardera ça de près.

Mais globalement, garde ceci en mémoire : je suis moi-même complètement autodidacte. Je me suis fait aider à l'époque par quelques contacts avec qui je discutais par chat, contacts qui ont depuis un peu disparu. Plus tard, j'ai beaucoup trainé sur les forums de PHPFrance (ou j'ai le même pseudo), mais j'ai posé en fin de compte assez peu de questions par rapport à l'ensemble de mes interventions. Aujourd'hui, je n'y participe quasiment plus depuis 5 ou 6 ans faute de temps, mais je suis quand même toujours le premier posteur. Si tu vas sur phpfrance.com, tu pourras trouver beaucoup d'informations techniques, et même un ou deux tutos que j'y ai laissé.
Mais je préfère rester actif ici, il y a largement moins de monde et j'ai assez de temps pour suivre, alors que PHPFrance est trop animé.

Comme quoi, si on se donne la peine de réfléchir et de se documenter, on peut faire pas mal de choses :)

Bonne continuation.

 
Par pataugas  -  Le 14/09/2016 18:41  -  Haut de page  - 

Oui, et le conseil que je donne aux bidouilleurs dans mon genre, c'est de se mettre tout de suite à l'apprentissage du PHP qui n'est pas si difficile que l'on pourrait imaginer.

En quelques jours, j'ai fais un immense bond en avant et ne regrette absolument pas d'avoir écouté les plus anciens qui m'ont incité à faire cette démarche.

Je vois maintenant les tutoriels d'un autre oeil. :)

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |