Tableau à deux dimensions et foreach

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 : Tableau à deux dimensions et foreach

Re: Tableau à deux dimensions et foreach

par xTG » 04 juin 2012, 21:39

Si le fclose() est aussi mal placé que pour ce code là c'est normal.
Le fichier est déjà ouvert dans certains cas. ;)

Re: Tableau à deux dimensions et foreach

par Gloumi » 04 juin 2012, 21:30

Non pas de probléme de chemin, la même ligne pour ouvrir le même fichier fonctionne très bien un peu plus loin, enfin bon j'ai rendu le projet donc à moins d'avoir la réponse de suite ne vous embêtez pas à chercher. Merci beaucoup pour votre aide en tout cas! :)

Re: Tableau à deux dimensions et foreach

par sirakawa » 02 juin 2012, 09:05

Ça signifie que le fichier concerné n'a pas pu être ouvert avec succès: problème de chemin?

Re: Tableau à deux dimensions et foreach

par Gloumi » 01 juin 2012, 17:25

Ici : Pourtant ce test fonctionne partout ailleurs sur mon site mais ici non... :/
J'ai juste un dernier petit probléme, lorsque je modifie l'adresse mail toujours, ça fonctionne mais j'ai un warning au niveau de mes tests : "Warning: fgets(): 5 is not a valid stream resource"
Sur ce morceau de code :
                $test = fopen('../fichiers/users.ini', 'a+');

                if(isset($_POST['modifier'])) {

                    // Vérification de forme pour le nouvel email
                    if($_POST['newpseudo'] != NULL) {
                        // L'adresse mail est déjà utilisée?
                        
                        while (($logs = fgets($test)) !== false) {  // <== C'est ce fgets qui pose probléme
                            $log = explode(';', $logs);
                            if($log[0] == $_POST['newpseudo']) {
                                echo 'Cette adresse de messagerie est déjà utilisée.';
                                fclose($test);
                                exit();
                            }
                            fclose($test);
                        }

Re: Tableau à deux dimensions et foreach

par sirakawa » 01 juin 2012, 12:58

L'erreur actuelle se trouve où exactement?

Re: Tableau à deux dimensions et foreach

par Gloumi » 01 juin 2012, 10:45

Oui effectivement elle me pose problème, en fait je me suis contente de reprendre la syntaxe .dat et de modifier l'extension mais je ne savais pas à ce moment là qu'il y avait une syntaxe spéciale pour les ini je l'ai appris un peu tard sachant que je dois rendre le projet ce soir. Je le saurais pour la prochaine fois... :-\ En tout cas merci de m'avoir éclaircit sur le sujet :)

Ce que j'aimerais juste corriger c'est l'erreur que j'ai maintenant sur ma page de modification du profil, j'ai un warning sur mon test mais je ne comprends pas pourquoi étant donné que cette boucle est partout dans mon site et qu'elle fonctionne :/

Re: Tableau à deux dimensions et foreach

par sirakawa » 01 juin 2012, 08:54

C'est l'extension .ini qui te perturbe:
Ce sont des fichiers d'initialisation de variables, de déclaration de fonctions (en C par exemple) qui ont une syntaxe différente suivant le langage utilisé ou le programme qui s'en sert.
C'est vrai que tes donées auraient un air plus standard dans un mes_donnees.dat que dans fic.ini.
Moi je me méfierais d'un prof tatillon qui irait chipoter sur l'extension, d'autant que PHP a son propre fichier .ini (http://www.php.net/manual/fr/ini.list.php) qui, lui, a une syntaxe à part. D'autant que ça suppose le changement d'un seul nom dans ton code. (Au fait pourquoi ne peut-on pas choisir soi-même le fichier à importer?).

Re: Tableau à deux dimensions et foreach

par Gloumi » 31 mai 2012, 19:33

Cette partie n'est pas encore commentée mais elle fonctionne maintenant, et j'ai commenté la partie qui pose maintenant problème.
En plus de ça j'explique justement mon code au dessus de ma citation étant donné qu'il n'y a pas de commentaires

Ah j'avais pas vu ton autre commentaire
C'est la syntaxe classique d'un fichier CSV, en ajoutant un saut de ligne après chaque enregistrement.
Oui on m'avait dit de faire ça pour mon premier projet et c'était avec un .dat du coup j'ai repris la même syntaxe mais j'ai appri un peu tard qu'il y avait une autre syntaxe pour les .ini :/

Re: Tableau à deux dimensions et foreach

par sirakawa » 31 mai 2012, 19:09

Code : Tout sélectionner

[email protected];7682fe272099ea26efe39c890b33675b;2.jpg;Pouet;F;15/10/2000;0 [email protected];8ebbdb6e5d4a352d6b0b06d4ac8c55e5;3.png;Li;Tux;01/12/2011;2
(Je sais ce n'est pas la syntaxe "correcte" pour un fichier ini mais je ne le savais pas lorsque j'ai commencé mon site)
C'est la syntaxe classique d'un fichier CSV, en ajoutant un saut de ligne après chaque enregistrement.

Voici mon code :
Globalemant un code sans commentaires est un code nul

Code : Tout sélectionner

<?php /* acceper c'est quoi?*/ if (isset($_POST['accepter'])) { /* déjà il faut array() avec une minuscule. Ensuite quelle étrange idée de donne rà une variable le nom d'une fonction, au lieu de lui donner un nom significatif de son rôle*/ $array = Array(); // Avant de mettre cette ligne j'avais une erreur" Notice: Undefined variable: array" et "Warning: Invalid argument supplied for foreach()" $i = 0; $j = 0; /* il sort d'où ce users?*/ while (($logs = fgets($users))) { /* mêmes remarques que pour array*/ $explode = explode(';', $logs); while ($j!=7) { if($explode[0] == $_POST['userlist']) { $explode[6] = $_POST['level']; } $array[$i][$j] = $explode[$j]; $j++; } $i++; $j=0; } ftruncate($users, 0); foreach ($array as $j) { $k=0; foreach ($j as $key) { fputs($users, $key); if($k!=5) { fputs($users, ';'); } $k++; } } } ?>
Est-ce que vous savez d'ou vient le problème? Ca fait un moment que je cherche et je ne comprends vraiment pas... :?

Merci d'avance de vos réponses,


Gloumi

Re: Tableau à deux dimensions et foreach

par Gloumi » 31 mai 2012, 18:21

Bon j'ai résolu mon problème ne me demandez pas comment, par quelques bidouillages pas très propres mais bon ça fera l'affaire... Je pense que le problème était que je ne fermais pas systématiquement mon fichier après utilisation.

J'ai juste un dernier petit probléme, lorsque je modifie l'adresse mail toujours, ça fonctionne mais j'ai un warning au niveau de mes tests : "Warning: fgets(): 5 is not a valid stream resource"
Sur ce morceau de code :
                $test = fopen('../fichiers/users.ini', 'a+');

                if(isset($_POST['modifier'])) {

                    // Vérification de forme pour le nouvel email
                    if($_POST['newpseudo'] != NULL) {
                        // L'adresse mail est déjà utilisée?
                        
                        while (($logs = fgets($test)) !== false) {
                            $log = explode(';', $logs);
                            if($log[0] == $_POST['newpseudo']) {
                                echo 'Cette adresse de messagerie est déjà utilisée.';
                                fclose($test);
                                exit();
                            }
                            fclose($test);
                        }

Re: Tableau à deux dimensions et foreach

par Gloumi » 31 mai 2012, 17:07

J'ai essayé comme ceci :
            <?php
                if (isset($_POST['accepter'])) {
                    $array = Array();
                    $users = fopen('../fichiers/users.ini', 'c+');

                    $i = 0;
                    $j = 0;
                    while (($logs = fgets($users))) {
                        $explode = explode(';', $logs);


                        while ($j!=7) {
                            if($explode[0] == $_POST['userlist']) {
                                $explode[6] = $_POST['level'];
                            }
                            
                            $array[$i][$j] = $explode[$j];
                            $j++;
                        }
                        $i++;
                        $j=0;
                    }


                    fclose($users);
                    $users = fopen('../fichiers/users.ini', 'a+');

                    ftruncate($users, 0);

                    foreach ($array as $j) {
                        $k=0;
                        foreach ($j as $key) {
                            fputs($users, $key);
                            if($k!=6) {
                                fputs($users, ';');
                            }
                            $k++;
                        }
                        fputs($users, "\r\n");
                    }
                }
            ?>
Bizarrement ça fonctionne ici (mais toujours pas sur la modification de l'email), j'ai juste un problème je me retrouve avec 2 retours à la ligne à la fin du fichier ça fait planter le reste :/

Re: Tableau à deux dimensions et foreach

par kny » 31 mai 2012, 16:51

Tu as testé d'autre ouvertures en fopen? tel que 'w+' ou 'c+'

Re: Tableau à deux dimensions et foreach

par Gloumi » 31 mai 2012, 16:21

Ah oui c'est vrai j'ai oublié de le modifier merci beaucoup :)

Bon j'ai fait quelques tests et apparemment je n'entre même pas dans le while, je ne comprends vraiment pas pourquoi... :(
Pourtant j'ouvre bien le fichier plus haut : $users = fopen('../fichiers/users.ini', 'a+');, j'ai essayé de le refermer et de le rouvrir juste au niveau de cette partie mais rien à faire ça ne change pas

Re: Tableau à deux dimensions et foreach

par kny » 31 mai 2012, 16:03

Je ne peux réellement faire d'essai, cependant tu précises que le tableau est vide, donc cela vient des while.
Il faut donc vérifier quelles données tu récupères et que tu insères.

Autrement je remarque que dans ton code fonctionnel - mots de passe - le foreach comprends un $k != 6.
Or dans le problématique, un $k != 5...
Cela ne réécrira donc pas le code convenablement, puisque tu auras un ";" de trop ou de moins (normalement de trop si je ne me trompe pas)

Re: Tableau à deux dimensions et foreach

par Gloumii » 31 mai 2012, 15:49

Ah oui effectivement... Mon tableau est vide apparement sur cette page : array => empty.

Par contre sur ma page de modification du mail et mot de passe ça fonctionne quand je modifie le mot de passe, je donne le code de celle-ci au cas ou :
            <?php 
                $users = fopen('../fichiers/users.ini', 'a+');
                $array = Array(Array());

                if(isset($_POST['modifier'])) {

                    // Vérification de forme pour le nouvel email
                    if($_POST['newpseudo'] != NULL) {
                        // L'adresse mail est déjà utilisée?
                        while (($buffer = fgets($users)) !== false) {
                            $log = explode(';', $buffer);
                            if($log[0] == $_POST['newpseudo']) {
                                echo 'Cette adresse de messagerie est déjà utilisée.';
                                fclose($users);
                                exit();
                            }
                        }
                        // Vérification de la validité de l'e-mail
                        if(!filter_var($_POST['newpseudo'], FILTER_VALIDATE_EMAIL)) {
                            echo "Adresse mail invalide.";
                            exit();
                        }
                        $pseudo=TRUE;
                    }
                    else {
                        $pseudo=FALSE;
                    }

                    // Vérification pour le nouveau mot de passe
                    if($_POST['newmdp'] != NULL) {
                        if(empty($_POST['mdp3'])) {
                            echo "Veuillez remplir tous les champs mot de passe pour modifier celui-ci";
                            exit();
                        }

                        // Vérrification de la longueur minimum du mot de passe (le maximum étant déjà bloqué par la taille du champ)
                        if(strlen($_POST['newmdp'])<8) {
                            echo "Mot de passe trop court, choisissez un mot de passe comportant entre 8 et 16 caractères.";
                            exit();
                        }
                    
                        // Correspondance des mdp
                        if(strcmp($_POST['newmdp'], $_POST['mdp3'])!=0) {
                            echo "Les mots de passe ne correspondent pas.";
                            exit();
                        }
                        $mdp=TRUE;
                    }
                    else {
                        $mdp=FALSE;
                    }


                    $i = 0;
                    $j = 0;
                    while (($logs = fgets($users))) {
                        $explode = explode(';', $logs);

                        while ($j!=7) {

                            if($explode[0] == $_SESSION['pseudo']) {
                                if($pseudo == TRUE) {
                                    $explode[0] = $_POST['newpseudo'];
                                    $_SESSION['pseudo'] = $_POST['newpseudo'];
                                }
                                if($mdp == TRUE) {
                                    $explode[1] = md5($_POST['newmdp']);
                                }
                            }

                            $array[$i][$j] = $explode[$j];
                            $j++;
                        }
                        $i++;
                        $j=0;
                    }

                    var_dump($array);
//                    ftruncate($users, 0);
//
//                    foreach ($array as $j) {
//                        $k=0;
//                        foreach ($j as $key) {
//                            fputs($users, $key);
//                            if($k!=6) {
//                                fputs($users, ';');
//                            }
//                            $k++;
//                        }
//                    }
                }
            ?>
Et le var_dump retourne ceci quand je modifie uniquement le mot de passe :

Code : Tout sélectionner

array 0 => array 0 => string '[email protected]' (length=16) 1 => string '7682fe272099ea26efe39c890b33675b' (length=32) 2 => string '2.jpg' (length=5) 3 => string 'Pouet' (length=5) 4 => string 'F' (length=1) 5 => string '15/10/2000' (length=10) 6 => string '0 ' (length=3) 1 => array 0 => string '[email protected]' (length=13) 1 => string '9d1858e6dfaedd7cc436de74e0d5156f' (length=32) 2 => string '3.png' (length=5) 3 => string 'Li' (length=2) 4 => string 'Tux' (length=3) 5 => string '01/12/2011' (length=10) 6 => string '2 ' (length=3)