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

时间:2018-10-09 22:02:46

标签: php function session mysqli prepared-statement

我有一个准备好的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

1 个答案:

答案 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,但实际上还可以执行语句。