Manipulation de fichier csv.

Eléphanteau du PHP | 10 Messages

29 mai 2014, 20:41

Bonjour à tous,

J'apprends le PHP, et j'aimerais réussir à créer une "TODOlist", donc une liste dans laquelle des tâches seraient notées. Pour ça on aurait un formulaire qu'on remplirait, puis on pourrait ajouter une tâche, en supprimer une, mais surtout en modifier une.

Pour cela, j'utilise un .csv dans lequel seront stockées les informations. La partie formulaire, ajouter une tâche et en supprimer une, c'est bon.

Pour la modification par contre, c'est un calvaire.

Jusqu'ici mon code ressemble à ça :
<?php

if (!(array_key_exists("modify",$_GET))) {
echo '<form method="post" action="index.php">
    <fieldset>
        <legend>ToDoList</legend>
        <input type="text" name="title" placeholder="Title" required/><br/>
        <input type="text" name="description" placeholder="Description" required/><br/>
        <input type="text" name="date" placeholder="Date" required/><br/>
        <input type="text" name="priority" placeholder="Priority" required/><br/>
        <input type="submit" name="submit" value="Add" required/><br/>
    </fieldset>
</form>';

/* WRITE */

if (array_key_exists("submit", $_POST)) {
    $aCsvOpenToWrite = fopen('test.csv', 'a');

    $title = NULL;
    $description = NULL;
    $date = NULL;
    $priority = NULL;

    if (array_key_exists("title", $_POST)) {
        $title = $_POST["title"];
    }

    if (array_key_exists("description", $_POST)) {
        $description = $_POST["description"];
    }

    if (array_key_exists("date", $_POST)) {
        $date = $_POST["date"];
    }

    if (array_key_exists("priority", $_POST)) {
        $priority = $_POST["priority"];
    }

    $aEnteredFields = array($title, $description, $date, $priority);

    fputcsv($aCsvOpenToWrite, $aEnteredFields, ";");

    fclose($aCsvOpenToWrite);
}

/* DELETE */

if (array_key_exists("delete", $_POST)) {

    $aCsvOpenToRead = fopen('test.csv', 'r');
    $aDatas = array();
    $aSave = array();
    $iLine = 0;
    $iCountCheckbox = 0;

    while (($aDatas = fgetcsv($aCsvOpenToRead, 4096, ";")) !== false) {

        $aSave[$iLine] = $aDatas;
        $iLine++;
    }
    fclose($aCsvOpenToRead);

    $aCsvOpenToWrite = fopen('test.csv', 'w');

    while ($iCountCheckbox < count($aSave)) {
        if (array_key_exists($iCountCheckbox, $_POST)) {
            $iCountCheckbox++;
        } else {
            fputcsv($aCsvOpenToWrite, $aSave[$iCountCheckbox], ";");
            $iCountCheckbox++;
        }
    }
    fclose($aCsvOpenToWrite);
}


/* DISPLAY */

$aCsvOpenToRead = fopen('test.csv', 'r');
$aDatas = array();
$iCountLine = 0;

echo "<form method='post' action='index.php'><table>";
while (($aDatas = fgetcsv($aCsvOpenToRead, 4096, ";")) !== false) {
    echo "<tr>";
    foreach ($aDatas as $line) {
        echo "<td>" . $line . "</td>";
    }
    echo "<td><input type = 'checkbox' name = '" . $iCountLine . "'/></td></tr>";
    $iCountLine++;
}
echo "</table><input type='submit' name='delete' value='Delete'/></form><form method='get' action=''><input type='submit' name='modify' value='Modify'/></form>";
fclose($aCsvOpenToRead);

        /* MODIFY */

} else if (array_key_exists("modify", $_GET)) {

    $aCsvOpenToRead = fopen('test.csv', 'r');
    $aDatas = array();
    $iCountLine = 0;

    echo "<form method='post' action='index.php'><table>";
    while (($aDatas = fgetcsv($aCsvOpenToRead, 4096, ";")) !== false) {
        echo "<tr>";
        foreach ($aDatas as $line) {
            echo "<td>" . $line . "</td>";
        }
        echo "<td><input type = 'checkbox' name = '" . $iCountLine . "'/></td></tr>";
        $iCountLine++;
    }
    echo "</table><input type='submit' name='delete' value='Delete'/></form><form method='get' action=''><input type='submit' name='modify' value='Modify'/></form>";
    fclose($aCsvOpenToRead);

    $aCsvOpenToRead = fopen('test.csv', 'r');
    $aSave = array();
    $iLine = 0;

    while (($aDatas = fgetcsv($aCsvOpenToRead, 4096, ';')) !== false) {
        $aSave[$iLine] = $aDatas;
        $iLine++;
    }
    fclose($aCsvOpenToRead);

    $aCsvOpenToRead = fopen('test.csv', 'r');
    $aDatas = array();
    $iCountLine = 0;

    $aCsvOpenToWrite = fopen('test.csv', 'w');

    while ($iCountLine < count($aSave)) {
        if (array_key_exists($iCountLine, $_POST)) {
            echo '<form method="post" action="index.php">
    <fieldset>
        <legend>ToDoListModifier</legend>
        <input type="text" name="title" placeholder="Title" value="'.$aSave[$iCountLine][$iCountLine].'" required/><br/>
        <input type="text" name="description" placeholder="Description" value="'.$aSave[$iCountLine][$iCountLine+1].'" required/><br/>
        <input type="text" name="date" placeholder="Date" value="'.$aSave[$iCountLine][$iCountLine+2].'" required/><br/>
        <input type="text" name="priority" placeholder="Priority" value="'.$aSave[$iCountLine][$iCountLine+3].'" required/><br/>
        <input type="submit" name="submit" value="Confirm Modification" required/><br/>
    </fieldset>
</form>';
        } else {
            fputcsv($aCsvOpenToWrite, $aSave[$iCountLine], ";");
        }
    }
    fclose($aCsvOpenToWrite);

}
?>
Dans l'idée, j'ai voulu créer le formulaire en php pour qu'il soit "normal" lorsque GET ne reçoit pas la clé "modify" qui pourra être submit ou non. Donc le script s'effectue normalement et fonctionne à ce moment là.

S'il la reçoit par contre, j'aimerais que les values de la ligne cochée remplacent les values de chaque input du formulaire. Puis qu'on puisse les modifier, cliquer sur modifier, et que tout soit sauvegardé. Pour ça je comptais faire comme avec la fonction delete que j'ai faite, à savoir sauvegarder le fichier dans un tableau temporaire puis le ré-écrire en changeant cette fois (au lieu de l'ignorer) la checkbox qui aura été coché avec les nouvelles values insérées dans le formulaire.

Seulement je tombe sur une boucle infinie et je me retrouve avec un .csv à 400mo sans savoir pourquoi.

Comment faire ?

Mammouth du PHP | 1339 Messages

01 juin 2014, 17:16

Salut,

Voici ce que moi je te propose comme logique :

2 Formulaires
  • Un pour les ajouts
  • Un avec la liste et un case a cocher pour Supprimer
Grosso-modo, quand tu veux ajouter un ligne, tu passes par le formulaire d'ajout et ca rajoute une ligne à la fin du fichier en cours.
L'autre formulaire est également une série de champ (Que tu peux camoufler avec du CSS si tu veux).
A chaque fois que tu appuyes sur "Mettre à jour" cela réecrit le fichier mais si la case "Supprimer" est cocher alors ca n'écrit pas la ligne tout simplement.

Dis moi ce que tu penses déjà ce cette logique.

Elie
Bon sinon tu me fais un message privé et on se fait un TeamViewer