Child pages
  • Les bonnes pratiques de la classe Db sur Prestashop 1.4

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

La grande majorité des modules et des développements à effectuer sur PrestaShop nécessitent d'utiliser ou d'insérer des informations dans la base de données. L'utilisation de la classe cœur DB coeur DB est donc une étape obligatoire pour tout développeur. En plus de fournir une abstraction potentielle pour d'autres types de bases de données relationnelles, la classe DB fournit plusieurs outils destinés à simplifier la vie !

...

DB est un pseudo singleton, elle peut tout de même être instanciée au besoin manuellement car le constructeur est public, mais au sein de PrestaShop il est demandé d'accéder à l'instance comme ceci :

Code Block

$db = Db::getInstance();

Dans certains cas vous croiserez des appels comme ceci dans le code :

Code Block

$db = Db::getInstance(_PS_USE_SQL_SLAVE_);

...

Exemple fictif :

Code Block

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

L’appel à cette méthode produit la requête SQL suivante :

Code Block

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

...

Cette méthode est l’équivalent de autoExecute() en version DELETE. Elle est à utiliser pour les mêmes raisons. L’argument $limit permet de limiter le nombre d’enregistrements que l’on souhaite supprimer. L’autre avantage d’utiliser cette méthode est qu’elle sera utilisée par le système de cache des requêtes SQL de PrestaShop et effacera donc les requêtes concernées en cache sauf si l’argument $use_cache vaut false.

Exemple :

Code Block

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

va générer la requête

Code Block

DELETE FROM target_table WHERE myField < 15 LIMIT 3

...

Cette méthode exécute la requête SQL donnée. Elle n’est à utiliser que pour les requêtes en écriture (INSERT, UPDATE, DELETE, TRUNCATE…) car elle supprime de plus le cache de requêtes (sauf si l’argument $use_cache vaut false).

Exemple :

Code Block

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

...

Cette méthode exécute la requête SQL donnée et charge l’ensemble des résultats qu’elle retourne dans un tableau multidimensionnel. Elle n’est à utiliser que pour les requêtes en lecture (SELECT, SHOW, etc.). Les résultats de cette requête seront mis en cache, sauf si l’argument $use_cache vaut false. Le second argument $array est déprécié et ne doit plus être utilisé, laissez-le à true.

Exemple :

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 />’;

...

Attention : cette méthode ajoute automatiquement une clause LIMIT à la requête. Veillez à ne pas en ajouter une vous-même manuellement.

Exemple :

Code Block

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

...

Attention : cette méthode ajoute automatiquement une clause LIMIT à la requête. Veillez à ne pas en ajouter une vous-même manuellement.

Exemple :

Code Block

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

...