Immigration sur hébergement mutualisé

Je vous parlais il y a peu des choses à faire pour quitter un hébergement. Il s’agit maintenant d’affiner les réglages sur le nouveau, celui sur lequel on arrive.

On est dans le cas de figure d’un site (ou plusieurs) existant, que l’on installe sur un nouvel hébergement, et que l’on a pas envie de tout refaire…

Une check-list, l’occasion de parler d’UTF8, d’apostrophes, de sessions et autres choses…

Il ne s’agit pas ici d’être trop généraliste.

Je suis dans l’hypothèse de travail d’un site qui était sur un hébergement dédié, configuré de façon moderne et sur mesure, pour passer  à un mutualisé OVH, puisque c’est mon cas. Non pas que le mutualisé soit obsolète, mais quand même un peu dès fois… Pour la compatibilité, of course.

Nul doute que les mêmes questions peuvent se poser ailleurs, les solutions pouvant être proches.

Dans tous les cas, adaptez à vos besoins, et surtout testez dans un dossier privé, afin de vérifier si tout se comporte correctement.

UTF 8, or not ?

Alors là… on touche du doigt un point majeur. Le réglage des accents pose souve soucis quand on ne fait pas attention (et parfois quand on fait attention), surtout dans l’hypothèse où l’on a un site développé il y a longtemps, pour lequel il n’y avait pas encore l’UTF8, ou mal, ou pas partout…

Pour pouvoir être en UTF8 partout, il y a de plusieurs points sur lesquels insister.

Pour les fichiers

Par exemple le fichier .htaccess :

AddDefaultCharset UTF-8

Il va sans dire que si votre choix est plutôt or not, remplacez UTF-8 par ce que vous voulez pour cette ligne et celles qui suivent (ISO-8859-1 par exemple)

Pour la base de données.

Nous avons, classiquement une procédure de connexion qui ressemble a ceci :

define('MYSQL_HOST', 'localhost'); 
define('MYSQL_USER', 'u_BVVXZQU1Am'); 
define('MYSQL_PASS', 'BEVSYQM1AWRTMgB1MBM1d2VjoHbgdg');
define('MYSQL_BASE', 'u_BVVXZQU1Am');

$dsn = "mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_BASE;
$BDD = new PDO($dsn, MYSQL_USER, MYSQL_PASS);

J’ai décomposé pour les besoins de la mise en page, mais également pour détailler les éléments; on peut faire plus compact. Et bien sûr le mot de passe est faux, il a été généré sur PasswordFinder pour illustrer l’article…

Si nous voulons passer en UTF8, glissons juste une ligne supplémentaire pour définir un tableau d’options:

$option =  array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'") ;

Et affinons la création de notre objet, en passant l’option:

$BDD = new PDO($dsn, MYSQL_USER, MYSQL_PASS, $option);

Il est évident que le htaccess et ce fichier de config peuvent/doivent se combiner…

Les \’ et \\’ et \\\’  …

Autre plaie qui dépend des réglages, la gestion des apostrophes.

Le problème

Pour mémoire une chaine de caractère peut être bornée par des  » ou des ‘. Mais si l’on souhaite mettre des ‘ dans une chaine bornée par des ‘ on a un problème.

$foo = "ok";
$foo = 'ok';
$foo = 'la c'est un pbl';
$foo = "la c'est pas pbl";
$foo = 'la c\'est pas un pbl mais ca ajoute un \ ce qui posera pbl';

La où le soucis se pose dans notre cas, c’est lors des envois à la base de données.

Un autre exemple:

$foo = "truc'bidule"; // OK
$sql = "INSERT ... NOM = '$foo' ";

ce qui donne

$sql = "INSERT ... NOM = 'truc'bidule' ";

Et là nous avons un problème.

La magie

Les hébergeurs peuvent (ou pas) activer les Magic Quotes, autrement appelés guillemets magiques. C’est à dire qu’ils se chargent de les rajouter si besoin. Option obsolète, mais toujours présente chez de nombreux hébergeurs pour des raisons de compatibilités historiques.

S’il l’activent, cela donne automatiquement

$sql = "INSERT ... NOM = 'truc\'bidule' ";

Sinon, vous devez faire de votre côté ceci

$sql = "INSERT ... NOM = '". addslashes($foo) ."' ";

pour obtenir

$sql = "INSERT ... NOM = 'truc\'bidule' ";

Mais bien sûr si vous étiez sur un hébergement où ce n’était pas activé, et utilisiez le addslashes, pour arriver sur un hébergement ou c’est activé, cela revient a ajouter des slashes automatiquement là où vous le faisiez déjà manuellement. Et donne un truc du genre:

$sql = "INSERT ... NOM = 'truc\\\'bidule' ";

Car la magie ajoute un \ devant le \, et un autre devant le ‘… Et votre site affiche fièrement truc\’bidule ce qui n’est jamais très joli…

Une solution

Elle passe par fichier .htaccess :

SetEnv MAGIC_QUOTES 0

Ici pour le retirer si l’hébergeur l’a (et le gériez vous même), passez à 1 pour l’inverse (déconseillé).

A noter que si vous utilisez PDO, le fait d’utiliser le bindParam en précisant le type explicite de données (ce que je conseille) va laisser le système s’occuper des slashes entre autres choses.

$query->bindParam(":foo", $this->foo, PDO::PARAM_STR);

Et le souci est le même si l’hébergeur à laissé actif les guillemets magiques.

Spécifique OVH…

Sessions

Celui là je l’avais oublié. C’est une manière de transmettre les identifiants de sessions via la barre d’adresse:

http://www.monsite.com/?PHPSESSID=i8ffgkn5rco9d3jj9eq6rn69e5

Pas très grave, mais pas très esthétique (et pas très bon pour le référencement).

Toujours dans le fichier .htaccess :

SetEnv SESSION_USE_TRANS_SID 0

Autres réglages

Selon les options…

SetEnv PHP_VER 5 # activer PHP 5... (ou 5_3, ou 5_4)
SetEnv REGISTER_GLOBALS 0 # désactiver les super globales

Je pense avoir fait le tour des quelques points qui m’ont surpris après ma migration.

Ce post me servant d’aide mémoire, si je vois d’autres points, j’en rajouterais peut être…

Laisser une réponse