我一直在将我的网站从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
答案 0 :(得分:2)
根据PHP Manual,原型是
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");
?>
答案 1 :(得分:2)
出于安全原因,最好使用建议的here语句。 Mysql_real_escape_string可能不足以阻止sql注入,例如因为尽管有转义函数()。mysql_real_escape_string() versus Prepared Statements。
,但多字节字符集可能会被滥用PHP中的预处理语句可以像这样使用:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
答案 2 :(得分:1)
所有mysql *函数都隐式地在后台传递了一个打开的连接。在mysqli中,您始终必须明确地传递连接。这是更好的编码实践。为此,您可以选择两种样式,即过程和面向对象:
$link = mysqli_connect(...);
$string = mysqli_real_escape_string($link, $string);
$string = $link->real_escape_string($string);
更好的是,你应该使用prepared statements。有关背景信息,请参阅The Great Escapism (Or: What You Need To Know To Work With Text Within Text)。
答案 3 :(得分:0)
在应用程序代码中,没有人告诉你你不能手动调用此函数 可以使用此功能仅作为格式设施,以支持手动解析的占位符(如果有)。否则有一个很好的机会允许注射。
大多数人都不理解这个功能的含义。他们想象它旨在保护他们的查询不被注入。虽然不是。
假设这样的保护是您的首要目标,您必须了解这是一项高尚的工作准备好的陈述。
大多数人也不理解准备语句的含义,混淆了准备语句的一般概念,某些API提供的实现非常有限。
mysqli提供的一个几乎无法使用,无论哪种情况都与愚蠢的手动示例不同。因此,必须发明自己的数据库库,建立在API(实际上用于API的API,但出于某种原因在任何地方以原始形式使用,这是错误的)。
所以,这里有一个safeMysql DBAL,你可以从中学习正确使用这个函数,或者只是开始使用而不是丑陋的原始API调用。