Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Ayuda: Clase scaffold para sqlite2

Estas en el tema de Ayuda: Clase scaffold para sqlite2 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Ando aún con el cambio de programar en C++ a PHP, para coger experiencia estoy creando una clase para interactuar con una base de datos ...
  #1 (permalink)  
Antiguo 24/10/2009, 11:28
 
Fecha de Ingreso: octubre-2009
Mensajes: 2
Antigüedad: 14 años, 6 meses
Puntos: 0
Ayuda: Clase scaffold para sqlite2

Ando aún con el cambio de programar en C++ a PHP, para coger experiencia estoy creando una clase para interactuar con una base de datos Sqlite 2 (sin usar PDO), pero me he encontrado con algunas preguntas/problemas.

Esta es la clase:

Código PHP:
<?php
class crudSqlite
{
    private 
$table;
    private 
$database "users.db";
    private 
$db;

    public function 
__construct(){
        
$this->db sqlite_open($this->database);
    }
    
    public function 
listTable($tb){
        
$this->table $tb;
        
$cols sqlite_fetch_column_types($this->db$this->tableSQLITE_ASSOC);
        echo 
'<table><thead><tr>';
            foreach (
$cols as $column => $type) {
            echo 
'<th>' $column ' ' $type '</th>';
            }
        echo 
'</tr></thead>';
        echo 
'<tbody>';
        
$result sqlite_query($this->db,"SELECT * FROM ".$this->table."");
        while(
$row sqlite_fetch_array($result)){
            echo 
'<tr>';
            for(
$i=0;$i sqlite_num_fields($result);$i++){
                echo 
'<td>' $row[$i] . '</td>';
            }
            echo 
'</tr>';
            }
        echo 
'</body></table>';
   }

   public function 
deleteRow($del){
       
$result sqlite_query($this->db,"DELETE FROM " .$this->table." WHERE id=" $del "");
   }

   public function 
insertRow(){
        if (isset(
$_POST[submit])){
            
$cols sqlite_fetch_column_types($this->table$this->dbSQLITE_ASSOC);
            
$i=0;
            foreach (
$cols as $column =>$type) {
                
$col[$i] = $column;
                
$pos[$i] = sqlite_escape_string($_POST[$column]);
                
$i++;
            }
            
$col '(' implode(' , '$col) . ')';
            
$pos '("' implode('", "'$pos) . '")';
            
$sql "INSERT INTO " $this->table " " $col.' VALUES '.$pos;
            echo 
$sql;
            
$result sqlite_query($this->db,$sql);
        }
        else
        {
        
$cols sqlite_fetch_column_types($this->table$this->dbSQLITE_ASSOC);
        echo 
'<form action = "" method="post">';
        foreach (
$cols as $column => $type) {
            echo 
'<h2>' $column '</h2>';
            switch (
$type) {
                case 
"INTEGER":
                echo 
"<input name=" $column "></input>";
                break;

                case 
"REAL":
                echo 
"<input name=" $column "></input>";
                break;

                case 
"TEXT":
                echo 
"<textarea name=" $column "></textarea>";
                break;

                case 
"BLOB":
                echo 
"<textarea name=" $column "></textarea>";
                break;


                case 
"CHAR":
                echo 
"<input name=" $column " type='text' ></input>";
                break;
           }
        }
           echo 
'<input type="submit" name="submit" value="Add"></button></form>';
      
       }
   }   
}
?>
y este seria el index.php
Código PHP:
<?php
    
require_once("crud.sql.php");
    
$sqldb = new crudSqlite();
    
$sqldb->listTable("users");
    
$sqldb->insertRow();
?>
Dudas/Problemas:

1. La función insertRow() hace lo que le pido, lista automáticamente una tabla que le metes por parámetro. Lo siguiente que quiero hacer para esta función, es añadir unos enlaces en cada fila que lista. Estos enlaces serian editar y borrar. Esta parte es fácil, pero lo que no se como hacer es que haga una llamada a $this->deleteRow(); al hacer click en el enlace de borrar. Esto se complica porque lo quiero hacer sin tener que llamar a un archivo .php externo, ni por medio de javascript. ¿Es esto posible?

2. Tengo un problema con la funcion insertRow() en el momento que detecto el tipo de dato que es cada columna de la tabla. Me explico, al usar la función sqlite_fetch_column_types(), me he encontrado con que me devuelve INTEGER(valor) o CHAR(valor) en vez de INTEGER, CHAR que seria fácil de analizar. El caso es que al analizar esta información para devolver un textarea o input... dependiendo del tipo de dato que se vaya a insertar, me crea problemas. ¿como haría para poder analizar correctamente esta información?

Muchas gracias por adelantado
  #2 (permalink)  
Antiguo 24/10/2009, 13:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ayuda: Clase scaffold para sqlite2

A tu pregunta uno, no, la forma de trabajar en PHP es en el servidor, por lo que es forzoso que envies a un archivo PHP para que este pueda procesar, por eso los links que ves es del tipo "delete.php?id=1" porque tienes que pasarle el parámetro de que fila borrar.

A la pregunta dos puedes usar una expresión regular para verificar si contiene INTEGER por ejemplo o CHAR.

Saludos.
  #3 (permalink)  
Antiguo 25/10/2009, 09:13
 
Fecha de Ingreso: octubre-2009
Mensajes: 2
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: Ayuda: Clase scaffold para sqlite2

Cita:
Iniciado por GatorV Ver Mensaje
A tu pregunta uno, no, la forma de trabajar en PHP es en el servidor, por lo que es forzoso que envies a un archivo PHP para que este pueda procesar, por eso los links que ves es del tipo "delete.php?id=1" porque tienes que pasarle el parámetro de que fila borrar.

A la pregunta dos puedes usar una expresión regular para verificar si contiene INTEGER por ejemplo o CHAR.

Saludos.
Entonces, a la pregunta uno la solución: es mandar variables GET al hacer click en el enlace, por ejemplo una que sea Acción, que decide que hace si insertar, eliminar, etc... y otro parámetro GET para el id de la fila que va a modificar.

Y a la pregunta 2, al final he conseguido "solucionarlo", en principio use una expresión regular, pero he acabado por coger todos los parámetros que me daban problemas en la clausula default: del switch y parece que así simplifico el problema.

Muchas gracias por la ayuda, GatorV

Por ultimo, si no es mucho pedir, como todavía ando empezando con PHP. Me gustaría que analizaseis el código por encima y me dijeseis si veis que hay alguna practica mala de programación o algo que se pudiese optimizar, para poder ir aprendiendo poco a poco.

Última edición por krate1; 25/10/2009 a las 09:38
  #4 (permalink)  
Antiguo 25/10/2009, 22:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Ayuda: Clase scaffold para sqlite2

Pues solo te puedo dar el mismo consejo, trata de separar la logica de tu aplicación de lo que genera, así es más fácil mantener tu aplicación al tener la parte que genera el HTML, fuera del proceso de PHP.

Saludos.
  #5 (permalink)  
Antiguo 25/10/2009, 23: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: Ayuda: Clase scaffold para sqlite2

por cierto, el HTML que se alcanza leer es de lo peor... sin ofender

los <input/> no deben llevar etiqueta de cierre, además siempre debes especificar el type y usar comillas dobles para los atributos, etc, etc..

<input[...]</button>???

antes de continuar, también sugiero leas un buen curso de HTML válido... no mas, suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
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 04:05.