我有一个准备好的mySQLi语句和一个函数,我想将其传递给它,以在执行输入之前检查输入是否符合正确的格式。我已经在我的实际代码中确定,如果我将$ stmt-> execute()语句移到它起作用的函数的外面,但是将其移到函数的里面,就行了。我知道可以像这样传递旧式的串联SQL字符串,但是用准备好的语句处理此问题的正确方法是什么?
function validateForm($stmt, $inputType){
// A bunch of stuff here to validate for $inputType.
$stmt->execute();
}
$editSQL = "UPDATE mytable SET input1 = ?, input2 = ?, input3 = ? WHERE thisID = ?";
$stmt = $conn->prepare($editSQL);
$stmt->bind_param('sibi', $input1, $input2, $input3, $thisID);
$input1 = $vPara[1][5];
$input2 = $vPara[2][5];
$input3 = $vPara[3][5];
$thisID = $_SESSION['thisID'];
validateForm($stmt, $inputType);
我得到的具体错误是:
Fatal error: Call to a member function execute() on a non-object
答案 0 :(得分:4)
我不明白为什么它可能无法正常工作。 您提到过,如果在此功能之外使用execute,则可以正常工作。因此,请按原样进行操作,因为Single responsibility principle建议这样做。
您的验证者不应该负责执行语句,但是 只是因为它的名字说=验证。
验证器唯一要做的就是返回true或false 根据该决定,您应该执行或不执行 因此将您的代码更改为以下内容:
<?php
function isFormValid($inputType)
{
// A bunch of stuff here to validate for $inputType.
if (//test cases) {
$validationResult = true;
} else {
$validationResult = false;
}
return $validationResult;
}
$editSQL = "UPDATE mytable SET input1 = ?, input2 = ?, input3 = ? WHERE thisID = ?";
$stmt = $conn->prepare($editSQL);
$stmt->bind_param('sibi', $input1, $input2, $input3, $thisID);
$input1 = $vPara[1][5];
$input2 = $vPara[2][5];
$input3 = $vPara[3][5];
$thisID = $_SESSION['thisID'];
if(isFormValid($inputType)) {
$stmt->execute();
} else {
//do error processing echo, trow exception etc
}
?>
请注意,我更改了验证器名称,所以现在它可以真正表达其功能,而不是被称为validateForm
,但实际上还可以执行语句。