2009-06-01 90 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_ *已被棄用 - 不使用這些功能。

相關問題