Опция динамического выбора PHP/Javascript — как решить проблему с апострофами в тексте опции выбора

#javascript #php #html

Вопрос:

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

У меня есть динамическое окно выбора HTML, которое я встроил в PHP на основе результатов запроса MySQL. В дополнение к выбранному текстовому значению параметра select в атрибуте value я передаю в Javascript два значения, которые будут использоваться позже, разделенные запятой (не связано с проблемой, но просто для того, чтобы сделать код ниже более понятным).

Я абсолютно понимаю, что апострофы в строках вызывают проблемы, и для их решения необходимо принять особые меры предосторожности. Моя рабочая теория заключается в том, что мне просто нужно поставить символ » перед любой одинарной кавычкой при динамическом создании элемента управления select box, чтобы передаваемое значение обрабатывалось буквально позже javascript.

Мой код динамического поля выбора PHP выглядит следующим образом:

 $locSql = "select name, shortname, locationid from location_tbl l where ....";
    $locResultSet = mysqli_query($conn, $locSql) or die("Bad SQL " . $locSql); 

    $opt = "<select name='selFieldLocation' id='fieldLocation' onChange='setSelectedLocName(this);'>";
    $opt .= '<option value="blank">Select Location</option>';
    while ($row = mysqli_fetch_assoc($locResultSet)) {
        $selectedLocID = $row['locationid']; 
        
        // This echo statement returns the value from the database, e.g.....
        // "SUN Men's Group"
        echo 'first row shortname ' . $row['shortname'] . "<br>";

        // Applied "addslashes" to that value.
        $thisShortName = addslashes($row['shortname']);

        // Echo the new value....
        // The result is: "SUN Men's Group" (which is what i was after)
        echo 'new shortname is ' . $thisShortName . "<br>";

        $opt .= "<option value='{$row['locationid']},$thisShortName'> {$row['name']} </option>n"; 
        //echo 'row shortname ' . $thisShortName . "<br>";
    }
    $opt .= "</select>";
    $opt .= '<input type="hidden" name="selLocText" id="selLocText"  />';
    $opt .= '<input type="hidden" name="selLocShortName" id="selLocShortName"  />';

    var_dump($opt);
 

var_dump в конце отображает динамический код для создания поля выбора, как я и ожидал:

 '<select name='selFieldLocation' id='fieldLocation' onChange='setSelectedLocName(this);'><option value="blank">Select Location</option><option value='11,SUN Men's League'> Sunday Men's Group </option>
<option value='30,WED. - Men's Group'> Wednesday - Men's Group </option>
<option value='19,TUES. - Men's Group'> Tuesday - Men's Group </option>
 

На практике, когда пользователь выбирает опцию, вызывается функция javascript «setSelectedLocName» (которая находится во внешнем файле JS). Этот код выглядит так:

 function setSelectedLocName (x) {
  
  alert('Checking passed values '   x.options[x.selectedIndex].value);
  var selectedLocName = x.options[x.selectedIndex].text;
  etc....
 

То, что отображается в приведенном выше заявлении о предупреждении, выглядит следующим образом:

 Checking passed values: 11,SUN Men
or
Checking passed values: 30,WED. - Men
etc....
 

Короче говоря, у меня сложилось впечатление, что экранирование одинарной кавычки косой чертой («») (как это делает функция PHP «addslashes») заставит javascript буквально трактовать одинарную кавычку, но JS все еще, похоже, усекает строку в одинарной кавычке. Интересно, что значение «x.options[x.SelectedIndex].text» (которое ТАКЖЕ содержит одинарную кавычку в строке) передается правильно без какого-либо вмешательства программиста вообще. (?)

Может ли кто-нибудь предложить подход, который привел бы меня к моей цели здесь? Похоже (по крайней мере, мне), что я настроил поле динамического выбора именно так, как мне хотелось бы, чтобы оно выглядело. Большое спасибо за помощь!

Комментарии:

1. Проблема в том, что вы используете ' , чтобы окружить свою ценность. Используйте " и не нуждайтесь в addslashes as this doesn't do anything for HTML or JS, though you may want to use htmlentities`.

2. Спасибо за ваш ответ. Можете ли вы сказать мне конкретно, где использовать двойные кавычки? Я попытался заключить значение в двойные кавычки в этой строке кода, но всегда получал синтаксическую ошибку: $opt .= «<значение параметра='{$строка[‘идентификатор местоположения’]},$Это имя » > {$строка [‘имя’]} <значение параметра=’ {$строка [‘идентификатор местоположения’]},$Это имя»></опция>n»;

Ответ №1:

Вы можете попробовать что-то другое вместо того, чтобы загружать весь создаваемый html-код в строковую переменную html ($opt) и отображать его все сразу.

Вы можете поместить цикл (либо в то время, либо собрать в нем данные и создать его в нужном месте) там, где должен быть html, и создать его там следующим образом:

 ?>
 <select name="selFieldLocation" id="fieldLocation" onChange="setSelectedLocName(this);"></select>
    <option value="blank">Select Location</option>
<?php
    while ($row = mysqli_fetch_assoc($locResultSet)) {
?>
    <option value="<?php echo $row['locationid'];?>,<?php echo $thisShortName;?>"><?php echo $row['name'];?></option>
<?php

    } ?>
 </select>
 <input ....
 

Таким образом, вы сэкономите на множестве апострофов! — вместо echo $opt;
мы создаем html, а между ними помещаем цикл, на самом деле это гораздо более простой способ создания html внутри PHP-кода, но иногда это заставляет вас создавать свои циклы внутри html…

Это одна из лучших функций PHP… точно так же, как вы вставляете ее в JS-скрипт, вы можете вставить ее в HTML! 🙂

Это с фиктивными данными из вашего кода:

 $row['locationid'] = 30;
$thisShortName = "SUN Men's Group";
$row['name'] = "Tuesday - Men's Group";
?>
<option value="<?php echo $row['locationid'];?>,<?php echo $thisShortName;?>"><?php echo $row['name'];?></option>
 

Будет возвращать:

 <option value="30,SUN Men's Group">Tuesday - Men's Group</option>
 

Комментарии:

1. Отличный ответ и большое вам спасибо! Иногда мы настолько погружаемся в один подход, что не мыслим нестандартно! Очень признателен и благодарен за очень хороший ответ. Ура!