Logo de islavisual
Isotipo de islavisual IslaVisual
imagen de sección

Ultima revisión 25/03/2013

Como trabajar con la base de datos de Prestashop

La mayoría de los módulos y desarrollos de PrestaShop requieren que use o ingrese información en una base de datos.

Cualquier desarrollador ve el núcleo de la clase DB como una parte esencial del proceso. Además de proporcionar abstracción potencial para otros tipos de bases de datos relacionales, la clase DB dispone de varias herramientas para haceros la vida más fácil.

Primero debemos aclarar que la clase DB se compone de dos sub-clases:

  • Clase DB que es abstracta.
  • Clase MySQL se basa en DB.

Declaración de la instacia

$db = Db::getInstance();

La instrucción anterior crearía la nueva instancia pero, también podríamos ver cosas como:

$db = Db::getInstance(_PS_USE_SQL_SLAVE_);

Cuando el anterior está conectado, podría ingresar servidores esclavos si el usuario de PrestaShop permite el uso de servidores esclavos MySQL en su arquitectura. El argumento estándar _PS_USE_SQL_SLAVE_ sólo se debe utilizar para consultas sólo de lectura (SELECT, SHOW, etc.), y sólo si el resultado no necesita ser actualizado inmediatamente. Es necesario que utilice el servidor maestro para realizar una consulta de selección justo después de ingresar algo en la misma tabla.

<

El método getValue

Este método realiza internamente la selección de una columna de una tabla dada. En realidad es como si hiciesemos un SELECT forma normal en PHP.

$sql = 'SELECT COUNT(*) FROM '._DB_PREFIX_.'orders';
$totalOrders = Db::getInstance()->getValue($sql);

El método execute

Ejecuta la consulta SQL pasada por parámetro. Sólo debe ser utilizada para consultas sólo de escritura (INSERT, UPDATE, DELETE, TRUNCATE etc.), ya que también elimina la consulta caché (a menos que el argumento $use_cache sea false).

$sql = 'DELETE FROM '._DB_PREFIX_.'product WHERE date_upd < NOW()';
if (!Db::getInstance()->Execute($sql))
    die('Erreur etc.');

El método executeS

Ejecuta la consulta SQL pasada por parámetro y carga todos los resultados en una tabla multidimensional. No se debe usar con consultas sólo de lectura (SELECT, SHOW etc.). Los resultados de la consulta serán almacenados en caché a menos que el argumento $use_cache sea false.

$sql = 'SELECT * FROM '._DB_PREFIX_.'product';
if ($results = Db::getInstance()->ExecuteS($sql))
    foreach ($results as $row)
        echo $row['id_product'].' :: '.$row['price'].'<br />';

El método autoExecute

Este método realiza, a través de un algoritmo de conversión de arrays a strings, la inserción o actualización de la base de datos de forma automática. Es muy útil y aconsejable cuando trabajamos con intrucciones INSERT, REPLACE o UPDATE sencillas. Para realizar consultas más pesadas o complejas (con funciones SQL, consultas intersecadas, etc.) es recomendable, que no obligatorio, usar los métodos insert o update suministrados.

La ventaja de utilizar este método que realiza todas las operaciones de inserción o actualización es que centraliza las peticiones.

$id = Tools::getValue('id');
$name = Tools::getValue('name');
Db::getInstance()->autoExecute('example_table', array(
    'id_target' =>    (int)$id,
    'name' =>    pSQL($name),
), 'INSERT');

Solicitar este método daría como resultado la siguiente consulta SQL:

INSERT INTO `example_table` (`id_target`, `name`) VALUES (10, 'myName');

Importante:

  • Hay que asegurarse siempre de que los datos estén protegidos antes de transferirlos a autoExecute().
  • En el ejemplo, el id_target debe ser un entero y el nombre debe estar protegido contra inyecciones SQL con pSQL().
  • Con PrestaShop, los nombres de las tablas deberán ir siempre precedidos por el prefijo, incluida la constante DB_PREFIX.
  • Usted puede generar una consulta de ACTUALIZACIÓN sustituyendo el tercer argumento con UPDATE. En este caso, puede eludir las restricciones SQL (por ejemplo: …->autoExecute(‘table’, $data, ‘UPDATE’, ‘myField = 13 AND id < 8’); ).

Existe una versión DELETE de autoExecute(). Puede ser utilizado para el mismo propósito. El argumento $limit limita el número de elementos guardados que puede eliminar. La otra ventaja de este método es que puede ser utilizado con el sistema de caché de consulta de SQL de PrestaShop y elimina las consultas almacenadas en caché a menos que el argumento $use_cache argument sea false.

Db::getInstance()->delete('example_table', 'myField < 15', 3);

Geraríamos la siguiente consulta:

DELETE FROM target_table WHERE myField < 15 LIMIT 3;

El método getRow

Ejecuta la consulta SQL pasada por parámetro y recoge la primera línea de resultados. Sólo debe ser utilizado con consultas sólo de lectura (SELECT, SHOW, etc.) Los resultados de la consulta se almacenarán en caché a menos que el argumento $use_cache sea false.

$sql = 'SELECT COUNT(*) FROM '._DB_PREFIX_.'product';
$totalproducts = Db::getInstance()->getValue($sql);

Otros métodos que te podrían ser útiles:

  • Insert_ID: muestra el ID creado por la última consulta ejecutada INSERT.
  • Affected_Rows: muestra el número de líneas afectadas por la última consulta ejecutada UPDATE o DELETE.
  • getMsgError: muestra el último mensaje de error si una consulta ha fracasado.
  • getNumberError: muestra el último número de error si una consulta ha fracasado.

Sobre el autor

Imagen de Pablo Enrique Fernández Casado
Pablo Enrique Fernández Casado

CEO de IslaVisual, Manager, Full Stack Analyst Developer y formador por cuenta ajena con más de 25 años de experiencia en el campo de la programación y más de 10 en el campo del diseño, UX, usabilidad web y accesibilidad web. También es escritor y compositor de música, además de presentar múltiples soft kills como la escucha activa, el trabajo en equipo, la creatividad, la resiliencia o la capacidad de aprendizaje, entre otras.

Especializado en proveer soluciones integrales de bajo coste y actividades de consultoría de Usabilidad, Accesibilidad y Experiencia de Usuario (UX), además de ofrecer asesoramiento en SEO, optimización de sistemas y páginas web, entre otras habilidades.