2011-05-07 63 views
3

我有一个小的编程问题。我试图在一个类中执行一个功能,我有我使用array_walk对数组中的每个变量执行功能的阵列。问题是我正在执行的函数是同一个类中的一个方法。我查看了我的代码,但无法找到问题所在。请让我知道这个错误的可能解决方案是什么,或者如果你看到我没有看到的东西。使用数组走在类

目前,它甚至没有执行该功能escape()。我故意在状态变量中添加了一个'',因为我希望它能够被转义,但它没有被执行。

一点背景:这是一个数据库级的我建设和prepare()方法将有助于在执行之前在查询中逃脱的变量。我删除了一些与此问题无关的代码。

这是它给我的结果:UPDATE table_name SET status='I'm doing good!' WHERE username='someone'

<?php 
class Database { 
    var $weak_escape = false; 

    function escape($str) { 
    if ($this->weak_escape) return $this->weak_escape($str); 
    else return $this->sql_escape($str); 
    } 

    function weak_escape($str) { 
    return addslashes($str); 
    } 

    function sql_escape($str) { 
    return mysql_real_escape_string($str); 
    } 

    function prepare($query) { 
    $args = func_get_args(); 
    array_shift($args); 
    array_walk($args, array(&$this, 'escape')); 
    return vsprintf($query, $args); 
    } 
} 

$db = new Database(); 
$username = "someone"; 
$status = "I'm doing good!"; 
echo $db->prepare("UPDATE table_name SET status='%s' WHERE username='%s'", $status, $username); 
?> 
+0

我想应该是这样的$ DB =新的数据库();而且我很确定,如果不是真的,通过参考实际很快通过折旧。 – robx 2011-05-07 00:47:19

+0

是啊,这只是我的坏习惯,在最后的代码有变数存在,在这个网站,我忘了部分打字时。不过谢谢,我修正了上面的例子。显然这并没有解决这个问题。 – 2011-05-07 00:50:37

+0

在哪里执行转义函数?编辑:没关系,我看到它。尽管我不认为你需要和你在一起。 $这应该已经指向类没有? – robx 2011-05-07 00:54:57

回答

1

你需要修改的参数(数组项的参考),如果您返回它没有这样做。 我这样做:

class Database { 
    function escape($str) { 
     return addslashes($str); 
    } 

    function prepare($query) { 
    $args = func_get_args(); 
    $args[1] = $this->escape($args[1]); 
    array_shift($args); 
    array_walk($args, array($this, 'escape')); 
    return vsprintf($query, $args); 
    } 
} 

$db = new Database(); 
$username = "someone"; 
$status = "I'm doing good!"; 
print $db->prepare("UPDATE table_name SET status='%s' WHERE username='%s'", $status, $username); 

得到结果:

UPDATE table_name SET status='I\'m doing good!' WHERE username='someone' 
+0

最终这样做了。谢谢你,通常我会这样做,但我想我会尽量减少代码量,然而少一些代码最终会伤害到我。通常我不会使用&但它显然有所作为。 – 2011-05-07 01:17:30

2

I'de让我的逃生功能静态的,因为它是为每一个实例相同:

class Database { 
    static function escape($str) { 
     return addslashes($str); 
    } 

    function prepare($query) { 
     $args = func_get_args(); 
     array_shift($args); 
     array_walk($args, array('Database', 'escape')); //Look here 
     return vsprintf($query, $args); 
    } 
} 

希望这有助于。

function escape(&$str) 
{ 
    $str=addslashes($str); 
} 
+0

我有一种感觉,将我给我的。然而实际的代码不会因为内'函数escape($ STR)的工作例如工作'这让$这个参考类中的另一种方法。让我试着更新我上面的例子来展示我的意思。 – 2011-05-07 01:07:19

1

希望这是你在找什么:干杯