2010-11-16 7 views
5

Estoy intentando ejecutar algún código de book. Parece que hay un problema con el código.Mensaje de error: Error fatal: No se puede usar el valor de retorno de función en el contexto de escritura en

Aquí es el mensaje de error:

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

Aquí es el código de referencia en el mensaje (que comienza en la línea 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 />"; 
     } 

Agradecería cualquier ayuda. Por favor, hágamelo saber si necesito proporcionar más información


Muchas gracias chicos. Eso fue muy rápido. La solución funciona genial

El problema es que la función empty() debe aplicarse solo a las variables directas.

Para futuras consultas: El código es de 'PHP para principiantes absolutos' por Jason Lengstorf (2009), páginas 90-91, Capítulo 3, $ _SESSION

código corregido:

//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 />"; 
} 

Respuesta

6

en resumen: la función empty() sólo funciona directamente sobre las variables

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

yo diría que, en el curso de conseguir más con ese libro, sólo tiene que utilizar una variable temporal

por lo cambia:

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

a

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

Muchas gracias. Esto funciona. He actualizado la pregunta con el código corregido en caso de que alguien más esté usando este libro y se encuentre con el problema. – ntc

+1

Muchas gracias por preguntar y responder a esta pregunta con el código corregido. Soy nuevo en PHP y en la programación, y cuando me encuentro con un error tipográfico en el libro, casi siempre me imagino que es solo que no lo estoy obteniendo. ¡Es un alivio poner lo correcto y ver cómo funciona! –

+0

Creo que debe tenerse en cuenta, que este comportamiento solo afecta a las versiones de PHP <5.5 como se indica en [php.function.empty] (http://php.net/manual/en/function.empty.php) –

3

Exactamente tu ejemplo se menciona en el manual de

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)).

Usar una variable temporal, o la prueba sólo contra "vacía string "

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

Gracias Sebastian . ¿Hay alguna manera que podría haber inferido del mensaje de error que el problema fue con esta función? No soy muy bueno en entenderlos en este punto. – ntc

+0

Algunos métodos toman como referencia los parámetros y, por lo tanto, solo aceptan variables, porque son los únicos, que se pueden pasar como referencia. "pasar por referencia" generalmente significa que la función * quizás * desea escribir en esta variable (que también afecta el valor de la variable fuera de la función). Y eso es, lo que el mensaje trata de decir: "vacío" (whyever) no puede escribir en el valor de retorno de una función, solo para variables. – KingCrunch

Cuestiones relacionadas