Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将mySQLi准备好的语句传递给函数_Php_Function_Session_Mysqli_Prepared Statement - Fatal编程技术网

Php 如何将mySQLi准备好的语句传递给函数

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

我有一个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,它就可以工作。所以,让它的工作方式,因为这是建议由于

您的验证器不应该负责执行语句,而是 仅针对其名称=验证

验证器应该做的唯一一件事就是返回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您是对的,在准备语句之前应该先进行验证-如果数据无效,那么准备statemetns
return$validationResult
就没有任何意义了,这里应该有闭包。否则,它将抛出一个分析错误。@Funk-49-Niner纠正了这个错误谢谢@Jimmix我看到了,并修复了一些错误:-)