2009-06-01 95 views
13

我有两个功能是这样的:通过所有参数给另一个函数

function mysql_safe_query($format) { 
    $args = array_slice(func_get_args(),1); 
    $args = array_map('mysql_safe_string',$args); 
    $query = vsprintf($format,$args); 
    $result = mysql_query($query); 
    if($result === false) echo '<div class="mysql-error">',mysql_error(),'<br/>',$query,'</div>'; 
    return $result; 
} 

function mysql_row_exists() { 
    $result = mysql_safe_query(func_get_args()); 
    return mysql_num_rows($result) > 0; 
} 

的问题是,第二个功能将无法正常工作,因为它传递的参数传递给第一个为一个数组,当预期他们作为不同的参数。有没有什么办法可以解决这个问题,最好不要修改mysql_safe_query

回答

21

如何使用:

$args = func_get_args(); 
call_user_func_array('mysql_safe_query', $args); 
+3

http://uk.php.net/func_get_args说:“注意:因为此函数依赖于当前范围来确定参数详细信息,所以它不能用作函数参数。如果必须传递此值,则结果应该被分配给一个变量,并且该变量应该被传递。“ – VolkerK 2009-06-01 21:04:46

0

根据不同的情况,以下也可能为你工作,可能会快一点。

function mysql_safe_query($format) { 
    $args = func_get_args(); 
    $args = is_array($args[0]) ? $args[0] : $args; // remove extra container, if needed 
    // ... 

现在允许这两种类型的呼叫,但如果您的第一个值应该是实际阵列可能是有问题的,因为它会被解压缩两种方式。

你可以另外检查根数组的长度,所以如果还有其他元素可能不会被解压缩,但是正如上面提到的那样:它通常不是真的那么“干净”,但可能是有用的,快:-)

3

NB在PHP 5.6,你现在可以这样做:

function mysql_row_exists(...$args) { 
    $result = mysql_safe_query(...$args); 
    return mysql_num_rows($result) > 0; 
} 

此外,对于未来的读者,mysql_ *已被弃用 - 不使用这些功能。

相关问题