Я получаю от MySQL запрос строку, и я должен ее распечатать на экране. В эту строку мне нужно также напечатать некоторую переменную. Строка из БД может быть:
Finally, the team {$matchData['team_name']} have scored a point!
$matchData['team_name']
– это массив, используемый во время вычисления совпадения, и если я делаю простой
echo $matchData['team_name'];
напечатает правильное имя команды (BOSTON в этом случае). Но почему, если я повторяю строку, полученную из БД, echo print:
Finally, the team {$matchData['team_name']} have scored a point!
и не
Finally, the team BOSTON have scored a point!
Где я терпеть неудачу?
PHP, похоже, обрабатывает замену переменных в строках только в более простых случаях … надежным способом убедиться, что он всегда работает, является использование конкатенации, например:
echo "Finally, the team ".$matchData['team_name']." have scored a point!";
Однако справочная страница PHP дает этот пример:
// You can also use arrays $baz = array("value" => "foo"); echo "this is {$baz['value']} !"; // this is foo !
Таким образом, вы можете захотеть дважды проверить свой синтаксис против этого.
Наконец, echo принимает список параметров переменной длины, поэтому вы также можете написать:
echo "Finally, the team ", $matchData['team_name'], " have scored a point!";
Подстановка переменных в строках работает только в одном случае: в строковых литералах в исходном коде:
$foo = 'bar'; $baz = "This $foo works";
Он не работает ни на какой случайный вход, который вы получаете из другого места. Представьте, что произойдет, если пользователь напечатает это на вашей веб-странице:
Привет, это мой пароль.
Если PHP просто заменит $password
на переменную с тем же именем, было бы тривиально отслеживать внутренние функции программы. Это не так, как работает.
Самое лучшее, что вам нужно сделать, это явно оставить заполнители в данных базы данных и явно заменить их явно определенными данными. Например:
$string = 'Finally, the team %s have scored a point!'; $team = 'Foos'; printf($string, $team);