在预准备语句中处理动态的答案数

时间:2017-10-11 19:56:59

标签: php database

在前端我正在使用JQuery Validate,我将以下内容传递给后端

data: {
    'field1':  $("input[name='field1']:checked").val(),
    'field2':  $("input[name='field2']:checked").val(),
    'field3': $("#field3").val(),
    'field4' : $("#field4").val(),
    'field5' : $("#field5").val(),
    'field6' : $("#field6").val()
}

前三个字段是必需的,因此它们将始终具有值。接下来的三个是可选的,因此它们可能没有值。在我的PHP文件中,我为必填字段做了类似的事情

if (!empty($_POST["field1"])) {
    $field1 = filter_var($_POST["field1"], FILTER_SANITIZE_STRING);
    array_push($inputArray, $field1);
} else{
    $errors['field1'] = 'Please select field1';
}

对于我可选的字段

if (!empty($_POST['field4'])) {
    $field4 = filter_var($_POST["field4"], FILTER_SANITIZE_STRING);
    array_push($inputArray, $field4);
}

到此结束时,我有一个$inputArray,它可能包含3-6个值,并传递给我的数据库文件。在这里,我正在做这样的事情

$stmt = $dbh->prepare("INSERT INTO database_table(Field1, Field2, Field3, Field4, Field5, Field6) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bindParam(1, $this->inputArray[0]);

现在对于前三个会很好,但是如果我尝试一个可选元素而不是那个,那么就会抛出错误。

处理这类情况的最佳方法是什么?在PHP文件中,我是否应该总是为可选字段的三个if语句推送一个空值,例如

else {
    array_push($inputArray, '');
}

我知道一些我可能会使用的解决方案,只是希望得到其他人如何处理它的意见。

由于

1 个答案:

答案 0 :(得分:1)

我发现处理此类问题的最佳方法是动态构建查询。使用关联$inputArray时,这种方法更容易。因此,而不是做

array_push($inputArray, $field1);

待办事项

$inputArray['field1Name'] = $field1;

替换" field1"每个字段都有适当的值。

这样你可以像这样构建你的查询:

$qry = "INSERT INTO database_table(";
$qry .= implode(',', array_keys($inputArray)); //append a comma separated list of field names.
$qry .= ") VALUES("
$qry .= trim(str_repeat('?,', count($inputArray)), ','); //append ?, for each element in the array and trim the trailing comma
$qry .= ')';

$stmt = $dbh->prepare($qry);
$stmt->execute( array_values($inputArray)); //Execute the query with the values from the input array

通过这种方式,sql查询中的参数数量是动态的,并且基于填写的字段数。

这可以很容易地改为使用命名参数而不是?,但一般概念是相同的。