我遇到了麻烦,首先在我的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'
之后有=""
,以及为什么显示的值是完美的。任何想法吗?
第1部分可能非常简单:'a''b'
是'a'b'
的替代品,因此其含义相同。我确信在查询中将返回正确的字符串,而不是表定义。
echo "<option value='".$imgClass_row[imgClass]."'>"
可能会导致
<option value="Robin" s'="">
。我更希望
<option value='Robin's'="">
这显然是错误的,但可以用htmlspecialchars()
解决。
编辑:我发现了一个可能的解释:浏览器的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生成的代码。即使这样,<option value="Robin" s'="">
中的'
也有一个访问
关于如何处理MySQL中的特殊字符MySQL Manual
我认为这是你做这件事最简单的方法。用" " "引号括起来的字符串中的" ' "不需要特殊处理,也不需要双引号或转义。同样地,字符串中的" " "也不需要特殊处理。
所以不要使用单引号来分隔特定的字符串,而是使用双引号,这样就不需要转义其中的单引号了。
在HTML方面,我认为字符串中的单引号是导致问题的原因;你可以使用HTML特殊字符代码(参见HTML代码)。这在PHP中很容易实现,使用以下函数:PHP htmlspecialchar
你只需要对value属性使用htmlspecialchars():
echo "<option value='".htmlspecialchars($imgClass_row[imgClass])."'>".htmlspecialchars($imgClass_row[imgClass])."</option>n";
其他都是正确的
还有,我不确定为什么s'后面有="
唯一可能的答案是:你正在编辑错误的文件。