echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';
Уч. У вас есть строковый литерал JavaScript, внутри атрибута, закодированного в HTML, внутри строкового литерала PHP. Неудивительно, что побег сбивает вас с толку.
Ну, во-первых: вы выводите $row['value']
в тексте элемента списка без экранирования. Это означает проблему (потенциально проблему безопасности), когда это значение содержит специальные символы, такие как <
, &
и "
. Это должно быть завернуто в htmlspecialchars()
.
Затем вы помещаете что-то в строковый литерал JavaScript. Это означает, что если в значении используется символ разделителя строк '
или экранирующий обратный слеш \
, он может вырваться из строки и внедрить код JavaScript на страницу: опять же, потенциальная проблема безопасности. addslashes()
может использоваться для экранирования строки для включения в строковый литерал JS; обратите внимание, что вам все равно придется htmlspecialchars()
впоследствии, потому что строковый литерал сам находится внутри атрибута в кодировке HTML.
Итак, мы смотрим на:
echo "<li onclick=\"fill('".htmlspecialchars(addslashes($row['value']), ENT_QUOTES)."');\">".htmlspecialchars($row['value']).'</li>';
Не очень читабельно, не так ли? Ну, мы можем улучшить это:
Мы можем потерять строковый литерал PHP, используя сам PHP для интерполяции строк (как продемонстрировал Джонатан). PHP - это язык шаблонов, воспользуйтесь этим!
Мы можем определить функцию с более коротким именем, чем htmlspecialchars
, что является хорошей идеей, поскольку нам нужно часто использовать эту функцию в типичном шаблоне.
Мы можем избежать строкового литерала JavaScript, если бы сторона JavaScript считывала необходимые данные из содержимого элемента списка (text()
, в jQuery, поскольку это то, что вы, похоже, используете), а не необходимость обернуть его внутри уродливого встроенного обработчика событий.
Например:
<?php
function h($text) {
echo(htmlspecialchars($text, ENT_QUOTES));
}
?>
<ul id="suggesties">
<?php while ($row= mysql_fetch_array($r)) { ?>
<li><?php h($row['value']); ?></li>
<?php } ?>
</ul>
<script type="text/javascript">
$('#suggesties>li').click(function() {
$('#inputString').val($(this).text());
$('#suggesties').hide();
});
</script>