Nous avons passé du temps à résoudre un problème qui empêchait une application Web PHP/MySQL de se connecter à la base de données. La base de données pouvait être accédée depuis le shell et phpMyAdmin avec exactement les mêmes informations d'identification et cela n'avait aucun sens.
Il s'avère que le mot de passe avait un signe $:
$_DB["password"] = "mypas$Word";
Le mot de passe envoyé était "mypas", ce qui est évidemment faux.
Quelle est la meilleure façon de gérer ce problème? J'ai échappé au $ avec un \
$_DB["password"] = "mypas\$Word";
et cela a fonctionné.
J'utilise généralement $string = 'test'
pour les chaînes, ce qui m'a probablement évité de courir auparavant.
Est-ce que ce comportement est correct? Et si ce mot de passe était stocké dans une base de données et PHP l'extrayait - ce même problème se produirait-il? Qu'est-ce que j'oublie ici...
$_DB['password'] = 'mypas$Word';
Les guillemets simples ne sont pas traités et sont pris "tels quels". Vous devez toujours utiliser des chaînes de guillemets simples, sauf si vous avez spécifiquement besoin des substitutions de variables $ ou d'échappement (\ n,\r, etc.). C'est plus rapide et moins sujet aux erreurs.
PHP interpole la variable $Word
dans la chaîne mypas$Word
, comme le comportement normal des littéraux de chaîne délimités par des guillemets doubles. Puisque $Word
est probablement indéfini, la chaîne interpolée résultante est mypas
.
La solution consiste à utiliser des guillemets simples. Les littéraux de chaîne entre guillemets ne sont pas soumis à une interpolation variable.
Les autres réponses fonctionnent toutes jusqu'à ce que des guillemets simples soient incorporés dans le mot de passe.
Échouer:
$_DB['password'] = 'my'pas$Word';
Alternatives:
Si vous n'avez pas d'autres caractères d'échappement, vous pouvez échapper le $ avec \$
, par exemple.
$_DB['password'] = "my'pas\$Word";
Ou il peut être plus simple d'échapper à la citation simple, par exemple.
$_DB['password'] = 'my\'pas$Word';
Il suffit de le mettre dans une chaîne entre guillemets:
$_DB['password'] = 'mypas$Word';
La chaîne entre guillemets interpolera les variables, mais pas les chaînes entre guillemets simples. Cela résoudra donc votre problème.
utilisez des guillemets simples
$_DB["password"] = 'mypas$Word';
Utilisez simplement des guillemets simples au lieu de "et il ne tentera pas de traiter $ Word comme une variable.
$_DB['password'] = 'mypas$Word';
Les guillemets avec la citation double sont interprétés pour les variables. Les chaînes simples citées sont interprétées littéralement.
$a = "one";
$b = "$a";
echo $b . "\n";
$b = '$a';
echo $b . "\n";
Cela devrait donner:
one
$a
Je viens de rencontrer ce problème et le corriger avant de trouver ce fil. Je suis sûr que toutes les solutions avec des guillemets simples fonctionnent parfaitement. J'ai choisi de concaténer simplement le laissez-passer, qui fonctionne également bien, car je ne connaissais pas la solution de devis unique ...
$db_password = "SamWise" . "$" . "GangiTYloYG";