如何将 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 但实际上也在执行语句。