2010-09-01 122 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')) 
相关问题