2010-11-16 19 views
5

J'essaie d'exécuter du code à partir d'un book. Il semble y avoir un problème avec le code.Message d'erreur: Erreur fatale: Impossible d'utiliser la fonction return> valeur dans le contexte d'écriture dans

Voici le message d'erreur:

Fatal error: Can't use function return value in write context in /Applications/MAMP/htdocs/Eclipse-Workspace/simpleblog/test.php on line 24

Voici le code référencé dans le message (à partir de la ligne 24)

if (!empty(trim($_POST['username'])) 
     && !empty(trim($_POST['email']))) { 
     // Store escaped $_POST values in variables 
      $uname = htmlentities($_POST['username']); 
      $email = htmlentities($_POST['email']); 

      $_SESSION['username'] = $uname; 

      echo "Thanks for registering! <br />", 
       "Username: $uname <br />", 
       "Email: $email <br />"; 
     } 

Je vous serais reconnaissant toute aide. S'il vous plaît laissez-moi savoir si je dois fournir plus d'informations


Merci beaucoup les gars. C'était très rapide. La solution fonctionne très bien.

Le problème est que la fonction empty() doit être appliquée uniquement aux variables directes.

Pour référence future: Le code est de PHP pour les débutants absolus »par Jason Lengstorf (2009), pages 90-91, chapitre 3, $ _SESSION

code corrigé:

//new - Created a variable that can be passed to the empty() function 
    $trimusername = trim($_POST['username']); 

    //modified - applying the empty function correctly to the new variable 
    if (!empty($trimusername) 
    && !empty($trimusername)) { 

    // Store escaped $_POST values in variables 
    $uname = htmlentities($_POST['username']); 
    $email = htmlentities($_POST['email']); 

    $_SESSION['username'] = $uname; 

    echo "Thanks for registering! <br />", 
     "Username: $uname <br />", 
     "Email: $email <br />"; 
} 

Répondre

6

en bref: la fonction empty() ne fonctionne que directement sur les variables

<?php 
empty($foo); // ok 
empty(trim($foo)); // not ok 

je dirais que, pour le cours d'obtenir plus loin avec ce livre, il suffit d'utiliser un Variable temporaire

donc changer:

if (!empty(trim($_POST['username'])) 

à

$username = trim($_POST['username']); 
if(!empty($username)) { 
    //.... 
+0

Merci beaucoup. Cela marche. J'ai mis à jour la question avec le code corrigé au cas où quelqu'un d'autre utilise ce livre et se heurte au problème. – ntc

+1

Merci beaucoup d'avoir posé et répondu à cette question avec le code corrigé. Je suis nouveau à PHP et à la programmation, et quand je rencontre une faute de frappe dans le livre, je pense toujours que c'est juste moi qui ne l'obtiens pas. C'est un tel soulagement de mettre les bonnes choses dedans et de voir ça fonctionner! –

+0

Je pense qu'il devrait être noté, que ce comportement affecte seulement les versions de PHP <5.5 comme indiqué à [php.function.empty] (http://php.net/manual/en/function.empty.php) –

3

Exactement votre exemple est mentionné au manuel

Note:

empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).

Utiliser une variable temporaire, ou tout simplement essai contre « vide chaîne "

if (trim($foo) !== '') { 
    // Your code 
} 
+0

Merci Sebastian . Y at-il un moyen que j'aurais pu déduire du message d'erreur que le problème était avec cette fonction? Je ne suis pas très doué pour les comprendre à ce stade. – ntc

+0

Certaines méthodes prennent des paramètres comme référence et n'acceptent donc que des variables, car elles sont les seules qui peuvent être passées en référence. "passer par référence" signifie généralement que la fonction * peut-être * veut écrire dans cette variable (ce qui affecte aussi la valeur de la variable en dehors de la fonction). Et c'est ce que le message essaie de dire: "empty" (pourquoi) ne peut pas écrire sur la valeur de retour d'une fonction, juste sur des variables. – KingCrunch