Синтаксис php для эхо-функции JavaScript - PullRequest
0 голосов
/ 20 сентября 2009

Я надеюсь, что кто-нибудь может помочь мне с этой маленькой проблемой. Проблема в том, что я все еще путаюсь с синтаксисом

Строка php echo - это функция javascript, которая принимает один параметр - значение базы данных.

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

while($row=mysql_fetch_array($r)){
     echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

}

РЕДАКТИРОВАТЬ ПОТОМУ ЧТО Я только что узнал, что мой синтаксис правильный. Мне просто нужно было включить обратную косую черту. Кажется, функция javascript вызывает проблемы. В частности строка, которая скрывает список

У кого-нибудь есть решение для этого?

function fill(thisValue) {
    $('#inputString').val(thisValue);
   //$('#suggesties').hide();

}

EDIT Я наконец придумал это: обратный звонок

function fill(thisValue) {

     $('#suggesties').fadeOut('fast',function(){
        $('#inputString').val(thisValue);
    });

    }

спасибо, Ричард

Ответы [ 5 ]

1 голос
/ 21 сентября 2009
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>';

Не очень читабельно, не так ли? Ну, мы можем улучшить это:

  1. Мы можем потерять строковый литерал PHP, используя сам PHP для интерполяции строк (как продемонстрировал Джонатан). PHP - это язык шаблонов, воспользуйтесь этим!

  2. Мы можем определить функцию с более коротким именем, чем htmlspecialchars, что является хорошей идеей, поскольку нам нужно часто использовать эту функцию в типичном шаблоне.

  3. Мы можем избежать строкового литерала 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>
1 голос
/ 20 сентября 2009

Я бы порекомендовал также экранировать строку для использования в javascript. json_encode делает свое дело. И часть html тоже, , если она не должна содержать html :

echo '<li onclick="fill('.htmlentities(json_encode($row["value"])).');">'.htmlspecialchars($row["value"]).'</li>';
1 голос
/ 20 сентября 2009

Вы можете оставить PHP внутри тегов PHP. Иногда это легче, чем избежать многочисленных мест:

<?php while($row=mysql_fetch_array($r)) { ?>
  <li onclick="fill('<?php print $row["value"]; ?>');">
    <?php print $row["value"]; ?>
  </li>
<?php } ?>
0 голосов
/ 29 декабря 2010

Удалите кавычки вокруг значения, чтобы у вас было $row[value] вместо $row["value"].

0 голосов
/ 20 сентября 2009

Попробуйте убежать так:

while($row=mysql_fetch_array($r)){
 echo '<li onclick="fill(\''.$row["value"].'\');">'.$row["value"].'</li>';

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...