0

我不是一个了不起的开发人员,所以请多多包涵,但我已经开始使用类和函数,而且我真的很喜欢编写库的方式。一个页面,我的所有 PHP 都可以去。不过我在想,如果我可以检查构造中函数的变量,并在运行函数之前将它们全部转义,我的生活会轻松一百万倍。这样,我就不必为每个函数转义每个变量。

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

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

任何人都可以告诉我这是否可能,如果没有,你还能建议什么其他选择?

PS 我还不够先进,无法使用 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)
{
4

3 回答 3

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

于 2012-12-16T05:07:15.900 回答
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
        ...
    }
}
于 2012-12-16T05:02:55.060 回答
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 在这里更难处理,因为它要求事物是引用。

于 2012-12-16T04:09:40.623 回答