对于PHP函数mysqli_real_escape_string(),$ link的目的是什么?

时间:2017-02-07 02:53:46

标签: php mysqli

mysqli_real_escape_string的PHP文档指出,转义字符串需要链接标识符:

  

string mysqli_real_escape_string(mysqli $ link,string $ escapestr)

$ link的目的是什么?为了逃避字符串,为什么$link是必需的?那么$link的不同有效值如何能够为mysqli_real_escape_string带来不同的回报值呢?

2 个答案:

答案 0 :(得分:4)

这是一个很好且非常合乎逻辑的问题。实际上,为什么我们需要连接一个小字符串操作 - 为某些字符添加斜杠?

所有这些麻烦都与角色有关。

$ link包含mysqli连接。 mysqli连接包含有关当前字符集的信息。并且这些信息是正确转义字符串所必需的,取决于charset。所以对于一些不同的(虽然很奇怪的)字符集,结果确实会有所不同。

可以在this answer中找到不同的返回值示例。

这就是为什么mysqli_real_escape_string()本身没有好处,但应该在通过mysqli::set_charset()

设置正确的字符集后始终使用

另一方面,我必须说这个功能已经过时了。而不是手动转义,应该使用预备语句(并且,使用mysqli,这个机制是一个大的WTF,强烈建议使用PDO)。

答案 1 :(得分:3)

请参阅下面的“编辑”。

根据手册:

  

<强> 注意:   对于那些习惯使用mysql_real_escape_string()的人,请注意mysqli_real_escape_string()的参数与mysql_real_escape_string()所期望的不同。链接标识符首先出现在mysqli_real_escape_string()中,而要转义的字符串首先出现在mysql_real_escape_string()中。

来自用户贡献的笔记:

  

注意,如果没有打开连接,mysqli_real_escape_string()将返回一个空字符串!

现在需要在需要它的mysqli_*函数中建立连接。

过去,某些mysql_函数(例如mysql_real_escape_string())假定连接已经打开,但不在mysqli_中。

根据mysql_real_escape_string()

  

<强> link_identifier   MySQL连接。如果未指定链接标识符,则假定由mysql_connect()打开的最后一个链接。如果没有找到这样的链接,它将尝试创建一个,就像没有参数调用mysql_connect()一样。如果未找到或建立连接,则会生成E_WARNING级别错误。

有关mysqli_ API的更多信息:

编辑:在看到关于我没有回答“为什么”的评论后,在信息安全堆栈交换中找到了以下问答,这将更好地解释这一点: