Ответ 1
Как насчет использования:
$args = func_get_args();
call_user_func_array('mysql_safe_query', $args);
У меня есть две функции:
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
?
Как насчет использования:
$args = func_get_args();
call_user_func_array('mysql_safe_query', $args);
N.B. В PHP 5.6 вы можете сделать следующее:
function mysql_row_exists(...$args) {
$result = mysql_safe_query(...$args);
return mysql_num_rows($result) > 0;
}
Кроме того, для будущих читателей mysql_ * устарел - не используйте эти функции.
В зависимости от ситуации последующее может также работать для вас и может быть немного быстрее.
function mysql_safe_query($format) {
$args = func_get_args();
$args = is_array($args[0]) ? $args[0] : $args; // remove extra container, if needed
// ...
Что теперь позволяет использовать оба типа вызовов, но может быть проблематичным, если ваше первое значение должно быть фактическим массивом , потому что оно будет распаковано в любом случае.
Вы можете дополнительно проверить длину вашего корневого массива, чтобы он не распаковывался, если есть другие элементы, но, как уже упоминалось: на самом деле это не "чистое", но может быть полезно и быстро: -)