【问题标题】:escape characters at a mysql query from php在 php 的 mysql 查询中转义字符
【发布时间】:2014-02-03 17:02:31
【问题描述】:

我有一个 php 页面,显示来自 mysql 表的信息,如下所示

$query = "SELECT * FROM `diccionary` WHERE `entry` LIKE 'a%' ORDER BY `entry`";

我将每个结果用作对不同 php 文件的第二次查询的输入:

$escaped = mysql_real_escape_string($row['entry']);
echo "<a href=editor.php?entry=$escaped>".$row['entry']."</a> |

在此页面返回的一些单词具有下一个格式,它们以这种方式返回:
word1 word2
词'
单词+
单词(-)

但是它们在 href=editor.php?entry=$escaped 部分没有正确发送,实际上只有以撇号结尾的是可以的,因为我使用的是“mysql_real_escape_string”函数,我尝试将其他转换为转义字符,但它不起作用,例如 ("+", "+", $row['entry'])。 这些是我在所有这些情况下看到的链接:

2 words = editor.php?entry=word1(没有后面的空格也没有 word2,这给了我所有与 word1 匹配的单词,如果有的话,但不是 word1 word2 的复合词)。

word' = editor.php?entry=word\' (因为这个功能是正确的,它也给了我正确的单词)。

word+ = editor.php?entry=word+(+ 应该被转义,因为如果我点击生成的链接,它不会给我任何结果,空白页)。

word (-) = editor.php?entry=word(这和2个单词的情况类似,除了括号也要转义,这个也产生空白页)。

我一直在寻找,我只能找到修复撇号的方法,我不知道如何修复其余的情况,任何帮助都会很有价值。

非常感谢。

【问题讨论】:

  • 为什么要在 mysql 结果上使用 mysql_real_escape_string?
  • 您不应该在 url 中向客户端发送转义数据。 sql 转义用于 sql 语句,而不是 http url。 sql 转义是在将特定字符串插入 sql 语句之前对特定字符串执行的 LAST 操作。不是你先做的事情,然后希望转义不会被所有中间系统破坏。
  • @Prashank 因为我正在生成链接。
  • @Marc B,对不起,我不是专家,我会按照我认为可行的方式来做,请建议我一个更好的方法来学习和应用它。
  • 你不需要php.net/urlencode吗?

标签: php mysql sql escaping special-characters


【解决方案1】:

您需要对数据进行 URL 编码以输出到 HTML href 属性中。

$query_string = urlencode($row['entry']);
echo "<a href=editor.php?entry=$query_string".$row['entry']."</a> |

mysql_real_escape_string 函数用于将用于查询的数据转义到 MySQL,而不用于查询结果。

【讨论】:

  • 正如您在上面看到的@Avneesh 给了我相同的解决方案,请检查我已经回答了他,我该如何解决?,有什么建议吗?
  • @AndrésChandía 看来您仍在尝试使用mysql_real_escape_string() 以某种方式输出到浏览器。您应该只使用 URL 编码。 mysql_real_escape_string() 仅用于 MySQL 查询的输入。
  • 是的@Mike Brant,我不知道该怎么做,我正在寻找更好的方法,但我不太明白我应该怎么做
  • 好的,经过你的所有建议我已经达成了解决方案,我不确定这是一个好的解决方案,毕竟你的cmets,所以我把它放在这里,我等待你的cmets改进这个,再次感谢:好的,在你的所有建议之后我已经达成了解决方案,我不确定这是一个好的解决方案,毕竟你的 cmets,所以我把它放在这里,我等待你的 cmets 改进这个,谢谢再次:$preescaped = mysql_real_escape_string($row['entry']); $escaped = urlencode($preescaped); echo "&lt;a ref=editor.php?entry=$escaped&gt;".$row['entry']."&lt;/a&gt; | ";
  • @AndrésChandía 我仍然不明白你为什么认为你需要使用mysql_real_escape_string()。您应该只使用urlencode(),仅此而已。同样,MySQL 字符串转义函数用于准备用于数据库查询的字符串,而不是用于准备用于 URL 的字符串。
【解决方案2】:

try urlencode($row['entry']); 方法http://in1.php.net/urlencode 可能可行。
但是建议在 url 中发送转义数据并不是一个好习惯。

【讨论】:

  • 这一半有效,我的意思是 ti 适用于所有一开始不起作用的情况,但它不适用于撇号,我试过:$preesc = urlencode($row['entry ']); $esc = mysql_real_escape_string($row['entry']);但它没有解决它,有什么建议吗?
  • 现在在这种情况下你可以尝试 rawurlencode() in3.php.net/rawurlencode 参考这个你会得到一些想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多