Child pages
  • Buenas prácticas de Clase DB para Prestashop 1.4

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Buenas prácticas de Clase DB Prestashop 1.4

Este artículo fue escrito por Raphaël Malié, y publicado por primera vez en el blog de PrestaShop, el 8 de agosto de 2011.

Introducción

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 hacer la vida más fácil.

Aprenda sobre los distintos métodos, el momento de usarlos y las mejores prácticas para la etapa de desarrollo.

Conceptos básicos de clase

La clase DB se compone de dos clases:

  • Clase DB en el archivo ~/classes/Db.php es abstracta
  • Clase MySQL en el archivo ~/classes/MySQL.php se basa en DB

A pesar de que DB es seudo único, aún se puede activar manualmente si es necesario cuando el desarrollador se encuentre público. Sin embargo, en PrestaShop debe ser accedido como sigue:

Code Block
$db = Db::getInstance();

En algunos casos, puede ver las peticiones según el siguiente código:

Code Block
$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.

Métodos Diversos

Método autoExecute()

Este método genera automáticamente la inserción o actualización de la base desde una tabla de datos. Este método debe utilizarse en lugar de hacer peticiones INSERT o UPDATE a menos que estas peticiones sean un poco más complejas (con funciones SQL, consultas intersecadas, etc.). La ventaja de utilizar un método para realizar todo es que centraliza las peticiones. Puede editar este método utilizando el sistema de reemplazo de PrestaShop cuando existe un proceso en particular para aplicar a las tablas durante la inserción.

Ejemplo ficticio:

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

Solicitar este método ofrece como resultado la siguiente consulta SQL:

Code Block
INSERT INTO `target_table` (`id_target`, `name`) VALUES (10, 'myName')

Importante :

  • Asegúrese siempre de que sus 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’); ).

Método autoExecuteWithNullValues()

Este método realiza lo mismo que autoExecute() pero con una sutil diferencia: las cadenas vacías y los valores nulos son sustituidos por NULLs de SQL. Este método puede ser utilizado si sus campos aceptan valores nulos y resulta en que ellos sean NULL en vez de una cadena vacía.

Este método es especialmente útil al utilizar incremento automático para ingresar una entrada vacía en una tabla. La clave única en el incremento automático se ingresará como NULL evitando así una consulta de entrada sin ningún campo.

Método de eliminación ($table, $where = false, $limit = false, $use_cache = 1)

Este método es la versión DELETE de autoExecute(). Puede ser utilizado para el mismo propósito. El argumento $limit limita el número de elementos guardados que usted 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 falso.

Ejemplo :

Code Block
Db::getInstance()->delete(‘target_table’, ‘myField < 15’, 3);

will generate the following query:

Code Block
DELETE FROM target_table WHERE myField < 15 LIMIT 3

Método execute($sql, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida. 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 falso).

Ejemplo:

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

Método executeS($sql, $array = true, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida 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 falso. El segundo argumento $array es depreciado y no debe ser utilizados, déjelo como verdadero.

Ejemplo :

Code Block
$sql = ‘SELECT * FROM ‘._DB_PREFIX_.’shop’;
if ($results = Db::getInstance()->ExecuteS($sql))
	foreach ($results as $row)
		echo $row[‘id_shop’].’ :: ‘.$row[‘name’].’<br />’;

Método getRow($sql, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida 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 falso.

Advertencia: este método agrega automáticamente una cláusula LIMIT a la consulta. Asegúrese de no agregar una manualmente.

Ejemplo :

Code Block
$sql = ‘SELECT * FROM ‘._DB_PREFIX_.’shop
	WHERE id_shop = 42’;
if ($row = Db::getInstance()->getRow($sql))
	echo $row[‘id_shop’].’ :: ‘.$row[‘name’];

Método getValue($sql, $use_cache = 1)

Este método ejecuta la consulta SQL ofrecida y sólo recoge el primer resultado en la primera línea. Sólo debe ser utilizado con consultas de sólo lectura (SELECT, SHOW, etc.) Los resultados de la consulta se almacenan en caché a menos que el argumento $use_cache sea falso.

Advertencia: este método agrega automáticamente una cláusula LIMIT a la consulta. Asegúrese de no agregar una manualmente.

Ejemplo :

Code Block
$sql = ‘SELECT COUNT(*) FROM ‘._DB_PREFIX_.’shop’;
   $totalShop = Db::getInstance()->getValue($sql);

Método NumRows()

Este método almacena en caché y muestra el número de resultados de la última consulta SQL.

Advertencia: este método no es depreciado, pero le recomendamos no utilizarlo por razones de mejor práctica. En realidad, es mejor recoger el número de resultados a través de una consulta SELECT COUNT( * ) de antemano.

Otros métodos

  • 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