我正在尝试使用新的PHP mysqli扩展。我有一个函数(safe())递归使用mysql_real_escape_string来使字符串安全。如何在此函数中使用我的mysqli连接来调用mysqli :: escape_string()函数?
示例:
$db = new mysqli($host,$user,$password,$database_name);
function safe ($data) {
if(!is_array($data)) {
if(!get_magic_quotes_gpc()) {
$data = **mysqli::escape_string($data)**
return $data;
}
} else {
return array_map('safe',$data);
}
}
我在safe()里面有 mysqli :: escape_string()我怎么称呼它?在函数之外它将是$ db-> escape_string()但是我找不到一种方法来调用它。我已经尝试将$ db传递给函数,使$ db全局等。另一种方法是使用过程mysqli_escape_string()但是需要将mysqli链接资源显式传递给它,但我找不到办法访问它。
答案 0 :(得分:6)
将您的数据库对象传递给函数。
function safe ($data, $db) {
if(!is_array($data)) {
if(!get_magic_quotes_gpc()) {
$data = $db->escape_string($data);
}
} else {
return array_map('safe',$data);
}
}
答案 1 :(得分:1)
我会扩展mysqli类:
class mysqliA extends mysqli{
function escape_string($data){
if(!is_array($data)) {
if(!get_magic_quotes_gpc()) {
$data = $this->escape_string($data);
return $data;
}
} else {
return $this->escape_string($data);
}
}
}
这样你只需要打电话
$db = new mysqliA();
$db->escape_string($data);
答案 2 :(得分:0)
我不想鼓励你使用全局变量,但如果你想从安全函数访问$db
,你必须将global $db;
放在函数的开头。
导致:
$db = new mysqli($host,$user,$password,$database_name);
function safe ($data) {
global $db;
if(!is_array($data)) {
if(!get_magic_quotes_gpc()) {
$data = $db->escape_string($data);
return $data;
}
} else {
return array_map('safe',$data);
}
}
请注意全局变量被视为邪恶,不应使用。
那你应该怎么用?那么,对于你的用例,registry pattern(以后记住这一点)可能最适合。但是为了让您开始使用面向对象的编程,您现在应该尝试以下方法:
class myClass {
protected $db;
public function __construct() {
$this->db = new mysqli($host,$user,$password,$database_name);
}
function safe ($data) {
if(!is_array($data)) {
if(!get_magic_quotes_gpc()) {
$data = $this->db->escape_string($data);
return $data;
}
} else {
return array_map('safe',$data);
}
}
}
我建议您阅读有关面向对象编程的更多信息,因为它可以帮助您编写更好,更可重用的代码。
希望我能提供帮助。
答案 3 :(得分:0)
如果我扩展我得到的课程:
Notice: Undefined variable: db in *file path* on line 22
Fatal error: Call to a member function escape_string() on a non-object in *file path* on line 22
第22行是函数的位置
如果我传递mysqli对象,我得到:
Warning: Missing argument 2 for safe() in *file path* on line 17
Notice: Undefined variable: db in *file path* on line 22
Fatal error: Call to a member function escape_string() on a non-object in *file path* on line 22
我的函数调用是:
$item[$form] = safe($item[$form],$db);
所以显然没有遗漏第二个变种
我无法围绕该函数构建一个类并初始化一个新的mysqli连接(这似乎无论如何都是低效率的高度),因为我必须使safe()成为一个静态函数,使其成为一个有效的回调函数。 array_map()并没有语法似乎适用于这一行:
$data = $this->db->escape_string($data);
尝试了
$data = $this->db->escape_string($data);
$data = self::db::escape_string($data);
$data = self::db->escape_string($data);
答案 4 :(得分:0)
在db类文件中创建一个公共函数
function escape($string)
{
return $this->connection->real_escape_string($string);
}
你可以像这样使用它
function safe()
{
$id=$this->mysqli->escape($this->id);
$status=$this->mysqli->escape($this->status);
$shortcode=$this->mysqli->escape($this->shortcode);
}
功能的使用取决于你将如何使用它