我不是一个了不起的开发人员,所以请耐心等待,但我已经开始使用类和函数了,我真的很喜欢如何编写库。我可以使用所有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)
{
答案 0 :(得分:1)
function escape_vars(array &$arr) {
function ev(&$var) {
$var = '*'.$var;
}
array_walk_recursive($arr,'ev');
}
该函数接受通过引用传递的多维值数组,并对更改所有值的数组中的每个值运行一个函数。不要那样做。
使用准备好的陈述。这里有程序风格的例子:
答案 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
...
}
}