Использование Apostrophe в значении MySQL ENUM, которое будет заполнять поле со списком HTML для поиска в базе данных

У меня возникли проблемы с созданием значения ENUM в моем столбце MySQL с апострофом в нем, а затем с использованием значения, чтобы заполнить поле со списком HTML через PHP, а затем использовать указанное значение в качестве выбора для поиска в базе данных.

Вот SQL, который я использую для создания значения ENUM (я показываю только указанное значение, в то время как обычно будет несколько значений):

ALTER TABLE `primary_images` CHANGE `imgClass` `imgClass` ENUM( 'Robin\'s' ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL 

Тем не менее, вот что я получил в столбце базы данных:

 `imgClass` enum('Robin''s') DEFAULT NULL 

Таким образом, мой первый вопрос о том, почему мой побег обратный слэш и одинарная цитата превратились в двойную цитату? (Я использую phpmyadmin для администрирования базы данных btw)

Вот PHP, который я использую для создания моих опций со списком:

 $imgClass_query = "SELECT DISTINCT imgClass FROM primary_images "; ... while ($imgClass_row = mysql_fetch_array($imgClass_result)) // Add a new option to the combo-box echo "<option value='".$imgClass_row[imgClass]."'>".htmlspecialchars($imgClass_row[imgClass])."</option>\n"; 

Как вы можете видеть выше, я imgClass значение imgClass как value атрибута параметра html, так и отображаемое значение. Это value атрибута, которое я впоследствии использую для поиска в базе данных.

И вот сгенерированный HTML-источник:

 <option value="Robin" s'="">Robin's</option> 

Поэтому, очевидно, когда я использую атрибут value для поиска в базе данных, он ищет Robin которого не существует.

Как я должен вводить значения ENUM и как я должен создавать поле со списком для сохранения целостности исходного значения ENUM?

Кроме того, я не уверен, почему существует ="" после s' в сгенерированном HTML и почему отображаемое значение является идеальным. Есть предположения?

Вот немного о том, как обращаться со специальными символами в MySQL MySQL Manual

Я думаю, что это самый простой способ сделать это.

«Внутри строки, указанной в« »,« нет необходимости в специальном обращении, и ее не нужно удваивать или избегать. Точно так же «» внутри строки, указанной с помощью «», не нуждается в особой обработке.

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

На стороне HTML, я думаю, что одна цитата внутри строки вызывает проблему; вы можете использовать специальный код HTML (см. HTML-коды ). Вы можете легко это сделать в PHP с помощью этой функции: PHP htmlspecialchar

Часть 1 может быть довольно простой: 'a''b' является альтернативой 'a\'b' и, следовательно, означает одно и то же. UI уверен, что в запросах будет возвращена правильная строка, в отличие от определения таблицы.

Для части 2 Недрет Редп дал вам правильный ответ. Плюс, интересно, как

 echo "<option value='".$imgClass_row[imgClass]."'>" 

может привести к

 <option value="Robin" s'=""> 

, Я предпочел бы ожидать

 <option value='Robin's'=""> 

что явно неверно, но может быть решено с помощью htmlspecialchars() .

EDIT: Я нашел возможное объяснение: здесь может быть виноват синтаксический анализатор HTML в браузере. С

 <select id="s" onchange="alert(document.getElementById('s').innerHTML + ' value:' + document.getElementById('s').value)"> <option value='Robin&apos;s'>a</option> <option value='Robin's'>b</option> </select> 

Я получаю с Firefox

 <option value="Robin's">a</option> <option value="Robin" s="">b</option> value:Robin's 

с опцией a и

 <option value="Robin's">a</option> <option value="Robin" s="">b</option> value:Robin 

с опцией b . Но это после разбора и повторной сборки и явно не PHP-сгенерированный код. И даже тогда, где en axcess ' in <option value="Robin" s'=""> .

Вам просто нужно использовать htmlspecialchars () также для атрибута value:

 echo "<option value='".htmlspecialchars($imgClass_row[imgClass])."'>".htmlspecialchars($imgClass_row[imgClass])."</option>\n"; 

все остальное верно.

Кроме того, я не уверен, почему существует «=» после s '

Единственный возможный ответ: вы редактируете неправильный файл.