我有一个PHP函数,通过Web表单接受一些(很多)参数。
是否可以检查这些参数是否为空,如果是,请将这些参数设置为null
值?我知道可能有更有效的方法来实现我正在做的事情,但我如何继续我目前的代码呢?
而不是像我下面的示例代码那样单独检查每一个,是否有更有效的方法?
public function test ($param1, $param2, $param3, $param4, $param5, $param6, $param7, ... ) {
$param1 = ($param1 != '') ? $param1 : NULL;
$param2 = ($param2 != '') ? $param2 : NULL;
$param3 = ($param3 != '') ? $param3 : NULL;
$param4 = ($param4 != '') ? $param4 : NULL;
$param5 = ($param5 != '') ? $param5 : NULL;
$param6 = ($param6 != '') ? $param6 : NULL;
$param7 = ($param7 != '') ? $param7 : NULL;
// etc
}
然后我使用预准备语句将这些值发送到mysql数据库。
我喜欢使用关联数组而不是单个变量。关联数组将字符串键映射到值。
我最终将这个关联数组传递给PDOStatement::execute()
方法,作为预处理语句的参数。这意味着必须存在所有键,并且只存在预准备语句中指定的键。
所以我需要我的param数组都填充默认值,如果它们不在数组中,我需要它被截断以删除不需要的元素。
public function fillAndTruncate($params, $paramDefaults) {
$params = array_merge($paramDefaults, array_intersect_key($params, $paramDefaults));
return $params;
}
我可能会像这样使用这个函数:
$paramDefaults = [
'name' => NULL,
'phone' => NULL,
'age' => 0,
'country' => 'USA'
];
$sql = 'INSERT INTO mytable SET name = :name, phone = :phone, age = :age, country = :country';
$stmt = $pdo->prepare($sql);
$stmt->execute(fillAndTruncate($_POST, $paramDefaults));
如果将params加载到单个变量中,则可以执行简单的foreach,并且不需要像在问题中那样使用else,因为只有在值为空时才更改值。
您的表单和它的输入看起来像这样:
<form action="action-calling-your-function.php" method="post">
<input type="text" name="params[]" />
<input type="text" name="params[]" />
</form>
该函数可能如下所示:
public function test ($params) {
foreach ($params as $param) {
if (empty($param))
$param = NULL;
}
}
注意:我还使用了包含所需的empty()
值的''
函数,但其他值将返回true。 Here is the documentation