Dollar ($) signe dans la chaîne de mot de passe traitée comme variable
Passé un certain temps dans la résolution d'un problème empêchant un PHP/MySQL application web a été d'avoir des problèmes de connexion à la base de données. La base de données peut être consulté à partir de la coque et de phpMyAdmin, avec les mêmes informations d'identification et elle n'a pas de sens.
S'avère le mot de passe a un signe $ dans lui:
$_DB["password"] = "mypas$word";
Le mot de passe a été envoyé "mypas", ce qui est évidemment faux.
Quelle est la meilleure façon de gérer ce problème? J'ai échappé à l' $ avec un \
$_DB["password"] = "mypas$word";
et cela a fonctionné.
J'utilise généralement $string = 'test'
pour les chaînes qui est probablement la façon dont j'ai évité de courir dans ce avant.
Est ce comportement correct? Si ce mot de passe est stocké dans une base de données et PHP sorti - serait-ce le même problème se produit-il? Ce qui me manque ici...
Vous devez vous connecter pour publier un commentaire.
Guillemet simple, les chaînes ne sont pas traitées et sont prises "en l'état". Vous devriez toujours utiliser des guillemets simples chaînes de caractères, à moins que vous avez spécifiquement besoin de la variable $ou de séquences d'échappement (\n, \r, etc) des substitutions. C'est plus rapide et moins sujette aux erreurs.
"like $this"
dans un.php
fichier source. Les chaînes à partir de la base de données, à partir d'un fichier, à partir de l'utilisateur, etc., ne sont pas soumis à l'interpolation."pas\$word"
.PHP est en interpolant la variable
$word
dans la chaînemypas$word
, comme c'est un comportement normal pour les littéraux de chaîne délimité par des guillemets doubles. Depuis$word
est sans doute pas défini, la interpolation de chaîne estmypas
.La solution est d'utiliser les guillemets simples. Unique cité des littéraux de chaîne ne subissent pas d'interpolation de variable.
Les autres réponses de tous les travaux jusqu'à ce qu'il y a des guillemets simples incorporé dans le passsword.
Échouer:
$_DB['password'] = 'my'pas$word';
Alternatives:
Si vous n'avez pas d'autres caractères d'échappement, vous pouvez échapper à la $ avec
\$
, par exemple$_DB['password'] = "my'pas\$word";
Ou il peut être plus simple d'échapper l'apostrophe par exemple
$_DB['password'] = 'my\'pas$word';
Juste les mettre dans une seule chaîne de caractères entre guillemets:
La chaîne de caractères entre guillemets interpole variables, mais ces chaînes ne sera pas. Donc, ça va résoudre votre problème.
utiliser les guillemets simples
Suffit d'utiliser les guillemets simples 'au lieu de" et il ne sera pas essayer de traiter $mot comme une variable.
Chaînes de devis avec les doubles guillemets sont interprétées pour les variables. Seul chaînes entre guillemets sont interprétés littéralement.
Cela devrait donner:
Je viens de tombé sur ce problème et il fixe avant de trouver ce fil. Je suis sûr que toutes les solutions avec des guillemets simples travail parfait. J'ai choisi de simplement concaténer le pass qui fonctionne aussi très bien comme j'étais pas au courant de l'apostrophe solution....IE