1

我一直在将我的网站从 mysql 转换为 mysqli,并且想知道如何使用 mysqli_real_escape_string,如 mysqli_real_escape_string。换句话说,我如何像旧转义一样处理带有新转义的字符串。

我过去只是做

mysql_real_escape_string($string);

但现在我必须做

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

那么我应该在第一个参数中添加什么来将字符串视为旧转义符?

错误:

Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, string given in /var/www/frostbase/core/functions/general.php on line 22
4

4 回答 4

2

根据PHP 手册,原型是

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");
?> 
于 2013-06-19T06:03:04.043 回答
2

出于安全原因,最好使用此处建议的准备好的语句。Mysql_real_escape_string 可能不足以防止 sql 注入,例如,尽管有转义函数 (),但仍可能滥用多字节字符集。mysql_real_escape_string() 与 Prepared Statements

PHP 中的预处理语句可以这样使用:

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

有关 PHP 中准备好的语句的更多信息

于 2013-06-19T06:18:40.460 回答
1

所有 mysql* 函数都在幕后隐式传递一个打开的连接。在 mysqli 中,您总是必须明确地传递连接。这是更好的编码实践。为此,您可以在两种风格之间进行选择,即面向过程的和面向对象的:

$link = mysqli_connect(...);

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

更好的是,您应该使用准备好的语句。有关一些背景信息,请参阅伟大的逃避现实(或:使用文本中的文本需要知道的内容)。

于 2013-06-19T06:03:01.357 回答
0

没有人告诉你,你不能在应用程序代码中手动调用这个函数。只能
将此功能用作格式化工具,以支持手动解析的占位符(如果有)。否则有一个不错的机会允许注射。

大多数人不明白这个函数的含义。他们认为这是为了保护他们的查询不被注入。虽然不是。

假设这种保护是您的主要目标,您必须了解它是完成这项崇高工作的准备好的声明。

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

mysqli 提供的一个实际上是不可用的,无论哪种情况与愚蠢的手动示例不同。因此,必须发明自己的数据库库,建立在 API 之上(API 实际打算用于这些库,但出于某种原因,到处都以原始形式使用,这是错误的)。

所以,这里有一个safeMysql DBAL,你可以从中学习这个函数的正确用法,或者只是开始使用而不是丑陋的原始 API 调用。

于 2013-06-19T06:59:08.583 回答