Знак доллара ($) в строке пароля рассматривается как переменная - PullRequest
42 голосов
/ 01 апреля 2010

Потратил некоторое время на устранение проблемы, из-за которой у веб-приложения PHP / MySQL возникали проблемы с подключением к базе данных. Доступ к базе данных можно получить из оболочки и phpMyAdmin с точно такими же учетными данными, и это не имеет смысла.

Оказывается, в пароле есть знак $:

$_DB["password"] = "mypas$word";

Отправляемый пароль был "mypas", что явно неверно.

Как лучше всего решить эту проблему? Я избежал $ с \

$_DB["password"] = "mypas\$word";

и это сработало.

Я обычно использую $string = 'test' для строк, что, вероятно, так я и избегал.

Это правильное поведение? Что если этот пароль будет храниться в базе данных и PHP извлечет его - возникнет ли эта проблема? Что мне здесь не хватает ...

Ответы [ 8 ]

90 голосов
/ 01 апреля 2010
$_DB['password'] = 'mypas$word';

Строки в одинарных кавычках не обрабатываются и принимаются "как есть". Вы всегда должны использовать строки в одинарных кавычках, если только вам не нужны подстановки $ variable или escape-последовательности (\ n, \ r и т. Д.). Это быстрее и менее подвержено ошибкам.

10 голосов
/ 01 апреля 2010

PHP интерполирует переменную $word в строку mypas$word, как и обычное поведение для строковых литералов, выделенных двойными кавычками. Поскольку $word предположительно не определено, полученная интерполированная строка будет mypas.

Решение - использовать одинарные кавычки. Строковые литералы, заключенные в одинарные кавычки, не подвергаются переменной интерполяции.

7 голосов
/ 17 августа 2016

Все остальные ответы работают до тех пор, пока в passsword не будут заключены одинарные кавычки.

Сбой:

$_DB['password'] = 'my'pas$word';

Альтернативы:

Если у вас нет других экранированных символов, вы можете экранировать $ с помощью \$, например,

$_DB['password'] = "my'pas\$word";

Или, возможно, проще избежать одиночной кавычки, например

$_DB['password'] = 'my\'pas$word';

3 голосов
/ 01 апреля 2010

использовать одинарные кавычки

$_DB["password"] = 'mypas$word';
3 голосов
/ 01 апреля 2010

Просто поместите его в строку в одинарных кавычках:

$_DB['password'] = 'mypas$word';

Строка в двойных кавычках будет интерполировать переменные, а строки в одинарных кавычках - нет. Так что это решит вашу проблему.

2 голосов
/ 01 апреля 2010

Строковые кавычки с двойными кавычками интерпретируются для переменных. Строки в одинарных кавычках интерпретируются буквально.

$a = "one";
$b = "$a";
echo $b . "\n";
$b = '$a';
echo $b . "\n";

Это должно дать:

one
$a
2 голосов
/ 01 апреля 2010

Просто используйте одинарные кавычки «вместо», и он не будет пытаться рассматривать $ word как переменную.

$_DB['password'] = 'mypas$word';
1 голос
/ 05 апреля 2017

Я просто наткнулся на эту проблему и исправил ее до того, как нашел эту тему. Я уверен, что все решения с одинарными кавычками работают идеально. Я решил просто объединить проход, который также отлично работает, так как я не знал о решении с одинарными кавычками .... IE

$db_password = "SamWise" . "$" . "GangiTYloYG"; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...