我首先在我的MySQL列中创建一个带有撇号的ENUM值,然后使用该值通过PHP填充HTML组合框,然后使用所述值作为选择来搜索数据库。
这是我用来创建ENUM值的SQL(我只显示有问题的值,而通常会有几个值):
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
值作为html选项属性value
以及显示的值。我随后使用该属性value
来搜索数据库。
以下是生成的HTML源:
<option value="Robin" s'="">Robin's</option>
很明显,当我使用value
属性搜索数据库时,它会查找不存在的Robin
。
我应该如何输入ENUM值,以及如何创建组合框以保持原始ENUM值的完整性?
此外,我不确定为什么在生成的HTML中=""
之后有s'
,以及为什么显示的值是完美的。有什么想法吗?
答案 0 :(得分:2)
第1部分可能非常简单:'a''b'
是'a\'b'
的替代方案,因此意味着相同。 UI确保在查询中返回正确的字符串,而不是表定义。
对于第2部分,Nedret Recep给了你正确答案。另外,我想知道如何
echo "<option value='".$imgClass_row[imgClass]."'>"
可能导致
<option value="Robin" s'="">
。我宁愿期待
<option value='Robin's'="">
这显然是错误的,但可以使用htmlspecialchars()
来解决。
<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生成的代码。即便如此,'
中的<option value="Robin" s'="">
位于{{1}}。
答案 1 :(得分:1)
这里有一些关于如何处理MySQL MySQL Manual
中的特殊字符的问题我认为这是最简单的方法。
引用“”“的字符串中的”'“不需要特殊处理,也不需要加倍或转义。同样,”“中引用”'“的字符串内部不需要特殊处理。
因此,不使用单引号来分隔特定字符串,而是使用双引号,然后您不需要转义其中的单引号。
在HTML方面,我认为字符串中的单引号导致问题;您可能使用HTML特殊字符代码(请参阅HTML codes)。您可以使用此功能在PHP中轻松完成此操作:PHP htmlspecialchar
答案 2 :(得分:0)
您还需要将htmlspecialchars()也用于value属性:
echo "<option value='".htmlspecialchars($imgClass_row[imgClass])."'>".htmlspecialchars($imgClass_row[imgClass])."</option>\n";
其他一切都是正确的。
答案 3 :(得分:0)
另外,我不确定为什么在s'
之后有=“”
唯一可能的答案是:您正在编辑错误的文件。