Php 如何将mySQLi准备好的语句传递给函数
我有一个mySQLi准备好的语句和一个我想传递给它的函数,在执行之前检查输入是否符合正确的格式。我已经在实际代码中确定,如果我将$stmt->execute()语句移到它工作的函数外部,但在函数内部它不工作。我知道一个老式的连接SQL字符串可以像这样传递,但是用准备好的语句处理这个问题的正确方法是什么Php 如何将mySQLi准备好的语句传递给函数,php,function,session,mysqli,prepared-statement,Php,Function,Session,Mysqli,Prepared Statement,我有一个mySQLi准备好的语句和一个我想传递给它的函数,在执行之前检查输入是否符合正确的格式。我已经在实际代码中确定,如果我将$stmt->execute()语句移到它工作的函数外部,但在函数内部它不工作。我知道一个老式的连接SQL字符串可以像这样传递,但是用准备好的语句处理这个问题的正确方法是什么 function validateForm($stmt, $inputType){ // A bunch of stuff here to validate for $inputT
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,它就可以工作。所以,让它的工作方式,因为这是建议由于 您的验证器不应该负责执行语句,而是 仅针对其名称=验证 验证器应该做的唯一一件事就是返回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
,而是实际执行语句。它是如何失败的?想要从验证函数运行查询是很奇怪的。通常没有人会这么做,你的变量都设置好了吗?我假设editSQL
实际上是$editSQL
?您准备的语句使用了$editSQL
,因此我假设它不是一个常量。很难说这是什么editSQL
。如图所示,是一个常量。$vPara
如何/从何处填充?会话数组是否有值?由于很多原因,这个问题还不清楚。如果输入错误,为什么还要准备和绑定?您不应该先验证吗?@IdontDownVote您是对的,在准备语句之前应该先进行验证-如果数据无效,那么准备statemetnsreturn$validationResult
就没有任何意义了,这里应该有闭包。否则,它将抛出一个分析错误。@Funk-49-Niner纠正了这个错误谢谢@Jimmix我看到了,并修复了一些错误:-)