У меня возникли проблемы с созданием значения 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'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 '
Единственный возможный ответ: вы редактируете неправильный файл.