获取构造中列出的函数的变量?

时间:2012-12-16 04:00:05

标签: php

我不是一个了不起的开发人员,所以请耐心等待,但我已经开始使用类和函数了,我真的很喜欢如何编写库。我可以使用所有PHP的单个页面。我在想,如果我能检查构造中函数的变量,并且在运行函数之前将它们全部转义,那么我的生命将会轻松一倍。这样,我就不必为每个函数转义每个变量。

我需要能够以某种方式检查构造并查看函数中的变量,然后转义它们。

so X = 'Variable for a function' 
   X = mysqli_real_escape_String($conn, X);

有人可以告诉我这是否可能,如果没有,你能提出哪些其他选择?

P.S。我还不够先进,不能使用PDO,所以请保留对程序编程的建议。

对不起,也许我没有正确解释这个问题。我正在尝试做的是消除在我的库中转义变量的需要,当有人调用函数时($ vars)。因此,我们的想法是在__construct中编写一些类型的脚本,它将检查$ vars并在函数运行之前将其转义。

class users
{
function __construct()
{
   //the idea is that i can somehow escape the variables within the function
   //for the function that's being called
    function magical_funtion_that_calls_all_variables()
    {
        foreach($var)
        {
            $var = mysqli_real_escape_string($conn, $var);
        }
    }
}

function register($user, $pass1, $pass2)
{

3 个答案:

答案 0 :(得分:1)

function escape_vars(array &$arr) {
  function ev(&$var) {
    $var = '*'.$var;
  }
  array_walk_recursive($arr,'ev');
}

该函数接受通过引用传递的多维值数组,并对更改所有值的数组中的每个值运行一个函数。不要那样做。

使用准备好的陈述。这里有程序风格的例子:

http://us1.php.net/manual/en/mysqli.prepare.php

答案 1 :(得分:0)

class users
{
  public function __construct()
  {
     //this is to set up the class you dont want to escape values until just before you
     // execute a query!
  }

  public function register($user, $pass1, $pass2)
  {
     // DO THE ESCAPING HERE
     $user = mysqli_real_escape_string($conn, $user);
     $pass1 = mysqli_real_escape_string($conn, $pass1);
     $pass2 = mysqli_real_escape_string($conn, $pass2);

     //now do your query
  }
}

不是100%清楚你问的是什么,但我认为你只想检查类型,例如:

if(is_string($x)) {
  $x = mysqli_real_escape_string($x);
}

所以在使用者的上下文中:

public function __construct() {
   $args = func_get_args();
   foreach($args as $key => $arg) {
      if(is_string($arg) {
         $args[$key] = myqli_real_escape_string($arg);
      }
   }
}

前面示例的问题是现在您必须使用数字索引的$args数组,而不是您可能在构造函数定义中定义的任何“命名”参数。

所以你应该做的就是手动检查所有参数。这不应该是一个令人头痛的问题,因为如果你有超过5个你做错了什么。

那说使用PDO或Mysqli的OO api不比使用函数困难,除非你试图扩展类。所以我仍然建议使用它们。即使在程序环境中,它们也使IMO变得更容易。

现在,就您的具体示例而言,您确实应该使用有助于转义以及查询(语句)重用的预准备语句。那么mysqli在这里处理垃圾比较困难,因为它要求事情可以参考。

答案 2 :(得分:0)

我不认为你在做什么是一个很好的解决方案。如果您想传递一个您不希望被转义的参数,会发生什么?如果您想要的唯一真实原因是因为您懒惰(我们都是......)那么您可以创建自己的"包装"在1个简单的调用中转义值的方法。

如:

class User
{
    public function register($user, $pass1, $pass2)
    {
        list($user, $pass1, $pass2) = $this->escape($user, $pass1, $pass2);
        ...
    }

    private function escape()
    {
        $args = func_get_args();
        foreach ($args as &$arg)
        {
            $arg = myqli_real_escape_string($arg);
        }
        return $args;
    }
}

PS:正如其他人所建议的那样,我高度建议使用预备语句。它们起初很吓人,但很容易掌握并消除潜在的安全风险。

虽然我根本不推荐它,但这里有一种方法可以完全满足您的需求:

class User
{
    public function __call($methodName, $args)
    {
        foreach ($args as &$arg)
            $arg = myqli_real_escape_string($conn, $arg);

        call_user_func_array(array($this, $methodName), $args);
    }

    private function register($user, $pass1, $pass2)
    {
        // $user, $pass1, $pass2 will all be escaped
        ...
    }
}