如何在PHP MVC facade模式中准备查询?

如何在PHP MVC facade模式中准备查询?,php,model-view-controller,database-connection,prepared-statement,facade,Php,Model View Controller,Database Connection,Prepared Statement,Facade,如何使用为每个SQL查询准备的语句防止应用程序进行SQL注入 我有一些管理器类,它们处理查询并从为数据库连接和查询运行而设计的特定类调用静态方法。这个函数为每个查询创建一个连接,并有一些通用的公共静态方法getAll、getOne、exec来处理各种查询 在哪里可以执行db->prepare、BindParam和execute语句?管理器类端,没有初始化连接,所以db->prepare是不可能的。 在数据库类方面,该方法是泛型的,因此参数是可变的,这取决于调用静态方法的方法 为了更清楚地了解我在

如何使用为每个SQL查询准备的语句防止应用程序进行SQL注入

我有一些管理器类,它们处理查询并从为数据库连接和查询运行而设计的特定类调用静态方法。这个函数为每个查询创建一个连接,并有一些通用的公共静态方法getAll、getOne、exec来处理各种查询

在哪里可以执行db->prepare、BindParam和execute语句?管理器类端,没有初始化连接,所以db->prepare是不可能的。 在数据库类方面,该方法是泛型的,因此参数是可变的,这取决于调用静态方法的方法

为了更清楚地了解我在这里要解释的内容,您可以在这里查看我的代码:

您可以检查我在CarManager.class.php中编写SQL查询的方式以及在DBOperation.class.php中处理它们的方式


我希望这个问题能澄清我在OOP PHP编程中的重要概念。

您可以在一个参数中传递查询,然后在第二个参数中传递值。例如,在DBOperation类中,将函数getAll$squry更改为函数$squry$sQData{}

其中,$sQData是一个数组,包含要绑定到查询中的所有值。然后只需绑定查询和参数并执行函数

因此,您可以定义$sQData,如下所示:

然后遍历数组,如:

foreach($sQData as $key=>$value){}

好的,我最终通过混合不同的答案解决了这个问题

查询及其传递给负责执行的类的方式如下所示。像我这样的初学者,不要在值和参数之间加引号:

$sQuery = 'INSERT INTO Clients (first_name, last_name, email, login, passwd) ';
$sQuery .= "VALUES (:firstName,:lastName,:email,:login,:saltedPasswd)";
$aQueryParams = array(':firstName' => $sFirstName,':lastName' => $sLastName,':email' => $sEmail,':login' => $sLogin,':saltedPasswd'=>$sPasswordSalted);
$bSuccess = DBOperation::exec($sQuery,$aQueryParams);
现在是DBOperation类中exec方法的内容

我不使用foreach循环,因为我读到我可以在execute中直接使用参数数组,如果我要处理,我应该使用bindParam的引用,如下所示:

foreach($aQueryParams as $key=>&$value){
   $stmt->bindParam($key, $value);
}

好了,这就快开始工作了,但有一件事我不明白。当我循环查询参数数组时,我写入$stmt->bindParam$key,$value,但存储在数据库表中的是键。例如,我在我的表中得到:login,而不是得到我真正的登录名。
public static function exec($sQuery,$aQueryParams){
        self::init();
        try {
            $stmt = self::$oDataBase->prepare($sQuery);
            $iAffectedRows = $stmt->execute($aQueryParams) or die(print_r(self::$oDataBase->errorInfo()));
        } catch (PDOException $oPdoException) {
            echo 'PDO Exception : ' . $oPdoException->getMessage();
        }
        return false !== $iAffectedRows;
    }
foreach($aQueryParams as $key=>&$value){
   $stmt->bindParam($key, $value);
}