La concaténation, ce n'est pas particulièrement sorcier, il faut simplement un minimum d'attention.
Le but consiste à insérer du code PHP dans des chaines de caractères. Chaque chaine est délimités par des caractères particuliers: apostrophes ou guillemets. Mon choix personnel est le suivant (et c'est essentiellement une question de confort de travail personnel, adapte à ton goût, mais n'oublie pas de respecter les règles de base)
Lorsque je dois avoir une chaine de caractères, j'utilise des guillemets :
<?php
$var = "chaine de caractères";
?>
Jusque-là, rien de compliqué. Mais j'aurais pu écrire aussi bien:
<?php
$var = 'chaine de caractères';
?>
Le résultat est le même.
Maintenant, supposons que nous devions insérer une variable au milieu de cette chaine : avec des guillemets, on peut théoriquement (et ça fonctionne même si ce n,est à mon sens pas très propre) l'ajouter sans autre forme de procès :
<?php
$var = "chaine de $nb caractères";
?>
Si ma variable $nb vaut 23, ma chaine correspondra bien à "chaine de 23 caractères". Ce qui me fait préférer les guillemets dans ce genre de cas, c'est que si j'écris :
<?php
$var = 'chaine de $nb caractères';
?>
Ma chaine correspondra alors à "chaine de $nb caractères" : entre apostrophes, les variables PHP ne sont pas interprétées, c'est une erreur très classique.
Comment résoudre ce problème ?
En effectuant une concaténation, c'est à dire qu'on va diviser la chaine en plusieurs portions et on utilisera l'opérateur de concaténation quei est le point.
<?php
$var = "chaine de ". $nb ." caractères";
?>
ou encore
<?php
$var = 'chaine de '. $nb .' caractères';
?>
Le résultat sera le même : on assemble une chaine plus courte avec une variable puis une nouvelle chaine.
Et lorsqu'on va créer des requêtes SQL, on va se heurter à un autre problème : là, on va mélanger du PHP, du SQL et des chaines de caractères. Il faut séparer chaque partie:
-1- Pour PHP, le SQL doit être traité comme une chaine de caractères
-2- Pour SQL, les valeurs de champs devront être également traité comme des chaines de caractères.
Donc en SQL, on va utiliser aussi des caractères pour isoler les chaines. Mon choix personnel, c'est l'apostrophe pour distinguer des caractères que j'utilise en PHP (guillemets)
Mettons donc que j'aie une requête qui à la base ressemble à ceci:
Pour l'instant, on est en SQL, mais je dois définir ça en PHP, ça va donner:
<?php
$sql = "SELECT champ1, champ2 FROM ma_table WHERE nom = 'untel';";
?>
Jusque là, pas de problème : pour PHP, la requête est une chaine de caractères délimitée par des guillemets, et "untel" est pour SQL une chaine de caractères délimitée par des apostrophes : il n'y a pas de conflits.
Mais ma requête doit être dynamique et le nom doit pouvoir changer : "untel" doit être remplacé par une variable PHP. Je vais procéder comme montré plus haut : je vais couper ma chaine (requête) en deux chaînes :
- SELECT champ1, champ2 FROM ma_table WHERE nom = '
- ';
La seconde partie est minime, mais indispensable. Je concatène ensuite ma variable avec le tout:
<?php
$sql = "SELECT champ1, champ2 FROM ma_table WHERE nom = '". $nom ."';";
?>
Si $nom vaut "dupont", l'affichage de ma requête donnera:
Ma chaine est correcte.