例如,我讨厌打字:
$x = mysql_escape_string(stripslashes($_GET['x']));
有没有办法在init.php或其他东西中对这两个函数进行别名而不编写一个单独的函数,该函数接受一个参数并返回那些应用了那些函数的参数?
我的C / C ++不是很好,但我认为这有点像#typedef但是对于函数来说?
答案 0 :(得分:8)
我希望您的示例不代表您的项目。
stripslashes()
不一定是必要的 - 如果你发现它,请关闭php.ini中的magic_quotes_gpc
。 mysql_real_escape_string()
(或prepare
/ execute
对)代替mysql_escape_string()
,它应该是您的SQL汇编的地方,而不是您所在的位置从URL中检索值。解决这两个问题并将代码退化为
$x = $_GET['x'];
答案 1 :(得分:4)
function myget($string)
{
return mysql_real_escape_string(stripslashes($_GET[$string]));
}
这是PHP中的解决方案。
答案 2 :(得分:2)
这应该可以解决问题:
// Macros
$mes = "mysql_escape_string";
$ss = "stripslashes";
// Using your macros
$x = $mes($ss($_GET['x']));
虽然我不建议这样编码。
我只是在回答这个问题,因为你说你不想创建任何新功能并获得类似“#define”的功能。
答案 3 :(得分:2)
我会考虑Bill Karwin的建议,但我想补充一点,我认为这很重要。
如果你想用c(...)替换对(b(...))的重复调用,那么c本身就有一些含义 - 除了简单的构图。想想上下文,以及如何命名这样的函数。通常它会有一些自己的语义,并不特别依赖于a,b - 这只是一个实现。如果是这种情况,那么很容易将其视为一个(简单的)函数,它本身就是通过调用b然后执行a来实现的。在这种情况下的简单性可能诱使你想要“别名”一个函数,但在一般情况下,这可能不太有帮助。
现在在这个特殊情况下我会想:
严重。这正是您应该使用查询参数来降低SQL注入攻击风险的原因。比你在这里尝试的更可靠。
答案 4 :(得分:1)
您可以使用create_function执行匿名功能:
$newFunc = create_function('', 'return mysql_escape_string(stripslashes($_GET[\'x\']));');
$newFunc();
答案 5 :(得分:0)
如果你想要一个1:1的函数映射,这是有效的,它使回溯有点讨厌,但工作
class DB
{
public static function escape()
{
$args = func_get_args();
return call_user_func_array('mysql_real_escape_string', $args );
}
}
DB::escape( $foo );
现在我在这里使用了func_get_args / call技巧只有一个原因:
此表示法应适用于任何功能。
直接链接它会更加优化
class DB
{
public static function escape($string)
{
return mysql_real_escape_string( $string );
}
}
并且没有充分的理由去剥斜杠,除非你在启用php的那个可怕的“功能”中自动斜杠输入。
class DB
{
public static function un_gpc($string)
{
if( get_magic_quotes_gpc() === 1 )
{
return stripslashes( $string );
}
return $string;
}
public static function escape($string, $quote=false)
{
if( !$quote )
{
return mysql_real_escape_string( $string );
}
return '"' . self::escape( $string ) . '"';
}
public static function escape_gpc( $string , $quote = false )
{
return self::escape( self::un_gpc( $string ), $quote);
}
public static function get( $string , $quote = true )
{
return self::escape_gpc( $_GET[$string] , $quote );
}
}
# Handy Dandy.
$q = 'SELECT * FROM FOO WHERE BAR = ' . DB::get( 'bar' ) ;
答案 6 :(得分:0)
我认为你想要的东西就像一个C宏,它很容易像函数一样使用,但没有调用真实函数那样的开销。 PHP没有任何此类功能。您是否正在尝试使代码更快或更高效?
答案 7 :(得分:-1)
“轻松”,当然? “优雅地”,nope。