Pitchoune
10/07/2005, 17h03
Les documents de cette partie sont fait pour guider les personnes qui écrivent du code pour modifier vBulletin.
Couleurs clés des exemples de code :
$code = red_code($var); Ne pas coder de cette façon
$code = normal_code($var); Coder plutôt comme cela
$_GET / $_POST / $_REQUESTAfin d'assurer que la donnée soit au format souhaité, les rangées superglobaux PHP suivantes ne sont pas directement accessibles sous plusieurs situations :
$_GET
$_POST
$_REQUEST
$_COOKIE
$_FILESL'accès direct à ces variables sont avec $_POST['do'] et $_GET['do'], qui sont utilisées pour contrôler les variables afin de décider quel branche d'un script qui doit être utilisée. Il peut aussi exister des cas très spécifiques où l'accès direct est requis mais doit être évité le plus possible. N'utilisez pas les variables $_GET / $_POST / $_REQUEST etc... dans les templates.
clean_gpc() et clean_array_gpc(), membres de la classe d'insertion de données vBulletin sont utilisés pour nettoyer les données envoyés par l'utilisateur.
Les types de données valides sont :
TYPE_BOOL - Booléen
TYPE_INT - Numérique
TYPE_UINT - Numérique positif
TYPE_NUM - Décimal
TYPE_UNUM - Décimal positif
TYPE_UNIXTIME - Format de la date Unix (Numérique positif)
TYPE_STR - Chaîne de caractère coupée (Nettoyage simple)
TYPE_NOTRIM - Chaîne de caractère
TYPE_NOHTML - Chaîne de caractère coupée envoyée dans la fonction htmlspecialchars_uni()
TYPE_ARRAY - Rangée
TYPE_FILE - Fichier
TYPE_NOCLEAN - Non validéChacun des types de données autre que TYPE_NOCLEAN, peut aussi avoir un type d'une rangée de données correspondant qui force une rangée de ce type de données, par exemple : TYPE_ARRAY_BOOL.
Les valeurs nettoyées sont accessibles via la rangée $vbulletin->GPC en utilisant la valeur du nom du champ en tant qu'index dde la rangée, par exemple $vbulletin->GPC['champ1']. Vous pouvez vous assurer que la valeur dans la rangée $vbulletin->GPC est du type spécifié, peu importe ce qui peut avoir été défini dans la rangée Superglobale. Par exemple, si vous spécifiez TYPE_NOHTML, vous pouvez afficher cette variable directement en HTML sans avoir la crainte à propos du code HTML sécurisé.
Le premier paramètre des fonctions clean_gpc() et clean_array_gpc() est l'initiale de la rangée Superglobale auquel vous souhaitez effectuer un nettoyage de données. Vous pouvez seulement nettoyer les données d'une rangée Superglobale avec un simple appel de clean_gpc() ou clean_array_gpc(). Vous ne pouvez pas nettoyer les rangées Superglobales $_COOKIE et $_POST en un seul appel, vous devez faire plusieurs appels. Toutes les valeurs seront envoyées dans la même rangée $vbulletin->GPC pour s'assurer que les noms des champs ne se chevauchent pas.
Note:
Les valeurs de $_COOKIE doivent être accessibles en utilisant COOKIE_PREFIX :
$vbulletin->input->clean_gpc('c', COOKIE_PREFIX . 'forum_view', TYPE_STR);
$foo = $vbulletin->GPC[COOKIE_PREFIX . 'forum_view'];
$db->query("
UPDATE " . TABLE_PREFIX . "table SET
champ_premier = '" . $db->escape_string(trim($_POST['champ_premier'])) . "',
champ_second = '" . $db->escape_string(htmlspecialchars_uni(trim($_POST['champ_second']))) . "'
WHERE cle_trouver = " . intval($_POST['cle_trouver']) . "
");
$vbulletin->input->clean_gpc('p', array(
'champ_premier' => TYPE_STR,
'champ_second' => TYPE_NOHTML,
'cle_trouver' => TYPE_INT
));
/* Cette valeur est accessible soit par $variable_nettoyee ou $vbulletin->GPC['champ_premier'] */
$variable_nettoyee =& $vbulletin->input->clean_gpc('p', 'champ_premier', TYPE_STR);
$db->query("
UPDATE " . TABLE_PREFIX . "table SET
champ_premier = '" . $db->escape_string($vbulletin->GPC['champ_premier']) . "',
champ_second = '" . $db->escape_string($vbulletin->GPC['champ_second']) . "'
WHERE cle_trouver = " . $vbulletin->GPC['cle_trouver'] . "
");
AccoladesLes accolades devraient être placés sur une nouvelle ligne à chaque fois.
if ($condition_premiere)
{
// faire quelque chose
}
else if ($condition_seconde)
{
// faire quelque chose d'autre
}
else
{
// ne rien faire
}
Utilisez toujours les accolades, même pour les boucles et embranchements qui contiennent qu'une seule ligne de commande.
if ($condition_premiere)
// faire quelque chose
else
if ($condition_seconde)
// faire quelque chose d'autre
else
// ne rien faire
if ($condition_premiere)
{
// faire quelque chose
}
else
{
if ($condition_seconde)
{
// faire quelque chose d'autre
}
else
{
// ne rien faire
}
}
AND / and / && OR / or / || etc...Utilisez « AND » au lieu de « and » ou « && », et « OR » au lieu de « or » ou « || ».
if ($var1 && $var2 || $var3)
if ($var1 and $var2 or $var3)
if ($var1 AND $var2 OR $var3)
Mettez en majuscules « AS » dans la fonction foreach.
foreach($array AS $key => $val)
{
// faire quelque chose
}
Boucles et embranchementsLes commandes des boucles et des embranchements (incluant la fonction foreach) doivent être séparé d'un espace avant d'ouvrir les parenthèses.
for ($i =0; $i < 10; $i++)
{
// faire quelque chose
}
while ($result = $db->fetch_array($results))
{
// faire quelque chose
}
if ($condition != 'quelquechose')
{
// faire quelque chose
}
foreach ($array AS $key => $val)
{
// faire quelque chose
}
« else if » est préconisé face à « elseif ».
if ($condition)
{
// faire quelque chose
}
else if ($condition_seconde)
{
// faire quelque chose d'autre
}
Commenter le codeUtilisez le type de commentaire // pour une ligne ou quelques courtes lignes de descrption, ou la syntaxe /* .... */ pour un grand bloc.
// Ceci est une simple ligne de commentaire
// Ceci est un court descriptif qui vous
// indique comment commenter
/*
Ceci est un
long commentaire
qui peut prendre
plusieurs lignes...
*/
Les commentaires doivent précéder le code qu'ils décrivent, comme suit :
$var = 0; // initialise $var
if ($var) // vérifie $var
// initialise $var
$var = 0;
// vérifie $var
if ($var)
Quand vous commentez des branches ou des embranchements, il est accepté de mettre du commentaire entre les accolades.
if ($var)
{
// $var est vrai donc exécuter le code suivant
echo $var;
}
Séparez les branches « do » et les gros blocs majeurs du code avec le commentaire en exemple ci-dessous. Il est suggéré de copier cette ligne et de l'insérer automatiquement dans votre éditeur PHP. Si vous souhaitez indiquer ce que fait la branche « do », ajoutez un commentaire juste après la ligne de commentaire.
require_once(./global.php);
// ################################################## ###########################
if (empty($_REQUEST['do']))
{
$_REQUEST['do'] = 'modify';
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'edit')
{
// code de modification
}
// ################################################## ###########################
// lister les objets dans un tableau
if ($_REQUEST['do'] == 'modify')
{
// code pour lister
}
Préfixez les définitions des fonctions PHP avec la ligne de commentaire suivante. Encore une fois, vous devriez inclure cette ligne automatiquement dans votre éditeur PHP.
// ###################### Démarrer is_something ######################
function is_something()
{
return iif($var, true, false);
}
// ###################### Démarrer fetch_uppercase ######################
function fetch_uppercase($var)
{
return strtoupper($var);
}
Comparaison de variables, etc...Les standards suivants doivent être suivies :
if (empty($array)) // vrai si $array est vide
if ($string == '') // vrai si $string a aucun contenu
if ($integer) // vrai si $integer n'est pas 0
if (!$integer) // vrai si $integer est 0
if ($boolean) // vrai si $boolean est vrai
if (!$boolean) // vrai si $boolean est faux
Si le type de donnée est important, utilisez === et !==.
if ($boolean === true) // vrai si $boolean est vrai, faux si $boolean est un nombre positif
if ($integer !== 0) // vrai si integer n'est pas 0, faux si $integer est vrai
Notez ce qui suit :
$integer = 0;
if ($integer = '') // retournera vrai
$string = '';
if ($string == '0') // retournera vrai
$string = '0';
if ($string == '') // retournera vrai
Fonction retournant des valeurs booléennesÀ moins qu'il n'y ait une bonne raison d'utiliser 1/0, à cause de la possibilité d'obtenir la valeur de retour 2, utilisez true/false comme valeurs de retour pour des fonctions.
function is_three($var)
{
if ($var == 3)
{
return 1;
}
else
{
return 0;
}
}
function is_three($var)
{
if ($var == 3)
{
return true;
}
else
{
return false;
}
}
Utilisez true/false au lieu de TRUE/FALSE. Réservez les versions en majuscules pour les constantes personnalisées.
if ($var === TRUE)
if ($var === true)
Guillemets et chaînesLes chaînes doivent être entre simple guillemets (') si elles contiennent aucune variable ou de caractère de contrôle, sinon utilisez les guillets normaux (").
$flat_string = 'Salut, ceci est une chaîne.';
$dynamic_one = "Salut,\n ceci est une chaîne.";
$dynamic_two = "Salut $username,\n ceci est une chaîne.";
Choisir entre les ' et les " est selon ce que vous souhaitez faire, dépendant des circonstances.
$string_one = "L'heure actuelle est $timenow et la date est $datenow";
$string_two = 'L\'heure actuelle est ' . $timenow . ' et la date est ' . $datenow . '.';
Les requêtes SQL doivent toujours être ainsi :
$results = $db->query("SELECT field FROM " . TABLE_PREFIX . "table AS table");
Les variables ne doivent pas être entourées de guillemets si cela n'est pas nécessaire.
$var = "$x";
$result = strtoupper("$string");
$var = $x;
$result = strtoupper($string);
$string = fetch_something("quelquechose$var");
Les appels eval() doivent avoir des guillemets simples (') si possible, afin d'éviter d'implanter des caractères inutiles.
eval("\$template = \"" . fetch_template('template') . "\";");
eval('$template = "' . fetch_template('template') . '";');
Guillemets et les tableaux de valeursLes clés de tableau doivent être entourées de guillemets si ce sont des chaînes ou des variables, même si vous savez que la variable évalue un entier. Les types de guillemets utilisés doivent suivre ce qui est indiqué ci-dessous. Notez que $var = array[$cle]; causera une erreur de formatage (parse error) si $cle n'est pas entre guillemets et si c'est une valeur négative, et causera une notice si $cle est une chaîne ou n'est pas entre guillemets.
$a = $userinfo[12];
$b = $userinfo['username'];
$c = $userinfo["$champ"];
Des clefs de tableau composées doivent citer la variable la plus éloignée.
$a = $userinfo["$var[12]"];
$b = $userinfo["$var[username]"];
$c = $userinfo["$var[champ]"];
Les tableaux composés de chaînes entourés de guillemets doivent évités d'être si possible en dehors de la chaîne avec le point opérateur, bien que ceci soit absolument inévitable, la syntaxe {...} peut être utilisée.
$a = "Salut, mon nom est $userinfo[12], comment allez-vous ?";
$b = "Salut, mon nom est $userinfo[username], comment allez-vous ?";
$c = "Salut, mon nom est $userinfo[$champ], comment allez-vous ?";
$d = 'Salut, mon nom est ' . $userinfo["$var[champ]"] . ', comment allez-vous ?';
$e = "Salut, mon nom est {$userinfo[$var[username]]}, comment allez-vous ?";
Nommer les embranchements « do »La plupart des pages vBulletin contient des embranchements « do ». Les nominations ci-dessous sont à suivre.
if (empty($_REQUEST['do']))
{
// définition de la branche par défaut pour ce script
$_REQUEST['do'] = 'modify';
}
// ################################################## ###########################
if ($_POST['do'] == 'kill')
{
// 'kill'
// code à exécuter pour supprimer un objet de la base de données
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'delete')
{
// 'delete'
// affichage du mesage de confirmation
}
// ################################################## ###########################
if ($_POST['do'] == 'insert')
{
// 'insert'
// code à exécuter pour insérer un nouvel objet dans la base de données
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'add')
{
// 'add'
// affichage du formulaire pour ajouter un nouvel objet
}
// ################################################## ###########################
if ($_POST['do'] == 'update')
{
// 'update'
// code à exécuter pour mettre à jour un objet dans la base de données
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'edit')
{
// 'edit'
// affichage du formulaire de modification d'un objet
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'modify')
{
// 'modify'
// affichage de la branche par défaut de ce script
}
Autant que possible, gardez les embranchements dans l'ordre listée ci-dessus, avec 'modify' (l'action par défaut) le plus en bas du script.
Si un script contient des embranchements en plus de edit/add/delete (comme template.php qui modifie les styles et les templates), vous devez placer un suffixe pour les noms des embranchements kill/delete/insert/add/update/edit avec le type d'objet.
if ($_REQUEST['do'] == 'edittemplate')
{
// affichage du formulaire pour modifier un template
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'editstyle')
{
// affichage du formulaire pour modifier un style
}
Si la fonctionnalité « do » d'un embranchement ne correspond pas à edit, update, add, insert, delete ou kill, donnez-lui un nom qui permet de récapituler l'embranchement.
if ($_REQUEST['do'] == 'rebuildstylecache')
{
// régénère le cache des styles
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'updatetemplateparentlists')
{
// mettre à jour la liste des parents des templates
}
Gardez les groupes des embranchements applicables à un type d'objet simple dans le script.
// if (empty($_REQUEST['do']))
// if ($_REQUEST['do'] == 'rebuildstylecache')
// if ($_POST['do'] == 'killstyle')
// if ($_REQUEST['do'] == 'deletestyle')
// if ($_POST['do'] == 'insertstyle')
// if ($_REQUEST['do'] == 'addstyle')
// if ($_POST['do'] == 'updatestyle')
// if ($_REQUEST['do'] == 'editstyle')
// if ($_REQUEST['do'] == 'updatetemplateparentlists')
// if ($_POST['do'] == 'killtemplate')
// if ($_REQUEST['do'] == 'deletetemplate')
// if ($_POST['do'] == 'inserttemplate')
// if ($_REQUEST['do'] == 'addtemplate')
// if ($_POST['do'] == 'updatetemplate')
// if ($_REQUEST['do'] == 'edittemplate')
// if ($_REQUEST['do'] == 'modify')
Nommer les fonctionsLes noms des fonctions personnalisées doivent (autant que possible) décrire ce qu'ils font, pour qu'une prsonne qui lise le code puisse savoir comment l'utiliser et puisse savoir sa fonction par son nom.
Les noms des fonctions personnalisées doivent écrit en minuscules et doit utiliser les sous-tirets ( _ ) pour séparer les mots.
$var2 = issomething($var1);
$var2 = isSomething($var1);
$var2 = is_something($var1);
Les noms des fonctions personnalisées doivent suivre les modèles suivants :
print_Fonctions qui envoie directement le code dans le navigateur ou dans des variables type echo ou print.
print_input_row
print_standard_error
print_cp_header
construct_Fonctions qui retournent des variables HTML pour un affichage ultérieur.
construct_edit_toolbar
construct_forum_jump
is_contains_Fonctions qui retournent true/false basé sur des conditions.
is_valid_email
is_wysiwyg_compatible
contains_bbcode_img_tags
can_Fonctions qui retournent des true/false basés sur des permissions.
can_moderate
can_administer
can_announce
verify_Fonctions qui vérifie les conditions et qui affiche un message d'erreur si une condition n'est pas acceptée.
verify_ip_ban
verify_post_errors
verify_word_allowed
convert_Fonctions qui convertit une variable d'entrée d'un format de donnée à un autre format de donnée.
convert_kb_to_mb
convert_html_to_bbcode
convert_bits_to_array
cache_Fonctions qui lit les données de la base de données (habituellement) et crée un cache de variables PHP pour alléger la charge SQL.
cache_templates
cache_forums
cache_birthdays
fetch_Fonctions qui retourne des tableaux / chaînes / entiers etc... Si le type de donnée à être retourné n'est pas explicite dans le nom de la fonction (comme fetch_userinfo ou fetch_template), spécifiez le type de donnée dans le nom de la fonction, comme fetch_template_update_sql, fetch_replaced_session_url, fetch_reminders_array, etc...
fetch_template
fetch_user_search_sql
fetch_user_location_array
process_Fonctions qui exécute des actions sur un tableau de valeurs afin de le préparer pour une référence plus tard.
process_thread_array
process_post_preview
process_online_location
build_Fonctions qui sauvegarde les données dans la base de données pour une recherche plus tard, comme mettre en cache les anniversaires dans la table datastore, régénérer la table style, etc...
build_bbcode_cache
build_new_post
build_attachment
delete_Fonctions qui supprime quelque chose de la base de données.
delete_thread
delete_post_index
delete_user_pms
undelete_Fonctions inverse de la suppression.
undelete_thread
undelete_post
import_Fonctions du système d'importation qui prend une rangée de donnée et qui l'insère en tant que message/discussion/utilisateur (etc...) dans la base de données.
import_thread
import_post
import_user
sanitize_Fonctions qui exécutent des actions sur les paramètres d'entrée pour les garder en mémoire pour l'étape suivante, comme retirer les caractères interdits, vérifier si une date est valide, qu'une valeur $perpage a un sens, etc...
sanitize_perpage
sanitize_url
sanitize_reminder_date
parse_Fonctions qui intialise le formatage des balises BB en quelque sorte.
parse_bbcode
parse_usernote_bbcode
parse_pm_bbcode
handle_Fonctions qui sont appelées par le formateur de balises BB pour échanger avec un type particulier de balise BB.
handle_bbcode_img
handle_bbcode_list
handle_bbcode_parameter
file_Fonctions qui crée des échanges directement dans le système de fichiers.
file_read
file_download
file_append
log_Fonctions qui touche aux journaux de vBulletin.
log_admin_action
log_vbulletin_error
log_upgrade_step
exec_Fonctions qui actuellement exécute une action au lieu de retourner quelque chose.
exec_shutdown
exec_queries
exec_cron
sort_Fonctions qui trie les données.
sort_search_items
sort_threaded_posts
strip_Fonctions qui trie les éléments des chaînes.
strip_bbcode
strip_blank_ascii
strip_empty_bbcode
xml_Fonctions qui lit ou sort du XML.
xml_import_style
xml_parse_language_otag
xml_escade_cdata
vb_ ou vbFonctions qui remplace des fonctions PHP par des remplacements vBulletin dessinés pour étendre les fonctionnalités ou pour modifier la fonction originale. Si la fonction originale contient des sous-tirets ( _ ), la fonction sera préfixée par « vb_ » au lieu de « vb ».
vbmail
vb_number_format
vbsetcookie
js_Fonctions Javascript définis dans le code PHP (plutôt que d'être dans des fichiers .js).
js_dots
js_confirm_clear_db
js_forum_jump
RetraitToujours utiliser une seule tabulation pour chaque retrait.
function construct_something($var)
{
global $vbulletin;
if ($vbulletin->options['somevar'])
{
if ($var == 'quelquechose')
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
Syntaxe des requêtes SQLToujours mettre les requêtes entre des guillemets (").
$db->query('SELECT champ FROM ' . TABLE_PREFIX . 'table ORDER BY champ');
$db->query("SELECT champ FROM " . TABLE_PREFIX . "table ORDER BY champ");
Les appels dans la fonction SQL ne doivent pas contenir d'espaces.
$db->query("SELECT COUNT(*) AS records, SUM(champ_premier) AS total FROM " . TABLE_PREFIX . "table");
Si la chaîne de la requête est trop longue et qu'il est préférable de l'écrire en plusieurs lignes, faites ceci et mettez le mot-clé de cause au début de la ligne de la façon suivante : double guillemets ("), retour à la ligne, retrait, [chaîne de la requête], retour à la ligne, retrait, double guillemets (").
$results = $db->query("SELECT champ_premier, champ_second, champ_troisieme,
IF(champ_quatrieme = 'Oui', 1, 0) AS champ_quatrieme,
FROM " . TABLE_PREFIX . "table_premiere AS table_premiere
LEFT_JOIN " . TABLE_PREFIX . "table_second AS table_second USING(champ_premier)
WHERE table_premier.champ_second IN('bla bla bla', 'moo moo moo')
ORDER BY table_premier.champ_premier DESC
LIMIT 5, 10");
$results = $db->query("
SELECT champ_premier, champ_second, champ_troisieme,
IF(champ_quatrieme = 'Oui', 1, 0) AS champ_quatrieme,
FROM " . TABLE_PREFIX . "table_premiere AS table_premiere
LEFT_JOIN " . TABLE_PREFIX . "table_second AS table_second USING(champ_premier)
WHERE table_premiere.champ_second IN('bla bla bla', 'moo moo moo')
ORDER BY table_premiere.champ_premier DESC
LIMIT 5, 10
");
Les clauses « AND » additionnelles dans la clause WHERE doivent être en retrait si il y en a plusieurs.
$results = $db->query("
SELECT champ_premier, champ_second
FROM " . TABLE_PREFIX . "table AS table
WHERE champ_premier IN(3,4,5)
AND champ_second <> ''
AND champ_troisieme = 'quelquechose'
ORDER BY champ_premier
");
Ne pas mettre entre guillemets des valeurs numériques dans le requêtes SQL, utilisez intval() ou $var += 0; pour vous assurer que la variable est sûre.
$db->query_first("SELECT quelquechose FROM table WHERE tableid = '$valeur_numerique'");
$db->query_first("SELECT quelquechose FROM table WHERE tableid = '" . intval(valeur_numerique') . "'");
$db->query_first("SELECT quelquechose FROM table WHERE tableid = " . intval(valeur_numerique));
$valeur_numerique = intval($valeur_numerique);
$db->query_first("SELECT quelquechose FROM table WHERE tableid = $valeur_numerique");
Ne pas spécifier de longueur pour les champs numériques à moins de spécifier « UNSIGNED ZEROFILL ».
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_quatrieme SMALLINT(5) UNSIGNED NOT NULL,
ADD champ_cinquieme INT(10) UNSIGNED NOT NULL
");
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_quatrieme SMALLINT UNSIGNED NOT NULL,
ADD champ_cinquieme INT UNSIGNED NOT NULL
");
Ne pas utiliser le mot-clé « AFTER » dans une requête « ALTER ». Certains serveurs ont des soucis avec le mot-clé « AFTER », il est préférable de ne pas l'utiliser.
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_sixieme INT UNSIGNED NOT NULL AFTER champ_cinquieme
");
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_sixieme INT UNSIGNED NOT NULL
");
Les formats des requêtes INSERT / REPLACE doit être celui-ci :
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_premier, champ_second, champ_troisieme)
VALUES
(1, 2, 'moo'),
(1, 2, 'baa'),
(1, 5, 'quack')
");
Listez toujours les noms des champs dans les requêtes INSERT / REPLACE. Vous ne mettez jamais à jour tous les champs d'un coup.
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
VALUES
(1, 'un', 'texte quelconque')
");
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_premier, champ_second, champ_troisieme)
VALUES
(1, 'un', 'texte quelconque')
");
Si un champ dans une requête INSERT a la propriété AUTO_INCREMENT, ne pas l'inclure dans la requête.
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_auto_incremente, champ_second)
VALUES
(NULL, 'texty bits')
");
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_second)
VALUES
('texty bits')
");
Utilisation des espacesLes opérateurs doivent toujours être entourés par des espaces à l'exception de ++ et --.
$a = 1;
$b += $a;
$c = $a . $b;
$d = $b . 'quelquechose' . $c;
$e = $d * $b;
$f = $e / $a;
$g = ($f + $e) * $b;
$h++;
$i--;
Les appels de fonction et les définitions ne doivent pas avoir d'espaces avant la parenthèse.
$x = htmlspecialchars($y);
$item = $db->fetch_array($items);
Les arguments de fonction doivent avoir un espace après chaque virgule.
$x = fetch_quelquechose($a, $b, $c);
$i = construct_quelquechose(strtoupper('quelquechose') . ' ' . substr($var, 0, $b));
Les espaces non nécessaires dans les parenthèses ne doivent pas être utilisés.
$var = addslashes( $var );
$str = fetch_quelquechose( strlen( $var ), strpos( $x, $y ) );
$x = construct_x(substr($string, 0, strlen($bla)) . '/' . ucfirst($string));
if ($x == 1 AND ($y == 2 OR $z == 3) AND ($a = fetch_x($x, $y) OR $a == $bla))
Couleurs clés des exemples de code :
$code = red_code($var); Ne pas coder de cette façon
$code = normal_code($var); Coder plutôt comme cela
$_GET / $_POST / $_REQUESTAfin d'assurer que la donnée soit au format souhaité, les rangées superglobaux PHP suivantes ne sont pas directement accessibles sous plusieurs situations :
$_GET
$_POST
$_REQUEST
$_COOKIE
$_FILESL'accès direct à ces variables sont avec $_POST['do'] et $_GET['do'], qui sont utilisées pour contrôler les variables afin de décider quel branche d'un script qui doit être utilisée. Il peut aussi exister des cas très spécifiques où l'accès direct est requis mais doit être évité le plus possible. N'utilisez pas les variables $_GET / $_POST / $_REQUEST etc... dans les templates.
clean_gpc() et clean_array_gpc(), membres de la classe d'insertion de données vBulletin sont utilisés pour nettoyer les données envoyés par l'utilisateur.
Les types de données valides sont :
TYPE_BOOL - Booléen
TYPE_INT - Numérique
TYPE_UINT - Numérique positif
TYPE_NUM - Décimal
TYPE_UNUM - Décimal positif
TYPE_UNIXTIME - Format de la date Unix (Numérique positif)
TYPE_STR - Chaîne de caractère coupée (Nettoyage simple)
TYPE_NOTRIM - Chaîne de caractère
TYPE_NOHTML - Chaîne de caractère coupée envoyée dans la fonction htmlspecialchars_uni()
TYPE_ARRAY - Rangée
TYPE_FILE - Fichier
TYPE_NOCLEAN - Non validéChacun des types de données autre que TYPE_NOCLEAN, peut aussi avoir un type d'une rangée de données correspondant qui force une rangée de ce type de données, par exemple : TYPE_ARRAY_BOOL.
Les valeurs nettoyées sont accessibles via la rangée $vbulletin->GPC en utilisant la valeur du nom du champ en tant qu'index dde la rangée, par exemple $vbulletin->GPC['champ1']. Vous pouvez vous assurer que la valeur dans la rangée $vbulletin->GPC est du type spécifié, peu importe ce qui peut avoir été défini dans la rangée Superglobale. Par exemple, si vous spécifiez TYPE_NOHTML, vous pouvez afficher cette variable directement en HTML sans avoir la crainte à propos du code HTML sécurisé.
Le premier paramètre des fonctions clean_gpc() et clean_array_gpc() est l'initiale de la rangée Superglobale auquel vous souhaitez effectuer un nettoyage de données. Vous pouvez seulement nettoyer les données d'une rangée Superglobale avec un simple appel de clean_gpc() ou clean_array_gpc(). Vous ne pouvez pas nettoyer les rangées Superglobales $_COOKIE et $_POST en un seul appel, vous devez faire plusieurs appels. Toutes les valeurs seront envoyées dans la même rangée $vbulletin->GPC pour s'assurer que les noms des champs ne se chevauchent pas.
Note:
Les valeurs de $_COOKIE doivent être accessibles en utilisant COOKIE_PREFIX :
$vbulletin->input->clean_gpc('c', COOKIE_PREFIX . 'forum_view', TYPE_STR);
$foo = $vbulletin->GPC[COOKIE_PREFIX . 'forum_view'];
$db->query("
UPDATE " . TABLE_PREFIX . "table SET
champ_premier = '" . $db->escape_string(trim($_POST['champ_premier'])) . "',
champ_second = '" . $db->escape_string(htmlspecialchars_uni(trim($_POST['champ_second']))) . "'
WHERE cle_trouver = " . intval($_POST['cle_trouver']) . "
");
$vbulletin->input->clean_gpc('p', array(
'champ_premier' => TYPE_STR,
'champ_second' => TYPE_NOHTML,
'cle_trouver' => TYPE_INT
));
/* Cette valeur est accessible soit par $variable_nettoyee ou $vbulletin->GPC['champ_premier'] */
$variable_nettoyee =& $vbulletin->input->clean_gpc('p', 'champ_premier', TYPE_STR);
$db->query("
UPDATE " . TABLE_PREFIX . "table SET
champ_premier = '" . $db->escape_string($vbulletin->GPC['champ_premier']) . "',
champ_second = '" . $db->escape_string($vbulletin->GPC['champ_second']) . "'
WHERE cle_trouver = " . $vbulletin->GPC['cle_trouver'] . "
");
AccoladesLes accolades devraient être placés sur une nouvelle ligne à chaque fois.
if ($condition_premiere)
{
// faire quelque chose
}
else if ($condition_seconde)
{
// faire quelque chose d'autre
}
else
{
// ne rien faire
}
Utilisez toujours les accolades, même pour les boucles et embranchements qui contiennent qu'une seule ligne de commande.
if ($condition_premiere)
// faire quelque chose
else
if ($condition_seconde)
// faire quelque chose d'autre
else
// ne rien faire
if ($condition_premiere)
{
// faire quelque chose
}
else
{
if ($condition_seconde)
{
// faire quelque chose d'autre
}
else
{
// ne rien faire
}
}
AND / and / && OR / or / || etc...Utilisez « AND » au lieu de « and » ou « && », et « OR » au lieu de « or » ou « || ».
if ($var1 && $var2 || $var3)
if ($var1 and $var2 or $var3)
if ($var1 AND $var2 OR $var3)
Mettez en majuscules « AS » dans la fonction foreach.
foreach($array AS $key => $val)
{
// faire quelque chose
}
Boucles et embranchementsLes commandes des boucles et des embranchements (incluant la fonction foreach) doivent être séparé d'un espace avant d'ouvrir les parenthèses.
for ($i =0; $i < 10; $i++)
{
// faire quelque chose
}
while ($result = $db->fetch_array($results))
{
// faire quelque chose
}
if ($condition != 'quelquechose')
{
// faire quelque chose
}
foreach ($array AS $key => $val)
{
// faire quelque chose
}
« else if » est préconisé face à « elseif ».
if ($condition)
{
// faire quelque chose
}
else if ($condition_seconde)
{
// faire quelque chose d'autre
}
Commenter le codeUtilisez le type de commentaire // pour une ligne ou quelques courtes lignes de descrption, ou la syntaxe /* .... */ pour un grand bloc.
// Ceci est une simple ligne de commentaire
// Ceci est un court descriptif qui vous
// indique comment commenter
/*
Ceci est un
long commentaire
qui peut prendre
plusieurs lignes...
*/
Les commentaires doivent précéder le code qu'ils décrivent, comme suit :
$var = 0; // initialise $var
if ($var) // vérifie $var
// initialise $var
$var = 0;
// vérifie $var
if ($var)
Quand vous commentez des branches ou des embranchements, il est accepté de mettre du commentaire entre les accolades.
if ($var)
{
// $var est vrai donc exécuter le code suivant
echo $var;
}
Séparez les branches « do » et les gros blocs majeurs du code avec le commentaire en exemple ci-dessous. Il est suggéré de copier cette ligne et de l'insérer automatiquement dans votre éditeur PHP. Si vous souhaitez indiquer ce que fait la branche « do », ajoutez un commentaire juste après la ligne de commentaire.
require_once(./global.php);
// ################################################## ###########################
if (empty($_REQUEST['do']))
{
$_REQUEST['do'] = 'modify';
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'edit')
{
// code de modification
}
// ################################################## ###########################
// lister les objets dans un tableau
if ($_REQUEST['do'] == 'modify')
{
// code pour lister
}
Préfixez les définitions des fonctions PHP avec la ligne de commentaire suivante. Encore une fois, vous devriez inclure cette ligne automatiquement dans votre éditeur PHP.
// ###################### Démarrer is_something ######################
function is_something()
{
return iif($var, true, false);
}
// ###################### Démarrer fetch_uppercase ######################
function fetch_uppercase($var)
{
return strtoupper($var);
}
Comparaison de variables, etc...Les standards suivants doivent être suivies :
if (empty($array)) // vrai si $array est vide
if ($string == '') // vrai si $string a aucun contenu
if ($integer) // vrai si $integer n'est pas 0
if (!$integer) // vrai si $integer est 0
if ($boolean) // vrai si $boolean est vrai
if (!$boolean) // vrai si $boolean est faux
Si le type de donnée est important, utilisez === et !==.
if ($boolean === true) // vrai si $boolean est vrai, faux si $boolean est un nombre positif
if ($integer !== 0) // vrai si integer n'est pas 0, faux si $integer est vrai
Notez ce qui suit :
$integer = 0;
if ($integer = '') // retournera vrai
$string = '';
if ($string == '0') // retournera vrai
$string = '0';
if ($string == '') // retournera vrai
Fonction retournant des valeurs booléennesÀ moins qu'il n'y ait une bonne raison d'utiliser 1/0, à cause de la possibilité d'obtenir la valeur de retour 2, utilisez true/false comme valeurs de retour pour des fonctions.
function is_three($var)
{
if ($var == 3)
{
return 1;
}
else
{
return 0;
}
}
function is_three($var)
{
if ($var == 3)
{
return true;
}
else
{
return false;
}
}
Utilisez true/false au lieu de TRUE/FALSE. Réservez les versions en majuscules pour les constantes personnalisées.
if ($var === TRUE)
if ($var === true)
Guillemets et chaînesLes chaînes doivent être entre simple guillemets (') si elles contiennent aucune variable ou de caractère de contrôle, sinon utilisez les guillets normaux (").
$flat_string = 'Salut, ceci est une chaîne.';
$dynamic_one = "Salut,\n ceci est une chaîne.";
$dynamic_two = "Salut $username,\n ceci est une chaîne.";
Choisir entre les ' et les " est selon ce que vous souhaitez faire, dépendant des circonstances.
$string_one = "L'heure actuelle est $timenow et la date est $datenow";
$string_two = 'L\'heure actuelle est ' . $timenow . ' et la date est ' . $datenow . '.';
Les requêtes SQL doivent toujours être ainsi :
$results = $db->query("SELECT field FROM " . TABLE_PREFIX . "table AS table");
Les variables ne doivent pas être entourées de guillemets si cela n'est pas nécessaire.
$var = "$x";
$result = strtoupper("$string");
$var = $x;
$result = strtoupper($string);
$string = fetch_something("quelquechose$var");
Les appels eval() doivent avoir des guillemets simples (') si possible, afin d'éviter d'implanter des caractères inutiles.
eval("\$template = \"" . fetch_template('template') . "\";");
eval('$template = "' . fetch_template('template') . '";');
Guillemets et les tableaux de valeursLes clés de tableau doivent être entourées de guillemets si ce sont des chaînes ou des variables, même si vous savez que la variable évalue un entier. Les types de guillemets utilisés doivent suivre ce qui est indiqué ci-dessous. Notez que $var = array[$cle]; causera une erreur de formatage (parse error) si $cle n'est pas entre guillemets et si c'est une valeur négative, et causera une notice si $cle est une chaîne ou n'est pas entre guillemets.
$a = $userinfo[12];
$b = $userinfo['username'];
$c = $userinfo["$champ"];
Des clefs de tableau composées doivent citer la variable la plus éloignée.
$a = $userinfo["$var[12]"];
$b = $userinfo["$var[username]"];
$c = $userinfo["$var[champ]"];
Les tableaux composés de chaînes entourés de guillemets doivent évités d'être si possible en dehors de la chaîne avec le point opérateur, bien que ceci soit absolument inévitable, la syntaxe {...} peut être utilisée.
$a = "Salut, mon nom est $userinfo[12], comment allez-vous ?";
$b = "Salut, mon nom est $userinfo[username], comment allez-vous ?";
$c = "Salut, mon nom est $userinfo[$champ], comment allez-vous ?";
$d = 'Salut, mon nom est ' . $userinfo["$var[champ]"] . ', comment allez-vous ?';
$e = "Salut, mon nom est {$userinfo[$var[username]]}, comment allez-vous ?";
Nommer les embranchements « do »La plupart des pages vBulletin contient des embranchements « do ». Les nominations ci-dessous sont à suivre.
if (empty($_REQUEST['do']))
{
// définition de la branche par défaut pour ce script
$_REQUEST['do'] = 'modify';
}
// ################################################## ###########################
if ($_POST['do'] == 'kill')
{
// 'kill'
// code à exécuter pour supprimer un objet de la base de données
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'delete')
{
// 'delete'
// affichage du mesage de confirmation
}
// ################################################## ###########################
if ($_POST['do'] == 'insert')
{
// 'insert'
// code à exécuter pour insérer un nouvel objet dans la base de données
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'add')
{
// 'add'
// affichage du formulaire pour ajouter un nouvel objet
}
// ################################################## ###########################
if ($_POST['do'] == 'update')
{
// 'update'
// code à exécuter pour mettre à jour un objet dans la base de données
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'edit')
{
// 'edit'
// affichage du formulaire de modification d'un objet
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'modify')
{
// 'modify'
// affichage de la branche par défaut de ce script
}
Autant que possible, gardez les embranchements dans l'ordre listée ci-dessus, avec 'modify' (l'action par défaut) le plus en bas du script.
Si un script contient des embranchements en plus de edit/add/delete (comme template.php qui modifie les styles et les templates), vous devez placer un suffixe pour les noms des embranchements kill/delete/insert/add/update/edit avec le type d'objet.
if ($_REQUEST['do'] == 'edittemplate')
{
// affichage du formulaire pour modifier un template
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'editstyle')
{
// affichage du formulaire pour modifier un style
}
Si la fonctionnalité « do » d'un embranchement ne correspond pas à edit, update, add, insert, delete ou kill, donnez-lui un nom qui permet de récapituler l'embranchement.
if ($_REQUEST['do'] == 'rebuildstylecache')
{
// régénère le cache des styles
}
// ################################################## ###########################
if ($_REQUEST['do'] == 'updatetemplateparentlists')
{
// mettre à jour la liste des parents des templates
}
Gardez les groupes des embranchements applicables à un type d'objet simple dans le script.
// if (empty($_REQUEST['do']))
// if ($_REQUEST['do'] == 'rebuildstylecache')
// if ($_POST['do'] == 'killstyle')
// if ($_REQUEST['do'] == 'deletestyle')
// if ($_POST['do'] == 'insertstyle')
// if ($_REQUEST['do'] == 'addstyle')
// if ($_POST['do'] == 'updatestyle')
// if ($_REQUEST['do'] == 'editstyle')
// if ($_REQUEST['do'] == 'updatetemplateparentlists')
// if ($_POST['do'] == 'killtemplate')
// if ($_REQUEST['do'] == 'deletetemplate')
// if ($_POST['do'] == 'inserttemplate')
// if ($_REQUEST['do'] == 'addtemplate')
// if ($_POST['do'] == 'updatetemplate')
// if ($_REQUEST['do'] == 'edittemplate')
// if ($_REQUEST['do'] == 'modify')
Nommer les fonctionsLes noms des fonctions personnalisées doivent (autant que possible) décrire ce qu'ils font, pour qu'une prsonne qui lise le code puisse savoir comment l'utiliser et puisse savoir sa fonction par son nom.
Les noms des fonctions personnalisées doivent écrit en minuscules et doit utiliser les sous-tirets ( _ ) pour séparer les mots.
$var2 = issomething($var1);
$var2 = isSomething($var1);
$var2 = is_something($var1);
Les noms des fonctions personnalisées doivent suivre les modèles suivants :
print_Fonctions qui envoie directement le code dans le navigateur ou dans des variables type echo ou print.
print_input_row
print_standard_error
print_cp_header
construct_Fonctions qui retournent des variables HTML pour un affichage ultérieur.
construct_edit_toolbar
construct_forum_jump
is_contains_Fonctions qui retournent true/false basé sur des conditions.
is_valid_email
is_wysiwyg_compatible
contains_bbcode_img_tags
can_Fonctions qui retournent des true/false basés sur des permissions.
can_moderate
can_administer
can_announce
verify_Fonctions qui vérifie les conditions et qui affiche un message d'erreur si une condition n'est pas acceptée.
verify_ip_ban
verify_post_errors
verify_word_allowed
convert_Fonctions qui convertit une variable d'entrée d'un format de donnée à un autre format de donnée.
convert_kb_to_mb
convert_html_to_bbcode
convert_bits_to_array
cache_Fonctions qui lit les données de la base de données (habituellement) et crée un cache de variables PHP pour alléger la charge SQL.
cache_templates
cache_forums
cache_birthdays
fetch_Fonctions qui retourne des tableaux / chaînes / entiers etc... Si le type de donnée à être retourné n'est pas explicite dans le nom de la fonction (comme fetch_userinfo ou fetch_template), spécifiez le type de donnée dans le nom de la fonction, comme fetch_template_update_sql, fetch_replaced_session_url, fetch_reminders_array, etc...
fetch_template
fetch_user_search_sql
fetch_user_location_array
process_Fonctions qui exécute des actions sur un tableau de valeurs afin de le préparer pour une référence plus tard.
process_thread_array
process_post_preview
process_online_location
build_Fonctions qui sauvegarde les données dans la base de données pour une recherche plus tard, comme mettre en cache les anniversaires dans la table datastore, régénérer la table style, etc...
build_bbcode_cache
build_new_post
build_attachment
delete_Fonctions qui supprime quelque chose de la base de données.
delete_thread
delete_post_index
delete_user_pms
undelete_Fonctions inverse de la suppression.
undelete_thread
undelete_post
import_Fonctions du système d'importation qui prend une rangée de donnée et qui l'insère en tant que message/discussion/utilisateur (etc...) dans la base de données.
import_thread
import_post
import_user
sanitize_Fonctions qui exécutent des actions sur les paramètres d'entrée pour les garder en mémoire pour l'étape suivante, comme retirer les caractères interdits, vérifier si une date est valide, qu'une valeur $perpage a un sens, etc...
sanitize_perpage
sanitize_url
sanitize_reminder_date
parse_Fonctions qui intialise le formatage des balises BB en quelque sorte.
parse_bbcode
parse_usernote_bbcode
parse_pm_bbcode
handle_Fonctions qui sont appelées par le formateur de balises BB pour échanger avec un type particulier de balise BB.
handle_bbcode_img
handle_bbcode_list
handle_bbcode_parameter
file_Fonctions qui crée des échanges directement dans le système de fichiers.
file_read
file_download
file_append
log_Fonctions qui touche aux journaux de vBulletin.
log_admin_action
log_vbulletin_error
log_upgrade_step
exec_Fonctions qui actuellement exécute une action au lieu de retourner quelque chose.
exec_shutdown
exec_queries
exec_cron
sort_Fonctions qui trie les données.
sort_search_items
sort_threaded_posts
strip_Fonctions qui trie les éléments des chaînes.
strip_bbcode
strip_blank_ascii
strip_empty_bbcode
xml_Fonctions qui lit ou sort du XML.
xml_import_style
xml_parse_language_otag
xml_escade_cdata
vb_ ou vbFonctions qui remplace des fonctions PHP par des remplacements vBulletin dessinés pour étendre les fonctionnalités ou pour modifier la fonction originale. Si la fonction originale contient des sous-tirets ( _ ), la fonction sera préfixée par « vb_ » au lieu de « vb ».
vbmail
vb_number_format
vbsetcookie
js_Fonctions Javascript définis dans le code PHP (plutôt que d'être dans des fichiers .js).
js_dots
js_confirm_clear_db
js_forum_jump
RetraitToujours utiliser une seule tabulation pour chaque retrait.
function construct_something($var)
{
global $vbulletin;
if ($vbulletin->options['somevar'])
{
if ($var == 'quelquechose')
{
return true;
}
else
{
return false;
}
}
else
{
return true;
}
}
Syntaxe des requêtes SQLToujours mettre les requêtes entre des guillemets (").
$db->query('SELECT champ FROM ' . TABLE_PREFIX . 'table ORDER BY champ');
$db->query("SELECT champ FROM " . TABLE_PREFIX . "table ORDER BY champ");
Les appels dans la fonction SQL ne doivent pas contenir d'espaces.
$db->query("SELECT COUNT(*) AS records, SUM(champ_premier) AS total FROM " . TABLE_PREFIX . "table");
Si la chaîne de la requête est trop longue et qu'il est préférable de l'écrire en plusieurs lignes, faites ceci et mettez le mot-clé de cause au début de la ligne de la façon suivante : double guillemets ("), retour à la ligne, retrait, [chaîne de la requête], retour à la ligne, retrait, double guillemets (").
$results = $db->query("SELECT champ_premier, champ_second, champ_troisieme,
IF(champ_quatrieme = 'Oui', 1, 0) AS champ_quatrieme,
FROM " . TABLE_PREFIX . "table_premiere AS table_premiere
LEFT_JOIN " . TABLE_PREFIX . "table_second AS table_second USING(champ_premier)
WHERE table_premier.champ_second IN('bla bla bla', 'moo moo moo')
ORDER BY table_premier.champ_premier DESC
LIMIT 5, 10");
$results = $db->query("
SELECT champ_premier, champ_second, champ_troisieme,
IF(champ_quatrieme = 'Oui', 1, 0) AS champ_quatrieme,
FROM " . TABLE_PREFIX . "table_premiere AS table_premiere
LEFT_JOIN " . TABLE_PREFIX . "table_second AS table_second USING(champ_premier)
WHERE table_premiere.champ_second IN('bla bla bla', 'moo moo moo')
ORDER BY table_premiere.champ_premier DESC
LIMIT 5, 10
");
Les clauses « AND » additionnelles dans la clause WHERE doivent être en retrait si il y en a plusieurs.
$results = $db->query("
SELECT champ_premier, champ_second
FROM " . TABLE_PREFIX . "table AS table
WHERE champ_premier IN(3,4,5)
AND champ_second <> ''
AND champ_troisieme = 'quelquechose'
ORDER BY champ_premier
");
Ne pas mettre entre guillemets des valeurs numériques dans le requêtes SQL, utilisez intval() ou $var += 0; pour vous assurer que la variable est sûre.
$db->query_first("SELECT quelquechose FROM table WHERE tableid = '$valeur_numerique'");
$db->query_first("SELECT quelquechose FROM table WHERE tableid = '" . intval(valeur_numerique') . "'");
$db->query_first("SELECT quelquechose FROM table WHERE tableid = " . intval(valeur_numerique));
$valeur_numerique = intval($valeur_numerique);
$db->query_first("SELECT quelquechose FROM table WHERE tableid = $valeur_numerique");
Ne pas spécifier de longueur pour les champs numériques à moins de spécifier « UNSIGNED ZEROFILL ».
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_quatrieme SMALLINT(5) UNSIGNED NOT NULL,
ADD champ_cinquieme INT(10) UNSIGNED NOT NULL
");
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_quatrieme SMALLINT UNSIGNED NOT NULL,
ADD champ_cinquieme INT UNSIGNED NOT NULL
");
Ne pas utiliser le mot-clé « AFTER » dans une requête « ALTER ». Certains serveurs ont des soucis avec le mot-clé « AFTER », il est préférable de ne pas l'utiliser.
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_sixieme INT UNSIGNED NOT NULL AFTER champ_cinquieme
");
$db->query("
ALTER TABLE " . TABLE_PREFIX . "table
ADD champ_sixieme INT UNSIGNED NOT NULL
");
Les formats des requêtes INSERT / REPLACE doit être celui-ci :
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_premier, champ_second, champ_troisieme)
VALUES
(1, 2, 'moo'),
(1, 2, 'baa'),
(1, 5, 'quack')
");
Listez toujours les noms des champs dans les requêtes INSERT / REPLACE. Vous ne mettez jamais à jour tous les champs d'un coup.
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
VALUES
(1, 'un', 'texte quelconque')
");
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_premier, champ_second, champ_troisieme)
VALUES
(1, 'un', 'texte quelconque')
");
Si un champ dans une requête INSERT a la propriété AUTO_INCREMENT, ne pas l'inclure dans la requête.
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_auto_incremente, champ_second)
VALUES
(NULL, 'texty bits')
");
$db->query("
INSERT INTO " . TABLE_PREFIX . "table
(champ_second)
VALUES
('texty bits')
");
Utilisation des espacesLes opérateurs doivent toujours être entourés par des espaces à l'exception de ++ et --.
$a = 1;
$b += $a;
$c = $a . $b;
$d = $b . 'quelquechose' . $c;
$e = $d * $b;
$f = $e / $a;
$g = ($f + $e) * $b;
$h++;
$i--;
Les appels de fonction et les définitions ne doivent pas avoir d'espaces avant la parenthèse.
$x = htmlspecialchars($y);
$item = $db->fetch_array($items);
Les arguments de fonction doivent avoir un espace après chaque virgule.
$x = fetch_quelquechose($a, $b, $c);
$i = construct_quelquechose(strtoupper('quelquechose') . ' ' . substr($var, 0, $b));
Les espaces non nécessaires dans les parenthèses ne doivent pas être utilisés.
$var = addslashes( $var );
$str = fetch_quelquechose( strlen( $var ), strpos( $x, $y ) );
$x = construct_x(substr($string, 0, strlen($bla)) . '/' . ucfirst($string));
if ($x == 1 AND ($y == 2 OR $z == 3) AND ($a = fetch_x($x, $y) OR $a == $bla))