Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] consulta a bbdd no funciona en función

Estas en el tema de consulta a bbdd no funciona en función en el foro de PHP en Foros del Web. hola buenas a todos, os comento mi problema. estoy realizando una función para saber los días festivos, el fncionamiento es sencillo: se consideran días festivos ...
  #1 (permalink)  
Antiguo 05/12/2013, 11:14
 
Fecha de Ingreso: noviembre-2012
Mensajes: 65
Antigüedad: 11 años, 5 meses
Puntos: 2
consulta a bbdd no funciona en función

hola buenas a todos, os comento mi problema. estoy realizando una función para saber los días festivos, el fncionamiento es sencillo: se consideran días festivos tanto los sábado y domingos cómo los días insertados en una bbdd como festivos.

El problema es que al realizar la consulta a la bbdd dentro de la función me salta el error, no así si la ejecuto directamente en el script, os pongo el ejemplo:

Código PHP:
<?php
$fechasiguiente
="2013-12-07";

$consulta2 "SELECT COUNT(*) FROM $dbDb.festivos WHERE dia='$fechasiguiente'";
    
$result2 $db->prepare($consulta2);
    
$result2->execute();
    
    if(
$result2->fetchColumn()==0){
        echo 
"no es festivo";
    }else{
        echo 
"FIESTA!!";
    }
?>
Este código me funciona bien, pero si hago esto otro:

Código PHP:
<?php
//conexion a bbdd
    
require_once "../bbdd/conecta.php";
    
$db conectaDb();

$fechasiguiente="2013-12-04";
    
    
// función para comprobar días no lectivos
    
$probando comprobarDia($fechasiguiente);

function 
comprobarDia($fecha){
        
        
//se obtiene el dia de la emana
        
$diasemana date(lstrtotime($fecha));
        echo 
$diasemana; echo $fecha;
        
        
//si es fin de semana, directamente es no lectivo
        
if($diasemana=="Saturday" || $diasemana=="Saturday"){
            
$comprueba=" no lectivo ";
            return 
$comprueba;
            
        
//si no es fin de semana, debemos comprobar que no se encuentre en la lista de día de fiesta
        
}else{
            
$consulta "SELECT COUNT(*) FROM $dbDb.festivos WHERE dia='$fecha'";
            
$result $db->prepare($consulta);
            
$result->execute();
            if(
$result->fetchColumn()>=1){
                
$comprueba="nolectivo";
            }
            else{
                
$comprueba="lectivo";
            }
            
            return 
$comprueba;
        }
        return 
$comprueba;
    }
?>
me salta el siguiente error en WAMP

Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\proyecto\php\nolectivos.php on line 39
  #2 (permalink)  
Antiguo 05/12/2013, 11:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: consulta a bbdd no funciona en función

La variable $db no está al alcance dentro de la función, ese es el principal problema, no estás respetando el contexto de dicha variable.

Así que, o declaras dicha variable dentro de la función, o la pasas como argumento, ambas formas deben funcionar.

Lee el siguiente manual: http://www.php.net/manual/es/functions.user-defined.php
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 05/12/2013, 11:40
 
Fecha de Ingreso: noviembre-2012
Mensajes: 65
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: consulta a bbdd no funciona en función

Cita:
Iniciado por pateketrueke Ver Mensaje
La variable $db no está al alcance dentro de la función, ese es el principal problema, no estás respetando el contexto de dicha variable.

Así que, o declaras dicha variable dentro de la función, o la pasas como argumento, ambas formas deben funcionar.

Lee el siguiente manual: [url]http://www.php.net/manual/es/functions.user-defined.php[/url]
He probado esto, pero sigue fallando:

Código PHP:
function comprobarDia($fecha){
        require_once 
"../bbdd/conecta.php";
        
$db conectaDb();
        
//se obtiene el dia de la emana
        
$diasemana date(lstrtotime($fecha));
        echo 
$diasemana; echo $fecha;
        
        
//si es fin de semana, directamente es no lectivo
        
if($diasemana=="Saturday" || $diasemana=="Saturday"){
            
$comprueba=" no lectivo ";
            return 
$comprueba;
            
        
//si no es fin de semana, debemos comprobar que no se encuentre en la lista de día de fiesta
        
}else{
            
$consulta "SELECT COUNT(*) FROM $dbDb.festivos WHERE dia='$fecha'";
            
$result $db->prepare($consulta);
            
$result->execute();
            if(
$result->fetchColumn()>=1){
                
$comprueba="nolectivo";
            }
            else{
                
$comprueba="lectivo";
            }
            
            return 
$comprueba;
        }
        return 
$comprueba;
    } 
puedes decirme como o donde lo coloco? gracias
  #4 (permalink)  
Antiguo 05/12/2013, 11:46
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: consulta a bbdd no funciona en función

¿Sigue fallando qué?

Por favor, se más inteligente y cada que hagas un cambio y recibas un error comparte dicho mensaje de error, de otra forma te tenemos que ir preguntando paso a paso.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 05/12/2013, 11:49
 
Fecha de Ingreso: noviembre-2012
Mensajes: 65
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: consulta a bbdd no funciona en función

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Sigue fallando qué?

Por favor, se más inteligente y cada que hagas un cambio y recibas un error comparte dicho mensaje de error, de otra forma te tenemos que ir preguntando paso a paso.
Fatal error: Call to a member function prepare() on a non-object in C:\wamp\www\proyecto\php\nolectivos.php on line 40... no se si me estoy dejando algo atrás o que.. pero no me doy cuenta de qué
  #6 (permalink)  
Antiguo 05/12/2013, 12:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: consulta a bbdd no funciona en función

¿Y qué es exactamente la variable $db para saber?

Digo, puedes ayudarnos a ayudarte si aprendes a depurar tu código, de otra forma es casi como ir adivinando.

Código PHP:
Ver original
  1. require_once "../bbdd/conecta.php";
  2. $db = conectaDb();
  3.  
  4. var_dump($db);

¿Eso qué arroja?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 05/12/2013, 12:20
 
Fecha de Ingreso: noviembre-2012
Mensajes: 65
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: consulta a bbdd no funciona en función

Cita:
Iniciado por pateketrueke Ver Mensaje
¿Y qué es exactamente la variable $db para saber?

Digo, puedes ayudarnos a ayudarte si aprendes a depurar tu código, de otra forma es casi como ir adivinando.

Código PHP:
Ver original
  1. require_once "../bbdd/conecta.php";
  2. $db = conectaDb();
  3.  
  4. var_dump($db);

¿Eso qué arroja?
Eso me dvuelve null, el fichero para conectar a bbdd es este:

Código PHP:
<?php
// FUNCI�N DE CONEXI�N CON LA BASE DE DATOS MYSQL
/*function conectaDb()
{
    try {
        $db = new PDO("mysql:host=localhost", "root", "");
        $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, TRUE);
        return($db);
    } catch (PDOException $e) {
        print "<h1>Error: No puede conectarse con la base de datos.</h1>\n";
        exit();
    }
}*/

// FUNCI�N DE CONEXI�N CON LA BASE DE DATOS MYSQL O CON SQLITE

define ("MYSQL",  "MySQL");
define ("SQLITE""SQLite");
$dbMotor MYSQL;                                // Base de datos empleada
if ($dbMotor == MYSQL) {


    
//Conexion para BBDD en servidor local
    
    
define("MYSQL_HOST""mysql:host=localhost"); // Nombre de host MYSQL
    
define("MYSQL_USUARIO""root");              // Nombre de usuario de MySQL 
    
define("MYSQL_PASSWORD""xxxxxx");                 // Contrase�a de usuario de MySQL
    
$dbDb    "nfc";                                     // Nombre de la base de datos
    
$dbTabla $dbDb ".usuarios";                  // Nombre de la tabla
    
} elseif ($dbMotor == SQLITE) {
    
$dbDb    "/tmp/mclibre_baseDeDatos.sqlite"// Nombre de la base de datos
    
$dbTabla "tabla";                           // Nombre de la tabla
}

function 
conectaDb()
{
    global 
$dbMotor$dbDb;
    
    try {
        if (
$dbMotor == MYSQL) {
            
$db = new PDO(MYSQL_HOSTMYSQL_USUARIOMYSQL_PASSWORD);
            
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERYTRUE);
        } elseif (
$dbMotor == SQLITE) {
            
$db = new PDO("sqlite:" $dbDb);
        }
        return(
$db);
    } catch (
PDOException $e) {
        print 
"<p>Error: No puede conectarse con la base de datos.</p>\n";
    }
}
?>
  #8 (permalink)  
Antiguo 05/12/2013, 12:29
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: consulta a bbdd no funciona en función

Si te devuelve null, entonces, de entrada tu conexión está mal, así que primero debes corregir eso.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 05/12/2013, 12:34
 
Fecha de Ingreso: noviembre-2012
Mensajes: 65
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: consulta a bbdd no funciona en función

Cita:
Iniciado por pateketrueke Ver Mensaje
Si te devuelve null, entonces, de entrada tu conexión está mal, así que primero debes corregir eso.
Si pero me falla dentro de la función... lo que no se es como hacer para que eso funcione dentro de la función ya que fuera va perfectamente.
  #10 (permalink)  
Antiguo 05/12/2013, 12:46
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: consulta a bbdd no funciona en función

¿Has intentado pasar dicha variable como argumento?

Que dicha variable deba estar al alcance dentro de la función no implica que debas mover todo el código dentro de la función.

Apuesto a que ni siquiera has consultado un manual.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 05/12/2013, 20:14
 
Fecha de Ingreso: noviembre-2012
Mensajes: 65
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: consulta a bbdd no funciona en función

Cita:
Iniciado por pateketrueke Ver Mensaje
Si te devuelve null, entonces, de entrada tu conexión está mal, así que primero debes corregir eso.
Cita:
Iniciado por pateketrueke Ver Mensaje
¿Has intentado pasar dicha variable como argumento?

Que dicha variable deba estar al alcance dentro de la función no implica que debas mover todo el código dentro de la función.

Apuesto a que ni siquiera has consultado un manual.
Muchísimas gracias, pasándolo como variable si me funciona bien, siento mi error con el tema de funciones llevo tiempo sin tener que usarlas y la verdad es que he perdido facultades jajaja, este es el código definitivo, sólo queda adaptarlo correctamente a mi aplicación:

Código PHP:
<?php
    
//conexion a bbdd
    
require_once "../bbdd/conecta.php";
    
$db conectaDb();
    
    
$fechasiguiente="2013-12-06";
    
    
// función para comprobar días no lectivos
    
$probando comprobarDia($fechasiguiente$db);
    
    echo 
$probando;
    
    function 
comprobarDia($fecha$db){
        
//se obtiene el dia de la emana
        
$diasemana date(lstrtotime($fecha));
        echo 
$diasemana; echo $fecha;
        
        
//si es fin de semana, directamente es no lectivo
        
if($diasemana=="Saturday" || $diasemana=="Saturday"){
            
$comprueba=" no lectivo ";
            return 
$comprueba;
            
        
//si no es fin de semana, debemos comprobar que no se encuentre en la lista de día de fiesta
        
}else{
            
$consulta "SELECT COUNT(*) FROM nfc.festivos WHERE dia='$fecha'";
            
$result $db->prepare($consulta);
            
$result->execute();
            if(
$result->fetchColumn()>=1){
                
$comprueba="nolectivo";
            }
            else{
                
$comprueba="lectivo";
            }
            
            return 
$comprueba;
        }
        return 
$comprueba;
    }
?>
Esto devuelve "lectivo" si es un día entre lunes y viernes y si no se encuentra en la base de datos de los días festivos, de lo contrario el resultano es "nolectivo"
  #12 (permalink)  
Antiguo 05/12/2013, 21:25
 
Fecha de Ingreso: noviembre-2012
Mensajes: 65
Antigüedad: 11 años, 5 meses
Puntos: 2
Respuesta: consulta a bbdd no funciona en función

bueno corrijo un pequeño error, aunque no de sintaxis sino de lógica, la línea

if($diasemana=="Saturday" || $diasemana=="Saturday"){

está mal pues se repite el sábado, sería así

if($diasemana=="Saturday" || $diasemana=="Sunday"){

Etiquetas: bbdd, fecha, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:49.