2009-06-01 8 views
13

I tienen dos funciones como esto:Pass todos los argumentos a otra función

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; 
} 

El problema es que la segunda función no funcionará porque pasa los args al primero como una matriz, cuando espera ellos como diferentes parámetros. ¿Hay alguna forma de evitar esto, preferiblemente sin modificar mysql_safe_query?

Respuesta

21

Cómo sobre el uso:

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

http://uk.php.net/func_get_args dice: "Nota: Como esta función depende del alcance actual para determinar los detalles de los parámetros, no se puede usar como un parámetro de función. Si se debe pasar este valor, los resultados debería asignarse a una variable, y esa variable debería pasarse ". – VolkerK

+0

perfecto! @volker: no parece ser un problema en este caso. – mpen

+0

@volker: err..nevermind. tienes razón. no se quejó la última vez, pero ahora lo es. Supongo que es mejor obedecer las advertencias. – mpen

0

Dependiendo de la situación, siguiendo también podría funcionar para usted y podría ser un poco más rápido.

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

que ahora permite para ambos tipos de llamadas, pero podría ser problemático si su primer valor se supone que es una matriz real , porque sería desempaquetado de cualquier manera.

También puede verificar la longitud de su matriz raíz, por lo que podría no desempaquetarse si hay otros elementos, pero como se mencionó: No es realmente tan "limpio" en general, pero podría ser útil y rápido :-)

3

NB En PHP 5.6 ahora se puede hacer esto:

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

Además, para los futuros lectores, mysql_ * es obsoleto - no utilizar esas funciones.

Cuestiones relacionadas