Php mysqli面向对象的实转义字符串

Php mysqli面向对象的实转义字符串,php,mysqli,Php,Mysqli,我不熟悉Mysqli和PHP,希望学习使用面向对象代码而不是过程代码。然而,我正在努力将mysqli\u real\u escape\u字符串转换为面向对象的方式。在下面的代码中,我使用了过程代码,因为我不知道如何使用面向对象的方式,而且谷歌搜索没有提供我要寻找的答案 $sql = "SELECT email FROM `users` WHERE email = '".mysqli_real_escape_string($link, $_POST['email'])."'LIMIT 1";

我不熟悉Mysqli和PHP,希望学习使用面向对象代码而不是过程代码。然而,我正在努力将mysqli\u real\u escape\u字符串转换为面向对象的方式。在下面的代码中,我使用了过程代码,因为我不知道如何使用面向对象的方式,而且谷歌搜索没有提供我要寻找的答案

$sql = "SELECT email FROM `users` WHERE email = '".mysqli_real_escape_string($link, $_POST['email'])."'LIMIT 1";

        $result = $link->query($sql);

    if($result->num_rows > 0) {

        echo "The email " .$_POST['email']. " is already taken";

    } else {

        echo $_POST['email'];
    }


}

在现实世界中,我会对输入字段进行某种验证,但出于学习目的,我没有验证。也就是说,如果有人进入注册页面,他们可以使用SQL注入。我试图在检查电子邮件地址是否存在的代码中防止这种情况。从我所读到的内容来看,mysqli_real_escape_string用于防止SQL注入,而使用类似htmlspecialchars的东西将用于防止XSS。在这个特定的示例中,我试图阻止SQL注入

如果是OO,则使用
$link->real\u escape\u字符串($\u POST['email'])
。在您的示例中,您使用了
mysqli\u reql\u escape\u string
过程方式

我明白了:

警报(“这是警报”)

而不是我应该看到的所有weir&alt内容,如果我做得正确的话

对于第二部分,我认为你错了
真正的逃逸字符串
html\u特殊字符

mysqli\u real\u escape\u string
不会将实体、oposite转换为
html\u特殊字符

SQL不需要将特殊字符转换为实体,因为。您不能期望
mysqli\u real\u escape\u string
返回您编码的实体


简而言之,您不需要为mysql查询编码实体。只有可能“伤害”查询的mysql特殊字符

mysqli\u real\u escape\u字符串才意味着在数据库查询中安全地使用用户空间中的字符串(称为SQL注入攻击)。在您的情况下,电子邮件(js代码)被正确插入数据库。您甚至可以立即使用“而不是”,而不会出现Mysql错误

但您要做的是在HTML网站中显示来自用户空间的数据,这需要另一种不同的修改来防止跨站点脚本:

tl;dr:

mysqli\u real\u escape\u string
(或其OOP等价物)转义在数据库查询中导致问题的字符,如
变为
\”


htmlentities
将字符更改为相应的html实体,即
字符串mysqli::escape_string(字符串$escapestr)
字符串mysqli::real_escape_string(字符串$escapestr)
^RTM。您还应将其隔开
$\u POST['email']'限制
的意思是
email@example.comLIMIT1
,从而导致语法错误。所以,
$\u POST['email'])。“'LIMIT 1
更好的方法是使用预置语句。我有代码说明如何使用预置语句插入W3学校的记录,但不选择数据。我仍在努力解决这个问题,基本上是一样的。准备、绑定数据、执行。对于select,在执行后获取数据。那么,你是说因为我没有实际插入数据,所以我不需要使用真正的字符串,而是htmlspecialchars?我当然希望他不是这么说的。我真的不知道为什么人们会发布关于html字符和html属性的答案@Jonathan You在另一个答案下发表了这样的评论:“我只是想检查用户输入的电子邮件地址是否与数据库中的任何内容匹配。”。如果你正试图这样做,那么你的问题在这一点上是不清楚的,你甚至还没有回答我给你留下的评论。同样如此;如果你想解决这件事;打我。你的代码中有一个语法错误,我告诉了你它是什么,应该是你真正的代码。这不是我要说的。我是说你想用OO的方式做这件事。问题的第一部分。问题的第二部分建议,您希望实际的_escape_字符串返回&alt;(实体)。我是说,真正的逃逸字符串并不能做到这一点。Mysql不需要它。@Fred ii-为您编辑答案并澄清。问题不仅仅包括标题。@Grzegorz I在看到OP留下的问题和评论后,不知道他们在问什么。首先,他们询问如何用OOP的方式来做,然后是检查是否存在一行;我很困惑。我只是想检查用户输入的电子邮件地址是否与数据库中的任何内容匹配,但您的数据库中是否真的有
email=alert(“这里有一个警报”)的记录用户的电子邮件”
WHERE email=”“$link->real\u escape\u string($\u POST['email'])。“'LIMIT 1”;