Php 如何使用arg中未知数量的参数创建用于插入/更新/删除的PDO类方法

Php 如何使用arg中未知数量的参数创建用于插入/更新/删除的PDO类方法,php,pdo,Php,Pdo,目前,我正在尝试创建一个PDO类,在该类中我将有一个方法来运行诸如INSERT、UPDATE或DELETE之类的查询 例如,这是我的选择方法 public function getPreparedQuery($sql){ $stmt = $this->dbc->prepare($sql); $stmt->execute([5]); $arr = $stmt->fetchAll(PDO::FETCH_ASSOC); if(!$arr) ex

目前,我正在尝试创建一个PDO类,在该类中我将有一个方法来运行诸如INSERT、UPDATE或DELETE之类的查询

例如,这是我的选择方法

 public function getPreparedQuery($sql){
    $stmt = $this->dbc->prepare($sql);
    $stmt->execute([5]);
    $arr = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if(!$arr) exit('No rows');
    $stmt = null;
    return $arr;
}
我只是这样称呼它:

    $stmt = $database->getPreparedQuery($sql2);
var_export($stmt);
$database->runQuery($query);
到目前为止,我知道runQuery的工作原理与此类似:

插入不使用方法的示例:

$idRol = "6";
$nomRol = "test6";                          
$stmt = $database->dbc->prepare("insert into roles (idRol, NomRol) values (?, ?)");
$stmt->execute(array($idRol,$nomRol));
$stmt = null;
但是我想把它变成一个通用的方法,在这里我可以简单地传递sql语句,类似这样:

    $stmt = $database->getPreparedQuery($sql2);
var_export($stmt);
$database->runQuery($query);
但查询可能恰好是

$query=插入角色idRol,NomRol值为'4','test'

$query=将movName、movLength、movArg值“name1”、“15”、“movie about…”插入到电影中

那么,如何对arg$查询进行切片,以便获得用于生成通用runQuery的所有变量呢

因为我可以想象我的方法应该是这样的

runQuery([$var1 , $var2, $var3....(there can be more)] , [$var1value, $var2value, $var3value...(there can be more)]){

        $stmt = $database->dbc->prepare("insert into movies($var1 , $var2, $var3....(there can be more)) values (?, ? , ? (those are the values and there ca be more than 3)"); //how do i get those "?" value and amount of them, and the name of the table fields [movName, movLength, movArg can be variable depending of the sentence]?
        $stmt->execute(array($var1,$var2, $var3, ...)); //this is wrong , i dont know how to execute it
        $stmt = null;
}

您需要向函数中添加第二个参数。这只是一个数组,所有这些变量都将放在其中。根据定义,数组可以有任意数量的元素,这正好解决了您的问题:

public function runQuery($sql, $parameters = []) {
    $stmt = $this->dbc->prepare($sql);
    $stmt->execute($parameters);
    return $stmt;
}
这个简单的函数将运行任何查询。您可以在我的文章中看到关于以下内容的使用示例:


正如您所看到的,现在您的函数可以用于具有任意数量参数的任何查询

您需要向函数添加第二个参数。这只是一个数组,所有这些变量都将放在其中。根据定义,数组可以有任意数量的元素,这正好解决了您的问题:

public function runQuery($sql, $parameters = []) {
    $stmt = $this->dbc->prepare($sql);
    $stmt->execute($parameters);
    return $stmt;
}
这个简单的函数将运行任何查询。您可以在我的文章中看到关于以下内容的使用示例:


正如您所看到的,现在您的函数可以用于具有任意数量参数的任何查询

您想得太多了$数据库->运行查询$query,$parameters;将解决您的问题您仍然可以对其他查询使用getPreparedQuery,但将用于执行的数组添加为参数。您的runQuery示例易受SQL注入的攻击—您想得太多了$数据库->运行查询$query,$parameters;将解决您的问题您仍然可以对其他查询使用getPreparedQuery,但添加用于执行的数组作为参数。您的runQuery示例易受SQL注入攻击。我正在尝试使用我的示例基于电子邮件获取用户,因此我键入$idRol=['1']$stmt=$database->runQuerySELECT*从idRol=?,[$idRol]->fetch;var_export$stmt您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解第1行“?”附近使用的正确语法。我也不明白OR在那句话中是怎么用的,我不是必须声明idRol两次吗?看起来你是在使用query,而不是prepare在你的函数中。因此出现了错误。是的,你需要两次指定idRol。我试图通过我的示例基于电子邮件获取用户,所以我键入$idRol=['1']$stmt=$database->runQuerySELECT*从idRol=?,[$idRol]->fetch;var_export$stmt您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册,以了解第1行“?”附近使用的正确语法。我也不明白OR在那句话中是怎么用的,我不是必须声明idRol两次吗?看起来你是在使用query,而不是prepare在你的函数中。因此出现了错误。是的,你需要指定两次idRol。