2010-09-01 65 views
0

我將首先解釋我的最終目標是什麼,因爲可能有更好的解決方案。創建一個不等於NULL的函數參數數組?

我有一個名爲updateUser函數接受下列參數:

function updateUser($password = NULL, $name = NULL, $lastname = NULL, $age = NULL, $email = NULL, $relation = NULL) 

正如你可以看到我已經將它們設置爲NULL,所以如果他們不通過他們變成空白的函數傳遞。對? (我希望我得到了這個權利)

問題是,這些參數(它們都傳遞)中的每一個都包含要發送到數據庫的用戶的信息,而我只想包含傳遞的變量因爲我不想設置那些沒有傳遞給數據庫(空白)的查詢。

所以我想出了這個想法,把所有傳遞的參數,並推到一個數組。然後遍歷數組中的每個項目並生成如下字符串:

$string = "$password, $email"; 

那麼,有什麼建議嗎?正如我所說的,如果有另一種更好的方法來解決這個問題,我不必使用這種方法。

感謝advandce!

回答

0

獲取不是字符串的所有參數和過濾器變量。

$arguments = func_get_args(); 
array_filter($arguments, 'is_string'); 
//$arguments will be an array with numeric indices 
+0

我找到了一個更好的解決方案,但我會牢記這一點。我在PHP檔案中搜索了這樣一個永恆的功能,哈哈。感謝帖子! – qwerty 2010-09-02 19:10:01

1

使用功能call_user_func()(php.net docs),你可以根據被傳遞給函數哪些數據調用數據庫INSERT或UPDATE命令。

例如:

function updateUser($password = NULL, $name = NULL, $lastname = NULL, 
    $age = NULL, $email = NULL, $relation = NULL) 
{ 
    $array = array(); 

    // Create an array with indices of passed parameters: 
    if($password !== NULL) // !== to check for NULL and not empty string. 
     $array["password"] = $password; 
    if($name !== NULL) 
     $array["name"] = $name; 
    // etc... 

    call_user_func("addToDb", $array); 
} 

function addToDb($detailsArray) 
{ 
    foreach($detailsArray as $detail) 
    { 
     // Add $detail's key with $detail's value to database. 
    } 
} 
+0

我會給你一個鏡頭,並很快回復!看起來不錯! :) – Nike 2010-09-01 17:54:02

+0

這是'call_user_func_array()'的錯誤用法。 'call_user_func_array()'將第二個參數(應該是一個數組)中的每個元素作爲一個單獨的參數,即'call_user_func_array('foobar',array('a','b','c')) ;'相當於'call_user_func'('foobar','a','b','c');'或簡單地'foobar('a','b','c');'(參見[ 'call_user_func()'](HTTP:// PHP。net/call_user_func_array)) – Frxstrem 2010-09-01 18:29:10

+1

經過一番苦苦掙扎之後,我終於找到了工作。當我第一次看到它時,我就像是「跆拳道」,這可能會如何工作?但後來我通讀了它,並變得更加邏輯。這很好,謝謝。 – qwerty 2010-09-02 19:05:39

0

我認爲問題是,你可能不正確地調用該函數。當你這樣做:

updateUser('pass', 'user', '', '', '[email protected]'); 

比$ lastname和$ age的值不會爲空,而是一個空字符串。但是如果你這樣稱呼它:

updateUser('pass', 'user', null, null, '[email protected]'); 

它們將保持爲空。

1

我想這將是更加靈活,如果你只是傳遞一個包含應該更新的屬性/值對一個數組:

function updateUser($props) { 
    $names = array('password', 'name', 'lastname', 'age', 'email', 'relation'); 
    $arr = array(); 
    for ($names as $name) { 
     if (isset($props[$names])) { 
      $arr = "$name = '".mysql_real_escape_string($props[$names]).'"'; 
     } 
    } 
    if (!empty($arr)) { 
     $query = "UPDATE … SET ".implode(',', $arr); 
    } 
} 

然後調用這個函數與應該更新的屬性數組:

updateUser(array('name'=>'User A', 'password'=>'secret')) 
相關問題