entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Call to undefined function

Hola, me estoy volviendo loco con un error que me da PHP, es el siguiente:

2016/08/09 11:15:58 [error] 26052#0: *17 FastCGI sent in stderr: "PHP message: PHP Fatal error: Call to undefined function textos() in /srv/www/arbol/contenido.php on line 3" while reading response header from upstream, client: 195.16.143.6, server: XXXXXXX, request: "GET /contenido.php?opcion=contenido HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm/arbol.sock:", host: "XXXXXXX", referrer: "http://XXXXXXX/"

La función se encuentra en un archivo php donde se encuentran todas las funciones:

function textos($titulo)
    {
        global $conexion;
        $st = $conexion->prepare('select * from textos where titulo = :titulo');
        $st->execute(array(':titulo' => $titulo));  
        $result = $st->fetch(PDO::FETCH_ASSOC); 

        return $result;
    }

En el index.php en el head con un include se añade el archivo, pero a la función se le llama desde otro archivo php con include dentro del section y se llama a la función de la siguiente manera:

$result = textos($titulo);  

Pero según el error de PHP la función no esta definida ¿Donde esta el problema?

2votos

bichomen comentado

¿Nadie me puede ayudar con esto?

1voto

magarzon comentado

Hola, por los comentarios que has hecho antes, en el index.php te funciona, pero no te funciona cuando llamas por ajax. ¿A qué URL llamas cuando llamas por ajax? Porque si estás llamando a contenido.php, este php no hace include de funciones.php, y de nada te sirve que la página (creada por index.php) lo haya incluido, la llamada ajax es completamente independiente de la llamada a index.php para crear la página.

Si es así el caso, deberías hacer el include en contenido.php

1voto

bichomen comentado

Hola he probado lo que comentas y al incluir el include en funciones.php al estar ya en el index.php no cargaba directamente contenido.php, supongo por la duplicidad de la función he deshabilitado en index.php el include de funciones.php y entonces contenido.php carga bien, pero siguen sin funcionar los enlaces dando el error 500, también he probado a poner directamente la función en contenido.php y el resultado es el mismo.

2votos

magarzon comentado

  1. Si la función es requerida, utiliza require, porque es posible que no esté encontrando por alguna razón el funciones.php, e include solo da un warning si no lo encuentra. Si tienes problemas con duplicidades, utiliza include_once o require_once
  2. Vuelvo a mi pregunta anterior: ¿A qué php estás llamando desde AJAX? Porque si estás llamando a contenido.php, deshabilitar algo en index.php no sirve de nada

1voto

bichomen comentado

Vuelvo a mi pregunta anterior: ¿A qué php estás llamando desde AJAX? Porque si estás llamando a contenido.php, deshabilitar algo en index.php no sirve de nada

Cada enlace llama a un php diferente, pero uno de ellos llama a contenido.php

Luego en la estructura HTML en la etiqueta "section" tiene la clase section, que es donde AJAX carga los diferentes PHP, contenido.php es el PHP que see muestra por defecto nada más abrir la página.

$(".section").html(data);

Lo explico más abajo.

Este código en otra web que tengo en el mismo servidor funciona, pero aquí no y por el error que da creo que es un problema más relacionado con la configuración NGINX o PHP5-FPM del sitio, pero no estoy seguro, ojala sea un problema de programación.

Con require_once no me da problema de duplicidades pero continua sin funcionar.

2 Respuestas

2votos

bichomen Puntos2770

¡¡¡SOLUCIONADO!!!, uuff al final la solución a sido más sencilla de lo que parecía pero a mi me ha llevado días encontrar el problema.

Tenía un cacao mental porque no sabía si el problema estaba en la programación o en la configuración del servidor, todo apuntaba a este ultimo, pueeeess no, lo que pasaba es que la conexión con la base datos nunca se llegaba a producir, o la metias en la página o no llegaba, pero lo solucione de la siguiente manera, en el archivo funciones, cree una funcion que es la conexión con la base de datos, hasta ahora la tenía separara en otro archivo y sin estar en una función. Una vez creada la función y guardada en funciones.php era tan fácil como hacer esto:

require_once('funciones.php');
$conexion = conexion();

luego dependiendo de la función si es prepare, ahí que incluir $conexion = conexion(); dentro de la función, no vale con invocarla en la página hay que meterla dentro de la función. Y aquí viene el otro problema indirecto que tenía, se ves que en PDO las consultas a las que se les pasa variables, hay que prepararlas con prepare(); pero a las consultas limpias, es decir que no se les pasa argumentos, sino que se invocan directamente se ha de utilizar el método query();

Posiblemente no me halla explicado muy bien, pero quien quiera indagar en el asunto que me consulte, esto me ha llevado días porque los errores que daba apuntaban hacía otras cuestiones.

Saludos y gracias

1voto

Peter comentado

Gracias por compartir la solución!

3votos

angelAparicio Puntos2810

Hola, por el error la llamada a textos($titulo) la haces en la línea 3. ¿Donde tienes el include? Debería estar antes de la llamada.

1voto

bichomen comentado

No, la linea 3 del archivo desde el que llamo a la función, es la siguiente:

contenido.php:

1 <?php
2 $titulo = "historia";
3 $result = textos($titulo);
4 ?> 

y en el index.php:

<html>
<head>
<?php
include("conexion.php");
include("funciones.php") <---- Archivo donde se encuentran las funciones
?>
</head>
<body>
<section>
<?php include("contenido.php"); ?> <------ Archivo que llama a la función.
...

3votos

angelAparicio comentado

¿Pero como estás haciendo la llamada desde el navegador? El código de error que has indicado dice:
request: "GET /contenido.php?opcion=contenido HTTP/1.1

Es decir, que estás llamando directamente a contenido.php

Y tal y como tienes el código, te funcionará si llamas a:
http://tuservidor.com/index.php

Pero dará error si llamas a:
http://tuservidor.com/contenido.php

1voto

bichomen comentado

Si, si se accede desde el index.php carga bien el contenido.php, pero cuando se carga desde un menú que hay en la web es cuando da el error 500 error interno del servidor y mirando los logs del servidor encuentro el error que pongo arriba, la forma de llamar a los enlaces es mediante jquery, pongo el código:

$(document).ready(function() {
        $("body").on("click", "a", function(event) {

            event.preventDefault();

            alert($(this,"a").prop("href"));

            $.ajax({
                url: $(this,"a").prop("href"),                  
            })
            .done(function(data) {
                    $(".section").html(data);                       
            })
            .fail(function(jqXHR, textStatus, errorThrown) {
            if(jqXHR.status === 0) {
                alert('Not connect: Verify Network.');

              } else if(jqXHR.status == 404) {

                alert('Requested page not found [404]');

              } else if(jqXHR.status == 500) {

                alert('Internal Server Error [500].');

              } else if(textStatus === 'parsererror') {

                alert('Requested JSON parse failed.');

              } else if(textStatus === 'timeout') {

                alert('Time out error.');

              } else if(textStatus === 'abort') {

                alert('Ajax request aborted.');

              } else {

                alert('Uncaught Error: ' + jqXHR.responseText);         
              }
          })
          .always(function(result) {
            alert( "complete" );
          });
        }); 
    });

La linea

$(".section").html(data);

el .section es una classe de section --->> <section class="section"> Para indicarle donde a de cargar la página, el jquery esta bien porque funciona con páginas normales, es cuando cargo php donde viene el problema.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta