如何将 mySQLi 准备好的语句传递给函数
How to pass a mySQLi prepared statement to a function
我有一个 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
我不明白为什么它可能无法工作。
你提到如果你在这个函数之外使用 execute 它会起作用。所以让它保持原样,因为 Single responsibility principle.
建议这样做
你的验证器不应该负责执行语句但是
仅针对其名称所说的 = 验证。
验证器唯一应该做的就是 return 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
但实际上也在执行语句。
我有一个 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
我不明白为什么它可能无法工作。 你提到如果你在这个函数之外使用 execute 它会起作用。所以让它保持原样,因为 Single responsibility principle.
建议这样做你的验证器不应该负责执行语句但是 仅针对其名称所说的 = 验证。
验证器唯一应该做的就是 return 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
但实际上也在执行语句。