¿Cómo usar las tablas MySQL en Prestashop?

¿Cómo usar las tablas MySQL en Prestashop?

5/5 (1)

Muchas veces necesitaremos trabajar con los datos de la base de datos que tenemos en la página web. ¿Cómo lo haremos?

Para empezar, debemos tener en cuenta que prestashop tiene sus propias funciones para ejecutar consultas en Bases de Datos. Tiene las funciones de seleccionar (executeS y getRow), actualizar (update), insertar (insert) y eliminar (delete) y ejecutar SQL directamente (execute). Aquí las conocerás:

Db::getInstance()->executeS()

El executeS() ejecuta un SELECT. Es la función más simple que tiene el Db de prestashop. Un ejemplo sería

Si queremos seleccionar todo de la tabla ps_product, sería así:

Db::getInstance()->executeS('SELECT * FROM '._DB_PREFIX_.'product');

Como verás no he puesto ps_product, sino ‘._DB_PREFIX_.’product. De esta manera Prestashop pone automáticamente el prefijo a la tabla. Muy recomendable utilizarlo por si en un futuro se cambia el prefijo de las tablas.

Db::getInstance()->getRow()

La función getRow() de prestashop sirve para hacer un select pero sólo se cogerá la primera línea. Es decir, le pone automáticamente un LIMIT 1 al final de la función.

Si usamos el mismo caso que el anterior sería así:

Db::getInstance()->getRow('SELECT * FROM '._DB_PREFIX_.'product');

A diferencia del anterior, en este caso sólo nos cogería el primer producto. Esto es muy util para coger datos indicando cuál es el id. De esta manera:

$id_product = 1; // Le pasarías la variable id_product
Db::getInstance()->getRow('
SELECT * FROM '.DB_PREFIX.'product
WHERE id_product = '.(int)$id_product
);

Db::getInstance()->getValue()

La función getValue() de prestashpo sirve para hacer un select y coger sólo el valor que estamos buscando.

Siguiendo con el caso anterior, si queremos coger el id_category_default, por ejemplo, podemos ejecutar lo siguiente:

$id_product = 1; // Le pasarías la variable id_product
Db::getInstance()->getValue('SELECT id_category_default
   FROM '._DB_PREFIX_.'product
   WHERE id_product = '.(int)$id_product
  );
);

Db::getInstance()->insert()

El insert() nos sirve para insertar datos en las tablas. Con los siguientes parámetros:

Db::getInstance()->insert(nombre_tabla, array(columna => datos));

Por ejemplo, si queremos insertar en la tabla ps_nombre_tabla los valores ‘id_tabla’, ‘nombre’, ‘edad’ sería el siguiente formato:

Db::getInstance()->insert('nombre_tabla',  array('id_tabla' => 1, 'nombre' => 'UriMarti', 'edad' => 29));

Como véis se inserta en la tabla prefijo_nombre_tabla los datos en forma de array. Asignamos a la id_tabla, el número 1, al nombre UriMarti i a la edad 29. Para hacerlo más limpio, recomiendo poner los datos en un array fuera de la función. Cuestión de limpieza dentro del código. De esta manera:

$insert = array(
'id_tabla' => 1,
'nombre' => 'UriMarti',
'edad' => 29
);
Db::getInstance()->insert('nombre_tabla', $insert);

Db::getInstance()->update()

La función update() es para actualizar datos de la tabla que indiquemos.

Funciona de la siguiente manera:

Db::getInstance()->update(‘tabla’, array(‘celda’ => ‘datos), ‘where … ‘);

Un ejemplo, sería si queremos actualizar en la tabla ps_product el campo active a 1 del id_product 50 sería así:

Db::getInstance()->update('product', array('active' => 1), 'id_product = 50');

A tener en cuenta:

  • el WHERE no se escribe. Se ponen los parámetros directamente. Si hay un AND se puede poner sin problemas.
  • El nombre de la tabla va sin el prefijo de prestashop (por defecto el ps_)
  • Se pueden poner los datos que queramos dentro del array.

Un ejemplo más complejo. Ahora actualizaremos el active = 1 y el id_manufacturer = 10 dónde los productos estén desactivados (active = 0) y dónde los id_product sean mayores a 100:

// para hacerlo más cómodo, el array lo declaramos fuera
$data = array(
'active' => 1,
'id_manufacturer' => 10
);
Db::getInstance()->update('product', $data, 'id_product > 100 AND active = 0');

En el campo del WHERE se pueden poner variables. Si quieres actualizar datos dónde el id_product = $id_product sería así:

// para hacerlo más cómodo, el array lo declaramos fuera
$data = array(
     'active' => 1,
     'id_manufacturer' => 10
 );
$id_product = 1; // variable $id_product;
Db::getInstance()->update('product', $data, 'id_product = '.(int)$id_product);

Db::getInstance()->delete()

El delete() sirve para eliminar datos de la tabla. Utiliza el siguiente formato:

Db::getInstance()->delete('nombre_tabla', 'WHERE');

Como en update() e insert(), el nombre de la tabla va sin el _DB_PREFIX_ (ps_) delante. El Where, no se escribe y se pueden poner operadores de SQL dentro.

Por ejemplo, si queremos eliminar de la tabla ps_product todos los productos que estén desactivados (active = 0) sería así:

Db::getInstance()->delete('product', 'active = 0);

Como en los casos anteriores, se pueden pasar variables. Por ejemplo:

$id_product = 1; // pasamos la variable
Db::getInstance()->delete('product', 'id_product = '.(int)$id_product);

Db::getInstance()->execute()

El execute() sirve para ejecutar SQL directamente. Yo sólo lo recomiendo para crear tablas. Ya que para UPDATE, SELECT o INSERT tenemos las funciones anteriores.

Para crear una tabla sería así:

 Db::getInstance()->execute('CREATE TABLE IF NOT EXISTS '._DB_PREFIX_.'clientes (
   id_cliente int(11) NOT NULL AUTO_INCREMENT PRIMARY,
   profesion text NOT NULL,
 ) ENGINE='.MYSQL_ENGINE.' DEFAULT CHARSET=utf8');

Buenas prácticas de las Base de Datos en Prestashop

Como trabajar con las Base de Datos en Prestashop es muy delicado a la hora de manipular los datos es necesario, o muy recomendable, asegurarnos con qué tipo de datos estamos trabajando.

Usar texto html en Base de Datos

Para utilizar html o texto en la base de datos es muy recomendable usar el pSQL($texto) de Prestashop. De esta manera nos aseguramos que no nos atacará la base de datos con datos corruptos o inyecciones html.

Por ejemplo, si queremos insertar en el campo de ps_product_lang la description del producto deberíamos hacer así:

$description = '<p>El campo de descripción [...]</p>';
Db::getInstance()->update(
'product_lang',
array('description' => pSQL($description),
'id_product = '.(int)$id_product.' AND id_lang = '.(int)$id_lang
);

Usar datos en Base de Datos de Prestashop

Para los datos más generales tenemos las asignaciones de tipo de php:

  • (int) Para números enteros. (int)$id_product;
  • (bool) Para booleanos (true y false). (bool)$active;
  • (float) Para números con comas. (float)$price;

Valoración de la Información

1 comentario

  1. Muy buen artículo.
    Y si lo que queremos es actualizar una tabla a través de un .csv, en un campo file del form, cómo se haría?
    Gracias

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *