Line 60:
Line 60:
A ce jour, très peu de fonctions respectent ce standard mais c'est celui vers lequel il faut tendre.
A ce jour, très peu de fonctions respectent ce standard mais c'est celui vers lequel il faut tendre.
−
= Normes SQL =
+
= SQL rules =
−
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d'éviter les confusions. Exemple:
+
* All SELECT * are forbidden ! Any SELECT must define complete list of fields to get. This avoid confusion. Example:
<source lang="sql">
<source lang="sql">
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = '$id'
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = '$id'
Line 69:
Line 69:
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d'une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l'impression qu'il n'y a pas de problème. Et c'est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d'une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l'impression qu'il n'y a pas de problème. Et c'est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.
−
Exemple:
+
Example:
<source lang="sql">
<source lang="sql">
−
Bon: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', 412.62)
+
Good: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', 412.62)
−
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', '412.62')
+
Bad: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', '412.62')
</source>
</source>
Line 84:
Line 84:
* Dolibarr doit fonctionner même avec l'option '''strict''' de Mysql active.
* Dolibarr doit fonctionner même avec l'option '''strict''' de Mysql active.
+
Pour l'activer, ajouter la ligne suivante dans le fichier config du serveur Mysql (my.cnf)
+
<source lang="ini">
+
sql-mode="STRICT_ALL_TABLES"
+
</source>
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S'il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d'avoir une meilleure portabilité du code mais surtout d'avoir une gestion correcte des TimeZone.
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S'il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d'avoir une meilleure portabilité du code mais surtout d'avoir une gestion correcte des TimeZone.