在MySQL中使用Apostrophe ENUM值将填充HTML组合框以进行数据库搜索

时间:2011-10-19 09:56:05

标签: php mysql sql

我首先在我的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',以及为什么显示的值是完美的。有什么想法吗?

4 个答案:

答案 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()来解决。

编辑:我找到了一个可能的解释:浏览器的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生成的代码。即便如此,'中的<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'

之后有=“”

唯一可能的答案是:您正在编辑错误的文件。