Php 如何使用mysqli\u real\u escape

Php 如何使用mysqli\u real\u escape,php,mysql,mysqli,Php,Mysql,Mysqli,我一直在把我的网站从mysql转换到mysqli,我想知道我是如何使用mysqli\u real\u escape\u字符串,比如mysqli\u real\u escape\u字符串的。换句话说,我如何像对待旧的转义一样对待带有新转义的字符串 我过去经常这样做 mysql_real_escape_string($string); 但现在我必须做 mysqli_real_escape_string(<-What should i put here?->,$string); 所有m

我一直在把我的网站从mysql转换到mysqli,我想知道我是如何使用mysqli\u real\u escape\u字符串,比如mysqli\u real\u escape\u字符串的。换句话说,我如何像对待旧的转义一样对待带有新转义的字符串

我过去经常这样做

mysql_real_escape_string($string);
但现在我必须做

mysqli_real_escape_string(<-What should i put here?->,$string);

所有mysql*函数都隐式地在幕后传递一个打开的连接。在mysqli中,始终必须显式地传递连接。这是更好的编码实践。为此,您可以选择两种样式,即程序样式和面向对象样式:

$link = mysqli_connect(...);

$string = mysqli_real_escape_string($link, $string);
$string = $link->real_escape_string($string);

更好的是,你应该使用。有关一些背景信息,请参阅。

所有mysql*函数都在后台隐式传递打开的连接。在mysqli中,始终必须显式地传递连接。这是更好的编码实践。为此,您可以选择两种样式,即程序样式和面向对象样式:

$link = mysqli_connect(...);

$string = mysqli_real_escape_string($link, $string);
$string = $link->real_escape_string($string);
更好的是,你应该使用。请参阅了解一些背景信息。

根据原型

string mysqli_real_escape_string ( mysqli $link , string $escapestr )
这意味着,作为必须提供mysqli链接标识符的第一个参数,第二个参数应该是要转义的字符串

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$escapedValue = mysqli_real_escape_string($link, "yourString");
?> 

根据原型

string mysqli_real_escape_string ( mysqli $link , string $escapestr )
这意味着,作为必须提供mysqli链接标识符的第一个参数,第二个参数应该是要转义的字符串

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$escapedValue = mysqli_real_escape_string($link, "yourString");
?> 

出于安全考虑,最好按照建议使用准备好的语句。Mysql\u real\u escape\u字符串可能不足以防止sql注入,例如,尽管有escape函数(),但多字节字符集可能被滥用

用PHP编写的语句可以这样使用:

  $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
  $stmt->bindParam(1, $name);
  $stmt->bindParam(2, $value);

出于安全考虑,最好按照建议使用准备好的语句。Mysql\u real\u escape\u字符串可能不足以防止sql注入,例如,尽管有escape函数(),但多字节字符集可能被滥用

用PHP编写的语句可以这样使用:

  $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
  $stmt->bindParam(1, $name);
  $stmt->bindParam(2, $value);

没有人告诉您,在应用程序代码中,您不能手动调用此函数。
只能将此函数用作格式化工具,以支持手动解析的占位符(如果有)。否则就有很好的机会进行注射

大多数人不理解这个功能的含义。他们认为这是为了保护他们的查询不被注入。而事实并非如此

假设这样的保护是你的首要目标,你必须学会做这项崇高工作的是事先准备好的声明

大多数人也不理解准备好的语句的含义,将准备好的语句的一般概念与某些API提供的非常有限的实现混淆起来

mysqli提供的一个实例实际上是不可用的,不管它与愚蠢的手动示例有什么不同。因此,人们必须发明自己的数据库库,建立在API之上(API实际上是为了这个目的,但出于某种原因,到处都以原始形式使用,这是错误的)


因此,您可以从中了解此函数的正确用法,或者直接开始使用,而不是丑陋的原始API调用。没有人告诉您,在应用程序代码中,您不能手动调用此函数。
只能将此函数用作格式化工具,以支持手动解析的占位符(如果有)。否则就有很好的机会进行注射

大多数人不理解这个功能的含义。他们认为这是为了保护他们的查询不被注入。而事实并非如此

假设这样的保护是你的首要目标,你必须学会做这项崇高工作的是事先准备好的声明

大多数人也不理解准备好的语句的含义,将准备好的语句的一般概念与某些API提供的非常有限的实现混淆起来

mysqli提供的一个实例实际上是不可用的,不管它与愚蠢的手动示例有什么不同。因此,人们必须发明自己的数据库库,建立在API之上(API实际上是为了这个目的,但出于某种原因,到处都以原始形式使用,这是错误的)


因此,这里有一个示例,您可以从中了解此函数的正确用法,或者开始使用它,而不是丑陋的原始API调用。

您可以像使用旧的mysql一样使用它。你用这种方法有什么问题?更好的是,既然您可以选择mysqli,就应该使用准备好的语句。除了此版本要求第一个参数是连接标识符,第二个参数是要使用过程样式代码转义的字符串外:我收到了此错误,它在注释中。您读过文档了吗?它解释了它的期望。您可以使用PDO数据库连接器和不需要转义的准备好的语句。您可以像使用旧的mysql一样使用它。你用这种方法有什么问题?更好的是,既然您可以选择mysqli,就应该使用准备好的语句。除了此版本要求第一个参数是连接标识符,第二个参数是要使用过程样式代码转义的字符串外:我收到了此错误,它在注释中。您读过文档了吗?它解释了它的期望。您可以使用PDO数据库连接器和不需要转义的准备好的语句。谢谢你,巴德,解决了我的问题。忘记它在函数中,链接没有到达它,几分钟后将接受答案Hanks bud,解决了我的问题。忘了它在函数中,链接没有到达它,几分钟后将接受答案我看着它太难了,现在你已经指出了,我不敢相信我错过了它我看着它太难了,现在你已经指出了,我不敢相信我错过了它