2010-10-05 15 views
5

Esto es un poco extraño para mí. PHP es mi fuerte, y normalmente puedo resolver cualquier problema que encuentre.PHP Función 'return' no regresa

Tengo un marco personalizado que he estado utilizando durante años. Me he encargado de reescribirlo, y estoy haciendo todo esencialmente igual que antes. El problema radica en que el siguiente ejemplo:

function ModPages_GetPage() { 
    $page = ModPages_GetPageByName($_GET['page_name']); 
    if($page != false) { 
     include(TPL_DIR.'pages/pages.view.php'); 
    } else { 
     ErrorMessage('Invalid Page', 'The selected page could not be found.'); 
    } 
} 


function ModPages_GetPageByName($page_name = null) { 
    $db = new Database; 
    $query = ' 
     SELECT * 
     FROM pages 
     WHERE page_name = "'.CleanStr($page_name).'" 
      AND page_enabled = "yes" 
     LIMIT 1 
     '; 
    $page = $db->GetRow($query); 

    return $page; 
} 

Este código está siendo llamado con 'casa' para el valor de $_GET['page_name']. La llamada a ModPages_GetPageByName() funciona bien, pero el valor de $page en ModPages_GetPage() no se está configurando. De hecho, cualquier declaración de depuración lanzada después de esa llamada no muestra nada.

Tengo display_errors establecido en on, y error_reporting establecido en E_ALL. Recibo un par de avisos de mi clase de Base de datos, pero eso es todo.

Al ejecutar la secuencia de comandos en un shell, no se producen errores. Cuando uso strace, veo que el proceso escupe un 'exit_group (255)'.

Éste me tiene bastante desconcertado. De seguro podría usar alguna dirección sobre esto.

+0

Parece que ha comprobado que, si 'var_dump ($ page)' justo antes 'devuelve $ page', ve el valor esperado (¿una matriz o algo más complicado?). ¿La clase 'Database' tiene un destructor que puede salir mal? – grossvogel

+0

¿Y realmente has probado ** la depuración **? Es decir. use Zend Debugger o xdebug, establezca un punto de interrupción y siga su código ... – wimvds

+0

Debería haber intentado por lo menos 'var_dump ($ page)' por el momento; ¿Cuál es la salida? – meagar

Respuesta

0

Si bien algunos de ustedes han puesto un esfuerzo extra en responder a esto, nadie ha podido ver la imagen completa, incluso teniendo en cuenta los detalles que he proporcionado. No he podido rastrear el problema hasta su origen, pero he pasado a otro proyecto.

+0

es una lástima, que no fue capaz de resolverlo. Acabo de encontrarme con un problema similar.:-( – aurora

+0

esto probablemente puede tener múltiples causas. Acabo de descubrir que mi problema estaba relacionado con un parámetro erróneo que proporcioné para el constructor de una extensión (mongodb). Todavía me pregunto por qué php acaba de morir con un exit_group (255) en lugar de informar un error – aurora

+0

Esta es una pregunta bastante antigua, pero tuve un problema similar. El problema era que PDO (supongo que está utilizando esto) accedía a una base de datos diferente fuera de la cuenta de usuario con la configuración localhost y aunque la consulta se ejecutó correctamente, se negó a devolver el resultado, incluso si devolvía una matriz asignada manualmente, no devolvía el resultado. La actualización de la configuración de una cuenta de usuario asociada a la cuenta solucionó el problema. Puede que esta no sea la el mismo problema, pero ciertamente suena como eso. –

0

ok antes de llegar a una solución, primero podemos asegurarnos de que antes de establecer la variable $ page, primero simplemente echo $_GET['page_name'] para ver si hay un valor que se está recibiendo.

PK

+1

que haría que la función GetPage sea recursiva, y esa función no toma ningún argumento ... –

+0

ok, revíselo ahora. Vamos a resolver esto juntos lol – Pavan

+0

Si no tiene una respuesta, solicite más información en comentarios, no en respuestas. Gracias. – deceze

1

yo creo que es la consulta, no debería usted acaba de devolver el nombre de la página en lugar de estrella? como una estrella (*) devolvería una matriz que probablemente se devuelve como el valor? solo mi conjetura.

$query = ' 
     SELECT * 
     FROM pages 
     WHERE page_name = "'.CleanStr($page_name).'" 
      AND page_enabled = "yes" 
     LIMIT 1 
     '; 

si lo hace un print_r en la vuelta la página $ yo creo que debe ser una matriz

$page = $db->GetRow($query); 
echo "Page:<pre>".print_r($page,true)."</pre><br />\n"; 

Entonces tal devolver algo como esto

return $page['page_name_field']; 
+0

El propósito de la función es devolver el registro completo desde la tabla de páginas. Después de ejecutar la consulta, la clase de Base de datos devuelve la página correctamente. Es la llamada a ModPages_GetPageByName() que no se devuelve correctamente. – Skudd

0

¿Tiene su parada guión adecuado después de su llamada a la base de datos, o simplemente no muestra ningún resultado?

Si el primero es verdadero, entonces parece un error fatal. Con E_ALL, se debe mostrar, ¿está seguro de que display_errors y error_reporting son como dice en ese punto, y que la función GetRow no los altera de ninguna manera? Si es así, tal vez haya algo en el registro de errores de Apache (los errores de PHP a veces se registran allí).

Si esto último es cierto, estoy pensando en una excepción lanzada en un método al que se llama y atrapado en una función de nivel superior. Para verificar esto, puede colocar la llamada a la base de datos (es decir, el punto donde las cosas van mal) dentro de un bloque try/catch y ver si llega al bloque catch.

+0

Si imprimo_r ($ página) antes de la devolución, todo está bien y funciona como se esperaba. Si imprimo_r ($ page) después de la llamada a ModPages_GetPageByName(), está vacío. – Skudd

+0

Una cosa viene a la mente: un método extendido. Compruebe si ModPages_GetPageByName no está definido en una clase extendida. –

+0

Para verificar con más precisión cómo fluye su código, realice una traza inversa después de la llamada a la función: 'debug_print_backtrace()' muestra exactamente qué funciones se han llamado/ejecutado. –

0

me gustaría probar siguiente:

  • sustituya $ _GET con $ _REQUEST (tal vez su forma está usando la POST?)
  • haga un print_r para verificar el contenido de sus variables.
  • use mysql_error para ver cualquier error, o imprima su consulta mysql en su navegador, cópiela/péguelo en phpmyadmin, ¿está devolviendo algo? error ... datos?
  • me sucedió algo similar, mi framework estaba codificado en ANSI y mi archivo php de llamada era UTF8 + BOM ... Cambié todo a UTF8 + BOM y funcionó.
  • intente también un navegador diferente, sé que podría no ser un problema del navegador, pero podría ser que su secuencia de comandos esté almacenada en algún lugar.
  • ¿Estás utilizando un poco de almacenamiento en caché? como eaccelerator?
+0

"La llamada a ModPages_GetPageByName() está funcionando bien, pero el valor de $ page en ModPages_GetPage() no se está configurando." - En todos los puntos en ModPages_GetPageByName() la función funciona correctamente. Solo después de la llamada a ModPages_GetPageByName() en ModPages_GetPage() hay un problema. – Skudd

0

¿Son esas funciones en una clase? Si es así, necesitará $ page = $ this-> ModPages_GetPageByName().

También me gustaría repetir el argumento y la declaración sql en ModPages_GetPageByName(). De esta forma puede verificar que no se trata de un error de SQL.

0

No puedo decir con certeza por qué su código no funciona, pero puedo hacer algunas sugerencias que pueden ayudar a localizar el error.

Lo primero que noto es que no verifica que $ db en realidad contenga una base de datos válida. No conozco los detalles de su objeto de base de datos pero supongo que hay algún mecanismo para verificar si está realmente conectado a la base de datos. Debe usar eso para determinar si la base de datos está conectada antes de ejecutar consultas en ella.

$db = new Database(); 
if ($db -> isConnected()) 
{ 
    $query = 'SELECT * (etc etc etc)'; 
    // ... 
} 
else 
{ 
    // Put some kind of DB connection error notification or throw an exception here 
} 

Sólo en una nota de estilo, no es necesario para almacenar los resultados de la consulta de base de datos antes de devolverlo, a menos que usted está planeando en hacer algún tipo de procesamiento en el resultado antes de devolverlo. Puede devolver la búsqueda directamente. Por supuesto, eso es sólo una elección estilística, pero guarda una línea o dos :)

return ($db->GetRow($query)); 

Después de ejecutar su función getPage, recomiendo encarecidamente var_dump() ing el resultado. Incluso si su función devuelve NULL, aún verá esto en var_dump. En caso de duda, colóquelo :). También recomendaría instalar xdebug para hacer que la salida var_dump sea más legible.

$page = ModPages_GetPageByName($_GET['page_name']); 
var_dump ($page); 

También me gustaría recomendar encarecidamente var_dumping la consulta antes de ejecutar sólo para hacer absolutamente seguro de que se está ejecutando la consulta que piensa que se está ejecutando. Copie y pegue la consulta de salida en sqlyog o phpmyadmin o lo que sea que use para el acceso interactivo a su base de datos y asegúrese de que devuelve lo que cree que debería devolver.

Otras cosas para comprobar, ¿la página que intentas devolver establece realmente page_enabled = 'yes'? ¿La columna page_enabled en realidad almacena el valor como 'sí', o es un bool o un número entero o algo más? ¿Las comillas mágicas están habilitadas o deshabilitadas? Si están en un estado cuando crees que están en el otro, pueden causar confusión. ¿Se están informando los errores al navegador? Agregue una línea en la parte superior de su script que garantice su falla solo para asegurarse, como un intento de alcance en un entero. Si no ve un error, tal vez los informes de errores no estén configurados correctamente. Sé que esas son preguntas obvias, pero también sé cuán fácil es pasar por alto lo obvio si no se obtiene lo que se espera de una consulta.

0

¿Está seguro de que $ page no está configurado, o es solo que sus instrucciones de depuración no imprimen nada? Intente iniciar sesión en un archivo o una base de datos; tal vez su código activó el buffer de salida o algo así.

Además, llama a ModPages_GetPageByName antes de declararlo. Por lo general, está bien, pero podría no serlo en circunstancias especiales (por ejemplo, cuando el código está envuelto en un bloque if). Intenta intercambiar los dos.

Además, verifique su entorno y desactive el caché del código de operación y otras posibles fuentes de error. APC, por ejemplo, puede llamar a la versión anterior del script mucho después de que haya cambiado el archivo PHP.

Cuestiones relacionadas