web-dev-qa-db-fra.com

Chaîne de mot de passe de connexion en dollars ($) traitée comme variable

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...

40
ncatnow
$_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.

85
Andreas Bonini

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.

10
Benji XVI

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';

6
brianlmerritt

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.

3
Ray Hidayat

utilisez des guillemets simples

$_DB["password"] = 'mypas$Word';
3
ghostdog74

Utilisez simplement des guillemets simples au lieu de "et il ne tentera pas de traiter $ Word comme une variable.

$_DB['password'] = 'mypas$Word';
2
Jeff Beck

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
2
Brian Riehman

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"; 
1
blink