Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PHP (https://www.clubdelphi.com/foros/forumdisplay.php?f=15)
-   -   Problemas con smarty al tratar consulta de base de datos access (https://www.clubdelphi.com/foros/showthread.php?t=52099)

Chompiras 10-01-2008 15:15:45

Problemas con smarty al tratar consulta de base de datos access
 
Bueno, esta consulta es un poco complicada de hacer, pero espero que alguno que sepa de php, smarty y base de datos access me pueda entender y ayudar...
Tengo una base de datos en access, para la cual cree un DSN de sistema en mi PC. El codigo de la pagina, en php, es el siguiente:
Código PHP:

<?    
    
include 'include/clases.php';
    require_once(
'smarty/libs/Smarty.class.php');
    
$smarty = new Smarty;
    
    if ( isset( 
$_GET['tipo'] ) ){
       
        
$smarty->assign('hay_resultados',true);
        if ( 
$_GET['tipo'] == "nombres" ){
            
            
$resultados = new Nombres();
        }
        else{
            
            
$resultados = new Documentos();            
        }
        unset (
$_GET['tipo']);
    }
    else{
            
        
$smarty->assign('hay_resultados',false);
    }    
    
$smarty->assign('resultados',$resultados);
    
$smarty->display('dos.tpl');
?>

Luego, la clase "clases.php" contiene el siguiente codigo:
Código PHP:

<?
    
function conectar(){
        
//El segundo y tercer parametro son el usuario y la contraseña. 
        //Sino fueron especificados, van vacios.
        
return ($conn_access odbc_connect ("dos","",""));
        
    }    
    class 
ObjetoDeUnSoloAtributo{
        private 
$atributo;
        public function 
ObjetoDeUnSoloAtributo($valorParaElAtributo){
            
$this->atributo $valorParaElAtributo;
        }
        public function 
atributo(){
            return(
$this->atributo);
        }
    }
    class 
Documentos{
        ...
    }
    class 
Nombres{
        private 
$db;
        public function 
Nombres(){
            
$this->db conectar();
           
            
$arreglo=array();
            
            
$codigo $_GET['licenciatura'];
            
$consulta odbc_exec($this->db,"select nombre,apellido from Alumnos where codigo_carrera = $codigo ");
           
            while (
$fila odbc_fetch_object($consulta)){                
                
$objeto =  new ObjetoDeUnSoloAtributo($fila->nombre.$fila->apellido);
                
$arreglo[] = $objeto;
               
            }
            return 
$arreglo;            
        }        
    }
?>

A la clase Documentos, la deje con "..." por que es muy parecida a la clase Nombres, salvo un par de detalles.

Luego, tengo un dos.tpl, con el siguiente contenido (espero que este bien la etiquera CODE para esto):
Código:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="es">
    <head>
        <title>dos</title>
        {literal}
        <script type="text/javascript">
            function mostrarNombres(formulario){
               
                if (document.getElementById("carreras").options[document.getElementById("carreras").selectedIndex].value == "informatica" ){
                    window.open("http://localhost/practicas/dos/dos.php?tipo=nombres&licenciatura=1","Nombres de los estudiantes","");

                }
                else{
                    window.open("http://localhost/practicas/dos/dos.php?tipo=nombres&licenciatura=2","Nombres de los estudiantes","");
                }               
            }
            function mostrarDocumentos(formulario){
                if (document.getElementById("carreras").options[document.getElementById("carreras").selectedIndex].value == "informatica" ){
                    window.open("http://localhost/practicas/dos/dos.php?tipo=documentos&licenciatura=1","Nombres de los estudiantes","");

                }
                else{
                    window.open("http://localhost/practicas/dos/dos.php?tipo=documentos&licenciatura=2","Nombres de los estudiantes","");
                }       
            }
       
        </script>
        {/literal}
    </head>
   
    <body>
        {if $hay_resultados == true}
            <tr class="encabezado">
                <th>DNI o NOMBRE de los alumnos:</th>                           
            </tr>
            {foreach item=alumno from=$resultados}                                   
                <tr>           
                    <td>{$alumno->atributo()}</td>           
                </tr>                                               
            {/foreach}
        {else}
            <br />
            <label class="carreras" for="carreras">Carrera:</label>
            <select id="carreras">
                <option value="informatica">Licenciatura en informatica</option>
                <option value="sistemas">Licenciatura en sistemas</option>
            </select>
           
           
            <form method="post" enctype="text/plain" onSubmit="mostrarNombres(this)">
                <label class="nombres" for="nombres">Listar:</label>
                <input id="nombres" type="submit" value="N y A de Alumnos" />
            </form>
           
            <form name="documentos" method="post" enctype="text/plain" onSubmit="mostrarDocumentos(this)">
                <input type="submit" value="DNI de alumnos" />
            </form>
        {/if}
    </body>
</html>

Ahora les explico todo en conjunto como funciona. Al ejecutar dos.php por primera vez, se ejecuta dos.tpl a traves del else, el cual permite elegir entre dos opciones de un select, y luego, al apretar uno de entre dos botones, mostrara una tabla con alumnos de la carrera elegida, y con el "nombre" o el "documento" de cada uno de los alumnos, dependiendo que boton hayamos seleccionado. El problema que tengo con este codigo, es que, una vez que el "dos.tpl" entra por el if, el foreach no funciona correctamente, ya que no imprime los datos, la pagina se muestra hasta esta parte del codigo:
Código:

<tr class="encabezado">
    <th>DNI o NOMBRE de los alumnos:</th>                           
</tr>

Y se detiene ahi. Es decir, no solo no imprime la informacion que deberia imprimir en pantalla el foreach, sino que tambien se detiene el procesamiento de la pagina, por lo que etiquetas "</body>" y "</html>" tampoco son mostradas...
¿Alguna idea?

PD: La verdad que no estaba seguro si este tema iba aca, o en la parte de html y javascript, asi que pido perdon si me equivoque de lugar.

lucasarts_18 10-01-2008 18:01:54

Hola:

Pueden ser varios factores, probaste con imprimir el arreglo en pantalla, para descartar problemas con el php, en caso de mostrar datos el arreglo revisa si cargas bien los datos en el tpl, es decir los arreglos de php y las variables para smarty deben tener el mismo nombre, otra cosa, revisa si los campos vienen en mayusculas o minusculas o ambas, deben ser escritas de la misma forma en el template.

Bueno no sé que más decir, intenta probar mas alternativas.

Hasta Luego .-

Chompiras 20-01-2008 16:46:16

Tarde pero seguro.
 
Perdón por la demora y gracias por tu respuesta.
Respecto a lo que me decís, lo de los nombres que tienen que ser iguales tanto en php como en smarty eso no creo que sea.
Después, la verdad que no probé imprimir el arreglo en pantalla, ya que yo para cargar un arreglo "a", hago un simple:
Código PHP:

a[] = 

y no estoy seguro en que posición queda guardado ese dato. Lo que si probé, es imprimir los datos antes de guardarlos en el arreglo ( ya que como use una bd access, tenia miedo que me llegara a guardar cosas en blanco o algo por el estilo). Y los datos se imprimen bien de esta manera.

Así que no se la verdad, seguiré probando a ver si encuentro el error.

lucasarts_18 20-01-2008 20:00:57

Hola:

Insisto nuevamente en imprimir la variable resultados por pantalla.

Código PHP:

echo '<pre>'print_r($resultados); echo '</pre>'

Luego de eso hay que ver que está pasando.


Hasta Luego .-


La franja horaria es GMT +2. Ahora son las 20:01:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi