IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[typage faible] Fatal error: [] operator not supported for strings [PHP 4]


Sujet :

Langage PHP

  1. #1
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut [typage faible] Fatal error: [] operator not supported for strings
    Bonjour,

    Un petit problème de typage qui m'a empêché de finir un test pratique d'examen de recrutement...

    J'aimerai bien comprendre après coup ^^

    J'ai une fonction que voici :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    	/**
    	 * Fonction de mise à jour d'uun tableau
    	 *
    	 * @param $array		Tableau passé en paramètre
    	 * @param $operation	La saisie utilisateur
    	 *
    	 * @return $newArray 		Le tableau mis à jour
    	**/
    	function majArray($array, $operation){
     
    		$newArray = array();
    		$newArray = $array;
    		$newArray[] = $operation;
     
    		// Debug
    		print_r($newArray);
     
    		return $newArray;
    	}

    Qui me retourne cette erreur
    Fatal error: [] operator not supported for strings
    Le fait étant que je souhaiterai mettre à jour un tableau à partir d'un autre, $operation étant une chaîne de type

    [operateur][espace]*[valeurNumérique]*

    en gros,
    +12
    - 25
    /4
    Sont des valeurs acceptées.


    $array reçu en paramètre contient des valeurs comme la liste de ma citation.

  2. #2
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Pour précision, de base la fonction ne faisait qu'un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $array[] = $operation;
    puis me retournait le résultat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (array)$array[] = $operation;
    ne fonctionne pas mieux

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 76
    Points
    76
    Par défaut
    hello!

    moi je dis $array est simplement un string! et l operation [] sur un string marche pas!

    c'est pas parce que ca s'appel $array que s'en est un^^


    j'suis sure!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $newArray = array();
    $newArray = $array;// en gros la ligne d'avant sert a rien $newArray devient simplement exactement la meme variable que $array donc $newArray est un string
    $newArray[] = $operation;// [] sur un string ca fonctionne pas

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    Je teste ceci et n'ai pas d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
        /**
         * Fonction de mise à jour d'uun tableau
         *
         * @param $array		Tableau passé en paramètre
         * @param $operation	La saisie utilisateur
         *
         * @return $newArray 		Le tableau mis à jour
        **/
        function majArray($array, $operation){
     
            newArray = array(); // Cette ligne ne sert à rien
            $newArray = $array; // On pourrait simplifier les choses
            $newArray[] = $operation;
     
            // Debug
            print_r($newArray);
     
            return $newArray;
        }
     
        $a = array( ) ;
        $a = majArray($a, '+ 3') ;
        $a = majArray($a, '/ 2') ;
        $a = majArray($a, '* 4') ;
    ?>
    Pourrais-tu fournir le script produisant le msg d'erreur ?

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par lunarnet76 Voir le message
    moi je dis $array est simplement un string! et l operation [] sur un string marche pas!
    Ouaip, c'est sûrement ça

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 76
    Points
    76
    Par défaut
    j'ai tester c'etait bien ca l'erreur ^^ si tu passe un string a la place d'un array pour la variable $array

  7. #7
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Je sais pourquoi ça ne marche pas mais je ne sais pas comment le résoudre

    Mais bon, qu'on ne dise pas qu'un String n'est pas un tableau xD

    C'est un tableau de caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $array = "foobar";
     
    echo $array[0]; // retournes "f" sur le flux standard
    Et oui...
    le fait d'affecter $opération à $array supprime le typage en array() comme le montre mes exemples >.<

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    Je sais pourquoi ça ne marche pas mais je ne sais pas comment le résoudre
    Et bien il ne faut pas utiliser une chaîne de caractères comme un tableau !

    Mais bon, qu'on ne dise pas qu'un String n'est pas un tableau xD
    Pas en PHP

    C'est un tableau de caractères
    Non, on ne fait pas du C là

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $array = "foobar";
     
    echo $array[0]; // retournes "f" sur le flux standard
    Oui, comme indiqué dans la doc. Par contre [] (sans indice/clef entres les crochets) sert à empîler un élément à un tableau, pas à effectuer une quelconque manip' sur une chaîne.

    le fait d'affecter $opération à $array supprime le typage en array() comme le montre mes exemples >.<
    Grâce au typage faible de PHP tu écrases la tableau avec une chaîne, d'autres langages provoqueraient une erreur.

  9. #9
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Je teste ceci et n'ai pas d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?php
        /**
         * Fonction de mise à jour d'uun tableau
         *
         * @param $array		Tableau passé en paramètre
         * @param $operation	La saisie utilisateur
         *
         * @return $newArray 		Le tableau mis à jour
        **/
        function majArray($array, $operation){
     
            newArray = array(); // Cette ligne ne sert à rien
            $newArray = $array; // On pourrait simplifier les choses
            $newArray[] = $operation;
     
            // Debug
            print_r($newArray);
     
            return $newArray;
        }
     
        $a = array( ) ;
        $a = majArray($a, '+ 3') ;
        $a = majArray($a, '/ 2') ;
        $a = majArray($a, '* 4') ;
    ?>
    Pourrais-tu fournir le script produisant le msg d'erreur ?
    O.o

    Ce code devrait te retourner une erreur dans l'état.

    Tu as "newArray" au lieu de "$newArray" ce qui provoque un parse error

    Un exemple ?
    Le voici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <?php
     
    	/**
    	 * Fonction de mise à jour d'un tableau
    	 *
    	 * @param $array		Tableau passé en paramètre
    	 * @param $operation	La saisie utilisateur
    	 *
    	 * @return $array 		Le tableau mis à jour
    	**/
    	function majArray($array, $operation){
    		// Ajout de la valeur saisie par l'utilisateur
    		(array)$array[] = $operation;
     
    		// Debug
    		print_r($array);
     
    		return $array;
    	}
     
    	// On met à jour le tableau pour affichage
    	$array = majArray(@$_GET['tableauOperation'], @$_GET['valeur']);
    ?>
     
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    	<head>
    		<title>
    			Test
    		</title>
    	</head>
    	<body>
    		<form method = "GET" action = "#" <!-- Début du formulaire -->
    			<input type = "text" name = "valeur" value="" />
    			<input type = "submit" value="Envoyer" />	
    			<input type = "hidden" name = "resultat" value = "<?php echo $resultat; ?>" />
    			<input type = "hidden" name = "tableauOperation" value = "<?php echo $array; ?>" />
    		</form> <!-- Fin du formulaire -->
    	</body>
    </html>

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 71
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    O.o
    Tu as "newArray" au lieu de "$newArray" ce qui provoque un parse error
    c'est juste un mauvais copier coller^^

    Mais c'est une solution militaire la tienne lol, on pulvérise la variable^^

  11. #11
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Hum...

    Disons que puisque la logique ne me permettait pas de réussir (enfin ma logique), j'ai essayé un peu tout ce qui me passait sur la tête même si je doutais forcément des chances de réussite quant au résultat que j'obtiendrais...

  12. #12
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par Deallyra Voir le message
    Ce code devrait te retourner une erreur dans l'état.

    Tu as "newArray" au lieu de "$newArray" ce qui provoque un parse error
    Oui effectivement, j'ai un $ qui a sauté lorsque j'ai supprimé les tabulations, sorry.

  13. #13
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    Franchement, je n'arrive pas à trouver comment faire...

    J'ai plusieurs solutions qui me permettrait d'avoir quelque chose de correct...

    Par exemple, écrire dans un fichier plutôt qu'un array() ou alors utiliser une superglobale $_SESSION pour avoir la persistance...

    Mais pour l'application que j'avais à faire en deux heures et son utilité, utiliser une session...

    Et puis m'amuser avec un fichier et les coûts de lecture écriture...

    Il doit y avoir une solution simple pourtant.

  14. #14
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    Sûrement, mais nous ne pourrons pas t'aider efficacement tant que nous ne connaîtrons pas l'objet du projet

  15. #15
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Salut,

    je ne peux qu'être d'accord avec ce qui a déjà été dit : en PHP, l'opérateur [] ne s'applique pas aux chaînes.

    En fait, c'est un problème d'absence de sérialisation/désérialisation : tu stockes ton tableau entre deux requêtes HTTP dans un champ de formulaire de type hidden, or il est stocké sous forme de chaîne et c'est comme cela qu'il est remonté dans $_GET, d'où l'erreur. La meilleure solution est donc de passer par une session. Ca reste plus performant qu'un stockage en base de données, plus fiable qu'un enregistrement sur fichier (tous les utilisateurs partagent le même fichier ?) et plus sûr qu'un stockage en champ hidden ou en cookie (qui peuvent être bidouillés côté client).

    Les sessions sont la réponse principale à tous les problèmes posés par le fait que HTTP est un protocole sans état, il ne faut jamais hésiter à les utiliser quand c'est nécessaire.

  16. #16
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    hum...
    Je voulais éviter les sessions T_T


    Tant pis ^^

    Merci à tous pour votre participation

  17. #17
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    Tu peux peut-être les éviter, mais comme on ne connaît toujours pas l'objet du projet

  18. #18
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    hum...

    Réaliser une calculatrice standard.

    Et donc j'enregistre les saisies.

  19. #19
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 255
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 255
    Points : 8 548
    Points
    8 548
    Billets dans le blog
    17
    Par défaut
    OK, tu as donc peu de données et peux effectivement éviter les sessions en passant par un champ HIDDEN. Par contre l'utilisateur doit rester sagement sur sa page.

  20. #20
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Points : 1 769
    Points
    1 769
    Par défaut
    oui mais non ^^

    Je ne peux pas dans le sens où je dois valider la saisie utilisateur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. fatal error : [] operator not supported for strings
    Par abdelkarim_1987 dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2013, 10h48
  2. Réponses: 3
    Dernier message: 17/11/2009, 12h59
  3. [Wamp] Fatal error: [] operator not supported for strings
    Par shubb83 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 30/08/2007, 16h30
  4. Réponses: 2
    Dernier message: 08/06/2006, 10h43
  5. Réponses: 4
    Dernier message: 22/04/2006, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo