创建一个不等于NULL的函数参数数组?

时间:2010-09-01 17:18:38

标签: php arrays arguments

我将首先解释我的最终目标,因为可能有更好的解决方案。

我有一个名为updateUser的函数,它接受以下参数:

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

正如您所看到的,我已将它们设置为NULL,因此如果它们未通过该函数,则它们将变为空白。对? (我希望我做对了)

问题是每个参数(传递的)都包含将要发送到数据库的用户的信息,我只想在查询中包含传递的变量,因为我不想设置数据库中未传递给(空白)的那些。

所以我提出了将所有传递的参数都推到一个数组中的想法。然后循环遍历数组中的每个项目并生成如下字符串:

$string = "$password, $email";

那么,有什么建议吗?正如我所说,如果有另一种更好的方法来解决这个问题,我不必使用这种方法。

先谢谢!

4 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分: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'))

答案 2 :(得分:0)

获取所有参数并过滤掉不是字符串的变量。

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

答案 3 :(得分:0)

我认为问题在于您可能无法正确调用该函数。当你这样做时:

updateUser('pass', 'user', '', '', 'user@example.com');
<$> $ lastname和$ age的值不是null,而是空字符串。但如果你这样称呼它:

updateUser('pass', 'user', null, null, 'user@example.com');

它们将保持为空。