En este primer tutorial de PHP vamos a explicar cómo crear de una forma sencilla y eficaz una capa de comunicación con tus bases de datos, pudiendo dejar así de lado pesadas librerías sobre las cuales no tienes control total y abstraer tu código independientemente del motor de base de datos.

Autor:

Intentando mejorar cada día en este mundo tan cambiante de la programación. Sígueme en Twitter o en GitHub. Actualmente estoy disponible para contratar.
Descarga Demostración

Introducción

Hasta hace muy poco, usaba una librería de PHP llamada ADOdb Lite para abstraerme un poco de la base de datos en mis proyectos. En realidad, no era por ser vago y no querer desarrolar mi propio código, si no que la comencé a usar porque siempre uso procedimientos y funciones de MySQL en mis modelos y las funciones de la librería nativa de PHP no me permitían hacer llamadas a estos (no se ahora, antes no).

Desde hace unos pocos años la empecé a utilizar y desde entonces la carpeta adodb_lite se iba copiando de proyecto en proyecto casi de manera inconsciente. Hasta que un día me encontré con la librería Mysqli (MySQL Improved Extension) que es una librería nativa de PHP que nos permite hacer muchas más cosas, entre otras, ejecutar procedimientos de la base de datos :) .

Mediante la librería nativa de PHP Mysqli podemos ejecutar procedimientos definidos previamente en nuestra base de datos.

Fue en ese momento cuando decidí borrar la librería AdoDB Lite para crear mi propio código de comunicación con la base de datos. La verdad, que en esto, se puede hacer desde la cosa más sencilla (lo que vamos a ver en este tutorial) hasta cosas realmente complejas como doctrine.

Supongo que es cuestión de gustos y del tipo proyecto…a mí personalmente me gustan las cosas sencillas y potentes, no me importa escribir un poco más de código mientras tenga control total con la aplicacion, ¿vosotros que preferís?.

Bueno pues… ¡vamos a ello!

¿Qué vamos a hacer?

Antes de nada os explicaré un poco qué características va a tener nuestra capa de comunicación:

  • Abstracción del tipo de proveedor: esto es algo básico, nunca sabes cuándo puedes cambiar de tipo de servidor (base de datos). A mí ya me ha pasado en un proyecto tener que cambiar de PostgresSQL a MySQL. Por desgracia fue en mi primer proyecto y todavía no sabía estas cosas, por lo tanto, a cambiar código por todos lados.
  • Instancia única: nuestro código será construído usando el patrón de diseño Singleton, lo que nos garantizará que sólo se establece una conexión con la base de datos, ¿para qué más?.
  • Autocargar en array: si ejecutamos consultas de extracción de filas, nuestra capa nos devolverá dicha información cargada en un array.
  • Parámetros en consultas: se gestionarán de forma fácil los parámetros que se envían en las consultas.

Paso 1: Crear la estructura de nuestro proveedor

Como ya he comentado anteriormente, nuestra capa será abstracta al tipo de proveedor de bases de datos. Para cumplir con esto, necesitamos crear una clase base que defina qué es un proveedor y qué funciones va a poder llevar a cabo, luego, cada tipo de proveedor que necesitemos, se extenderá de dicha clase. Lo vemos con este ejemplo:

abstract class DatabaseProvider{
/*Definicion de que métodos y propiedades van a tener todos los proveedores*/
}

class MySqlProvider extends DatabaseProvider
{
/*Implementación de los métodos definidos en la clase base*/
}

class SQLServerProvider extends DatabaseProvider
{
/*Implementación de los métodos definidos en la clase base*/
}

No hace falta entender mucho de POO para entederlo, ¿no?. Simplemente se define una clase abstracta para definir lo que todos sus descendientes deben de implementar, así nos aseguramos de que todos los proveedores que hagamos tengan la misma estructura.

De modo que si hacemos algo como $ob->foo(), tanto nos dá si $ob es de la clase MysqlProvider o SQLServerProvider, sabemos que dicho método tiene que existir y que en teoría debería hacer lo mismo en un motor u otro de base de datos.

Al crear nuestra propia capa de comunicación con la base de datos, no importa cuál sea el motor de base de datos: MySQL, PostgreSQL, Oracle… no tendremos que rescribir todo el código creado anteriormente, será abstracta a nuestro motor.

Pues bien, una vez entendida la teoría, vamos a definir realmente nuestra clase base para los proveedores, yo he incluído el siguiente esquema, que es el básico: ejecución de consultas y control de errores, vosotros lógicamente lo podréis ampliar cuanto queráis :) .

abstract class DatabaseProvider
{
    //Guarda internamente el objeto de conexión
    protected $resource;
    //Se conecta según los datos especificados
    public abstract function connect($host, $user, $pass, $dbname);
    //Obtiene el número del error
    public abstract function getErrorNo();
    //Obtiene el texto del error
    public abstract function getError();
    //Envía una consulta
    public abstract function query($q);
    //Convierte en array la fila actual y mueve el cursor
    public abstract function fetchArray($resource);
    //Comprueba si está conectado
    public abstract function isConnected();
    //Escapa los parámetros para prevenir inyección
    public abstract function escape($var);
}

Como podéis ver, los métodos son todos abstractos para que se implementen en sus clases hijas.

Paso 2: Crear nuestro proveedor

Una vez creada la base, tenemos que crear el proveedor. Para ello tenemos que heredar de la clase anterior e implementar los métodos:

class MySqlProvider extends DatabaseProvider
{
    public function connect($host, $user, $pass, $dbname){
        $this->resource = new mysqli($host, $user, $pass, $dbname);
        return  $this->resource;
    }
    public function getErrorNo(){
        return mysqli_errno($this->resource);
    }
    public function getError(){
        return mysqli_error($this->resource);
    }
    public function query($q){
        return mysqli_query($this->resource,$q);
    }
    public function fetchArray($result){
        return mysqli_fetch_array($result);
    }
    public function isConnected(){
        return !is_null($this->resource);
    }
    public function escape($var){
        return mysqli_real_escape_string($this->resource,$var);
    }
}

Me he enfocado en el proveedor de MySQL, que supongo que es el más usado. Como podéis ver, todas las funciones definidas en nuestra clase base, tienen su correspondiente función en la librería Mysqli, por lo que se puede decir que funciona a modo de wrapper.

Paso 3: Crear nuestra capa de comunicación

Lo hecho hasta ahora está muy bien, pero lo único que nos permite es abstraer el tipo de proveedor, el resto de puntos que he comentado al inicio todavía están si cumplir. Esto es porque aún nos falta por crear una nueva clase que se encargará de enviar las consultas y gestionar las conexiones y respuestas del servidor.

Os pongo la estructura de la clase para que le echéis un ojo:

class DatabaseLayer
{
    //Almacena internamente el proveedor
    private $provider;
    //Usado para las callbacks, se explica luego
    private $params;
    //Almacena la instancia para el Singleton
    private static $_con;
    //Constructor privado
    private function __construct($provider){}
    //Funcion del Singleton que devuelve o crea la instancia
    public static function getConnection($provider){}
    //Funcion callback, se explica luego
    private function replaceParams($coincidencias){}
    //Se encarga de poner los parámetros en su sitio
    private function prepare($sql, $params){}
    //Envia la consulta al servidor
    private function sendQuery($q, $params){}
    //Ejecuta una consulta, extrayendo solo la primera columna de la primera fila
    public function executeScalar($q, $params=null){}
    //Ejecuta una consulta y devuelve un array con las filas
    public function execute($q, $params=null){}
}

Antes de continuar, es importante ver cuál será el formato de las consultas. Para que el código permanezca limpio y poder escapar los parámetros (para prevenir inyecciones maliciosas), los parámetros serán especificados en un array, de forma que serán insertados en la consulta reemplazando al caracter ‘?’.

Veamos un ejemplo:

$bd->execute("SELECT * FROM foo WHERE id=?", array(5))
$bd->executeScalar("SELECT id FROM foo WHERE id=? AND name like '%?%'"), array(5,"ivan"));

Ahora vamos por pasos, rellenendo lós métodos con la funcionalidad requerida.

Patrón singleton

La implementación de este patrón nos asegura que solo un objeto de dicha clase es creado. Para ello tenemos que poner el constructor como privado y llamarlo desde una función estática, en este caso getConnection. En el constructor creamos una conexión a la base de datos y se comprueba si se ha establecido.

private function __construct($provider){
	if(!class_exists($provider)){
		throw new Exception("El proveedor especificado no ha sido implentado o añadido.");
	}
	$this->provider = new $provider;
	$this->provider->connect("localhost","usuarioBaseDatos", "tuPassword", "tuBaseDatos");
	if(!$this->provider->isConnected()){
		/*Controlar error de conexion*/
	}
}
public static function getConnection($provider){
	if(self::$_con){
		return self::$_con;
	}
	else{
		$class = __CLASS__;
		self::$_con = new $class($provider);
		return self::$_con;
	}
}

sendQuery

Este método se encarga de enviar las consultas y comprobar errores:

private function sendQuery($q, $params){
	$query = $this->prepare($q, $params);
	$result = $this->provider->query($query);
	if($this->provider->getErrorNo()){
		/*Controlar errores*/
	}
	return $result;
}

prepare

Este método privado es importante, ya que es el que se encarga de limpiar los parámetros para prevenir errores típicos e insertarlos en su sitio correspondiente.

Para reemplazar se usa una expresión regular mediante la funcion preg_replace_callback(), que nos permite ejecutar una funcion para cada coincidencia encontrada. En este caso la callback es replaceParams (la cual definiremos a continuación).

private function prepare($sql, $params){
	for($i=0;$i<sizeof($params); $i++){
		if(is_bool($params[$i])){
			$params[$i] = $params[$i]? 1:0;
		}
		elseif(is_double($params[$i]))
			$params[$i] = str_replace(',', '.', $params[$i]);
		elseif(is_numeric($params[$i]))
			$params[$i] = $this->provider->escape($params[$i]);
		elseif(is_null($params[$i]))
			$params[$i] = "NULL";
		else
			$params[$i] = "'".$this->provider->escape($params[$i])."'";
	}
	
	$this->params = $params;
	$q = preg_replace_callback("/(\?)/i", array($this,"replaceParams"), $sql);
	
	return $q;
}

replaceParams

Esta es la función llamada por preg_replace_callback() y que se encarga de devolver el parámetro especificado para cada interrogante (?) encontrado en la consulta. Para hacer esto se usa la función next() que va moviendo el cursor del array para cada coincidencia.

    private function replaceParams($coincidencias){
        $b=current($this->params);
        next($this->params);
        return $b;
    }

execute y executeScalar

Estas son las funciones que vamos a usar públicamente para realizar consultas y son muy parecidas. Tan solo se diferencian en que la primera recorre el resultado cargándolo en un array, mientras que la segunda simplemente devuelve la primera columna de la primera fila:

public function executeScalar($q, $params=null){
	$result = $this->sendQuery($q, $params);
	if(!is_null($result)){
		if(!is_object($result)){
			return $result;
		}
		else{
			$row = $this->provider->fetchArray($result);
			return $row[0];
		}
	}
	return null;
}
public function execute($q, $params=null){
	$result = $this->sendQuery($q, $params);
	if(is_object($result)){
		$arr = array();
		while($row = $this->provider->fetchArray($result)){
			$arr[] = $row;
		}
		return $arr;
	}
	return null;
	
}

Paso 4: Probarlo

Una vez hecho todo lo anterior la forma de uso es muy sencilla:

//Como parámetro va el nombre del proveedor que queréis cargar
$db = DatabaseLayer::getConnection("MySqlProvider");
//Imprimiría la estructura del array
print_r($db->execute("SELECT id,email FROM users WHERE  name like ? LIMIT 20",array("ontuts%")));
//Imprime un valor númerico
echo($db->executeScalar("SELECT count(*) FROM users WHERE active=?",array(true)));

Reflexión final

Antes de despedirme recordaros que os podéis descargar el código completo en la zona superior de la página.

Como siempre, espero que la información compartida en este tutorial os resulte útil, con el que pretendo demostraros que no hay que tener miedo a crear tus propias librerías, siempre y cuando sepáis lo que estás haciendo :) . No olvidéis dejar un comentario para cualquier duda, fallo o valoración.

¡Un saludo y hasta el próximo tutorial!

¿Necesitas desarrollar un proyecto web o para móviles? ¡Estamos disponibles!

Visitar Cokidoo

Cokidoo, los creadores de Ontuts, desarrollamos proyectos tecnológicos centrados en redes sociales y aplicaciones web, aplicaciones móviles y consultoría web y bases de datos.

Somos jóvenes, inquietos, versátiles, apasionados por la innovación y enfocados en las nuevas tecnologías. Con Ontuts tratamos de compartir nuestro conocimiento adquirido en los distintos proyectos, ayudando a la comunidad y mostrando nuestra capacidad tecnológica.

Si necesitas un presupuesto sin compromiso, estamos disponibles, no dudes en contactar con nosotros.

Comentarios en esta publicación (45 comentarios)

¿Te ha gustado esta publicación? ¡Puedes compartir tu opinión con todos nosotros! Simplemente pincha aquí mismo.

Muy interesante.

Cuando empecé con PHP me di cuenta que meter los comandos de MySQL sin ninguna librería de por medio era bastante “in-práctico” ;)

Ahora uso CodeIgniter que resuelve todo este tema.

Muy bueno el tuto Iván… qué voy a decir yo de esto, lo llevamos usando una buena temporada y es realmente potente :)

Excelente aporte! llevo tiempo desarrollando en php y utilizando sentencias MySQL directamente en PHP como dice el primer comentario, se me hace “in-practico” y andaba queriendo hacer algo como esto desde hace tiempo, pero no habia podido por una u otra razon, lo empezare a utilizar me parece una excelente practica manejar la base de datos de esta manera!!! muchas gracias!!!

@adrian si, a nosotros no nos ha dado ningún problema. El que nosotros usamos es un poco más extenso, pero aquí solo he querido porner la base.

@MXRKO Me alegro que te haya resultado útil, cualquier bug que se pueda escapar avisa que lo corrigo.

Un saludo!

Angela Sierra

Hola,
Excelente, es mas o menos lo que necesito el problema es que en mi empresa tenemos configurado php 4.05 y creo esto no funciona, alguna idea de como puedo conectarme desde php a DB2. Gracias

Excelente chiquillos, pero podrían colocar algún plugin para ver de mejor manera el código fuente.

Santiago

una pregunta. Estuve viendo el diseño de una clase de abstracción de datos utilizando PDO.

En PDO, como en esta clase, se utiliza un pasaje de parametros a las sentencias SQL que no entiendo mucho, se pasa los parametros como arrays con los parametros a insertar. Ahora q ventaja tiene esto sobre escribir la consulta tal cual iria, digo en vez de poner SELECT * FROM table WHERE dato=? porque no SELECT * FROM table WHERE dato=datoRequerido ?
Espero se entienda mi consulta. Saludos

José Carlos

Hola, esta muy bueno el tuto pero quiero saber como podria adaptar las clases si quiero manejar dos bases de datos casi al mimso tiempo en mysql (leer de una e inmediatamente insertar en la otra)

@santiago, el por qué de los interrogantes en las consultas, es para abstraer el envío de parámetros. En la clase que he puesto, los interrogantes no son simplemente reemplazados por los valores del array, si no que tambien se preparan correctamente antes de enviar la consulta, por ejemplo si es una string lo pone entre comillas simples, si es null insert NULL en la consulta en lugar de dejar vacío…etc, además de prevenir sql inyection. Se puede decir entonces que es por comodidad y seguridad.

@José Carlos, supongo que tendrías que almacenar dos resources distintos en la clase, uno por cada conexión. Luego tendrás que crear métodos distintos para que cogan uno u otro según sea el caso. Este es uno de varios métodos que podrías usar

Tengo una base de joomla y la quiero utilizar para mi web, puedo ? Me dice que la configuracion no acepta que la escriba, como puedo hacer para que acepte que yo la utilice con otra web ?

@julio, creo que estás preguntando en el sitio equivocado, mejor vete a unos foros de Joomla que seguro te podrán ayudar mejor :) Suerte!

yo hise algo parecido a esto, ne mi caso manejo MySQL y PostgreSQL, para no estar haciendo coneciones tengo tres clase una clase BDBase ,psql y mysql, las dos utlimasa heredan de la primera que es una clase abstracta que y tiene varios metodos que son comunes entre las dos hijas asi uno evita escribir los metodos que son parecido y solo sobreescribir los metodos cuando esto tienen alguna caractersitica diferente por el motor, sin duda una excelente practica para una facil migracion

freddy

soy principiante en php y me parecio muy bueno
y si puede o tienes un manual o pequeña aplicacion en tres capas por favor enviame a mi correo
flq2004@hotmail.com

hola! muchas gracias por este articulo, he aprendido mucho. y en general por la web, que es interesante :)

respecto a tu codigo tengo una dudilla a ver si me podrias echar un cable…

la funcion:

private function replaceParams($coincidencias){ }

usas $coincidencias pero no se llama a esa variable en ninguna parte de la funcion, porque?

y luego en la funcion que prepara el SQL:

$q = preg_replace_callback(“/(\?)/i”, array($this,”replaceParams”), $sql);

esto que se supone que hace? me refiero, busca la expresion regular y llama a la funcion replaceParams, pero el $this justo antes del nombre de la funcion que significa? y ya de paso, que se supone que hace replaceParams?

espero que me puedas resolver esas dudas porque la verdad es que me gustaria entender el codigo al 100% :P

muchas gracias de antemano!

para lo de array($this, “replaceRarams”) ya tengo respuesta y era sencilla, al tratarse de una clase hay que referenciarla xD (no lo habia leido)

pero lo otro no encuentro nada que me ayude :$

j053d
Edu_ardo

hola Ivan, te agradezco mucho este aporte y su explicación. Es algo que estaba intentando hacer pero sufria del mal de la “pagina en blanco”, me costaba empezar.
Me parece una clase excelentemente básica para que cada uno a partir de ella irnos construyendo las nuestras. Muchas gracias de nuevo.

Ahora una preguntilla, el método executeScalar, que devuelve solo el primer resultado de la primera fila,¿que sentido tiene, o en que casos es util?

Un Saludo
Eduardo

@Edu_ardo tiene sentido para consultas del tipo get…Count() o checkIf…(), es decir, consultas que normalmente solo devuelven una fila con una celda :)

Hola Ivan!
exelente tuto. Gracias.

Tengo una duda cerca de esto. La tema de los caracteres. Cuando agregas el usuario desde la web con caracteres español como ñ, ç, ó … en la web te imprima usuarios correcto pero en la DB salen caracteres raros, de otro modo si agregas en MySQL DB dentro lo ves bien pero en la pagina salen raros.
tengo configurado todo con utf-8(DB, cabecera pagina).
Y me he dado cuenta si la vista de navegador lo pones a ISO-8859-15 lo guarda todo bien en los dos lugares, pero te pone los caracteres raros en formulario de la pagina (Contraseña :) .
Si existe una solución en php de esta problema¿?
estoy empezando a viajar por el mundo PHP, si me podrías ayudar , por favor.

Gracias,
Saludos

@ansbsn Para que funcione todo bien, necesitas envíar la siguiente sentencia SQL en cada conexión:

SET NAMES UTF8;

Luego en tu HTML, tienes que establecer el charset del documento añadiendo lo siguiente dentro del :

Espero que te funcione!

Perdón, me ha comido el HTML, es este:

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

Yonh

Intento conectarme a una BDD SQL SERVER 2000, en Database.class.php he agragado al inicio los datos de conexión:

$host = “dir IP”;
$user = “usuario”;
$pass = “clave”;
// $dbname = $base;
$database = “nombreBase”;

Tengo el siguiente error al hacer pruebas:

Fatal error: Uncaught exception ‘Exception’ with message ‘El proveedor especificado no ha sido implentado o añadido.’ in directorio\Database.class.php:61 Stack trace: #0 directorio\Database.class.php(75): DatabaseLayer->__construct(‘mssql’) #1 directorio\index.php(7): DatabaseLayer::getConnection(‘mssql’) #2 {main} thrown in directorio\Database.class.php on line 61

¿Me puedes orientar un poco, para corregir el error?

robert

excelente!!! PATRÓN DAO aplicado en PHP

gracias!!!

que os parece mejorarla con esto?

public function __destruct() {
if ($this->link->isConnected()) {
$this->link->close();
}
}

Oscar Quintero

Excelente recurso, estoy intentando implementar el cierre de conexion, pero me esta arrojando errores, el codigo es el siguiente:ç

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

abstract class DatabaseProvider
{ …..
#Cierra la conexion
public abstract function desconectar();
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class MySqlProvider extends DatabaseProvider
{…..
public function desconectar(){
return mysqli_close($this->resource);
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

class DatabaseLayer
{…..
public function desconectar(){
if ($this->provider->isConnected())
{
$this->provider->desconectar();
}
}
}

Gracias por su ayuda!!!

Antonio L. Gil

Buenas a todos!!

Antes de nada deciros que acabo de descubrir vuestra página y ya estoy flipando de los tutoriales tan interesantes con los que me he encontrado.

Bueno se que esta entrada es de hace ya un tiempo, pero es que estoy empezando con PHP y de toda la información que he encontrado sobre este tema, sin duda este es el más claro y el que más me gusta.

Pero Iván, he visto que comentas que:

“…El que nosotros usamos es un poco más extenso, pero aquí solo he querido porner la base….”

Es posible que publiques la extensión completa de este método para abstraer conexiones a bd?

Espero que sea posible…

Muchas Gracias de antemano y Saludos!!!

Hola Antonio, me alegro de que nos hayas encontrado y te haya gustado :)

Lo siento, pero no puedo publicar la clase completa porque está adaptada para funcionar en un framework, por lo que no os sería de utilidad.

Un saludo!

Antonio L. Gil

Buenas Iván!

No pasa nada, pero gracias igualmente.

Estoy intentando hacer una aplicación con php, pero quiero hacerla en condiciones y a ser posible sin Framework, no porque no me gusten, si no por aprender en condiciones php antes de meterme en algún framework.

Se puede usar esta clase con un ORM como Doctrine? (Aún no conozco nada Doctrine).. pero lo tengo pendiente de ver tu post.

Bueno ya no me enrollo más!!

Saludos a todos!!

Buenas Antonio,

Todo ORM tiene que tener, al final de todo, una clase similar a esta para enviar las consultas al servidor de datos.

Yo diría que el ORM está una capa por encima, pues el potencial de este sistema, son la autogeneración de consultas y la preparación de los datos obtenidos.

Un saludo.

Cristian David Acevedo C,

Muchas gracias por el tuto y muy interesante.. ahora lo estaba probando, con ánimos de integrarlo en un proyecto que estoy haciendo, pero aun estoy como algo novato y me gustaría saber como acceder a la información al almacenarla en una variable?

Ejm:

$resultados = $db->execute(“SELECT id,idItem FROM item LIMIT 20″,array(“ontuts%”));

PD: Que significa el “array(“ontuts%”)”??

Buenas Cristian, has puesto mal la línea, en realidad es así:
$db->execute(“SELECT id,email FROM users WHERE name like ? LIMIT 20″,array(“ontuts%”));

Lo que hace es reemplazar el interrogante de la query (?) por el valor “ontuts%”. Esto se hacer por varios motivos:
1. Por legibilidad, la query queda más limpia.
2. La más importante, por seguridad, antes de hacer dicho reemplazo, se limpia el valor del parámetro para evitar SQL Inyection (en breves un tutorial de seguridad en este blog).

Espero que haya quedado claro. Un saludo!

ALFONSO

….que ventajas tiene esto frente a PDO? ….que diferencias hay? … GRACIAS

wilfo

como recorrer el array devuelto por esta consulta db->execute($sql,array(”,”));
Me esta dando errores al recibi ese dato para poder recorrer y no se proque.Me dice un parametro expereado de la funcion mysql_fetch_array()..

Alguna sugerencia?

Mauricio

todo muy lindo pero como se supone que hay que hacer para meter datos a la base de datos??? es que nomas logro leer lo que ya está puesto en la db pero meterle cosas a la db la verdad que no doy pie con bolas…

si me pueden indicar como hacer para escribir algo a la db me ayudarían un monton… creo que el tuto está exelente pero se olvidaron de las 3 funciones básicas de trabajar con una db, select, insert y update, tambien deberían explicar como ahcer un delet en fin… como decimos en el barrio… EL EJEMPLO ES EL M,EJOR MAESTRO DEL PRINCIPIANTE y me siento orgulloso de ser ese principiante pero me falta el ejemplo jejeje

bueno, espero se pueda dar que aclaren un poquito mejor como hacer las copsas basicas con la db porque de esa manera puedo empézar a utilizar esta clase que la verdad me resultó bastante buena y sobre todo bien explicada

Hola Mauricio,

La verdad que no he puesto ese ejemplo porque de lado de PHP no cambia nada,lo único que tienes que cambiar es la sentencia SQL. Sería:

$db->execute(“INSERT INTO mytable(col1, col2) VALUES(?,?)”,array(“valor1″,”valor2″)));

Mauricio José Tobares

pues… tuve unos problemitas para entender la manera de hacer un login de usuarios con esto, pero es que cometía el estupido error de poner simples vars en el array en vez de llaves valor jeje hasta que me desperte en medio de la noche despues de un sueño con freddy crugger y me despabilé, ahi se me ensendio la luz del dormitorio y VOILA!!!!!!!!!!!!! me di cuenta que el array no era simplemente por gusto sino que era para usarlo :D

gracias amigo, luego en estos dias sigo haciendo cosas con esta clase, me encantó al final… me recuerda mucho a la forma de utilizar en un MVC que encontre hace algun tiempo

bobb

una duda,,,,,,

la el método isConnected no es lógico, puesto que si la conexión falla siempre se devuelve un objeto,,,,,

o estoy equivocado?

Hola bobb,

Tienes razón, el cuerpo del metodo deberia ser:
return $this->resource->connect_error == null;

Gracias!

hola amigo estoy tartando dee utilizar tu clase de coneccion a la base de dsatos pero me ecnuentro cone ste problema

$existeEmail=$db-:executeScalar(“select count(*) form seller where BussinesEmail’=”.strquote($_POST['BusinessEmail']).”",array(true));

if ($existeEmail != 0){
$emailMsg = “* El email esta registrado“;
}
else{
$db->execute(”Insert into seller (id_email, BussinessEmail) values
“._POST['id_email']“,
“._POST['BussinessEmail']“,
“,NULL);

pero al moemnto de realizar la comparacion para ver si existe una direccion de correo electronico no me da nda tampoco me se;ala algun error ni nada por el estilo….

asi tambien cuando quiero mostrar lso datos de una tabla en un
como el ingresado abajo solo me muestra un 1 interminable puedes ayudarme expilicandome como utilizar biien tu clase
s
soy un novato tratando de mejorar gracias

elc odigo es>:::

$listaElementos=$db->execute( “SELECT * FROM industry order by Industry asc”,NULL);

if ($listaElementos!=0){
while($listaElementos1=$db->executeScalar(“SELECT * FROM industry order by Industry asc”,array(true)))
{
?>
<option value="”

>
<?
}

y me sale un 1 infinito

puedes ayudarme explicande de mejor manera como podria hacerlo muchas gracias y sigue adelante con tus proyectoS

Buenas Franklin,

En el primer caso no veo cual puede ser el problema…Puedes hacer un print de la consulta antes de ejecutarla y ver si está como de debería. Tambien te recomiendo, que es muy importante validar y sanear los datos enviados por el cliente y no usar $_POST directamente en tus consultas, ya que es un fallo grave de seguridad. Te dejo un par de tutoriales para que les eches un vistazo:

http://web.ontuts.com/tutoriales/apuntes-sobre-seguridad-web/
http://web.ontuts.com/tutoriales/validar-y-sanear-datos-en-php/

El segundo problema que comentas, es seguramente a que estás usando el método executeScalar() en lugar de execute().

Un saludo

mauricio

hola denuevo, hice el insertar los datos a la db, que lo hice de esta forma:

$db->execute(“INSERT INTO usuarios(nombre,apellido,email,usuario,clave) VALUES(?,?)”,array($nombre, $apellido, $email, $usuario, $clave));

pero quisiera hacer uno para comprobar si, por ejemplo, el email o el usuario ya existen, creo que (segun deduzco) debería ser un select del usuario y colocar el valor en una variable para luego compararla con el valor de lo que viene desde el formulario… pero no me doy mucha idea de como hacerlo en este caso, ¿me podrías ayudar?

mil gracias de antemano!!

Daniela

Por lo que mencionas en una respuesta el metodo isConnected de MysqlProvider deberia ser:
public function isConnected(){
return $this->resource->connect_error == null;
}

Es esto correcto? connect_error no lo veo en el resto del codigo, hay que declararlo? gracias. Buen aporte

Carlos

POr que metes la clase mysqli dentro de otra que lo llama?, es como si hiceras:

en vez de usar

Se supone que POO es para demorar menos y utilizar menos cosas