Php 我可以用array和foreach循环执行PDO prepare语句吗

Php 我可以用array和foreach循环执行PDO prepare语句吗,php,mysql,security,pdo,prepared-statement,Php,Mysql,Security,Pdo,Prepared Statement,所以我开始阅读PDO和PDO语句来更新我的代码并给它更多的安全性,但我真的不知道这是否可行,或者是否有可能进行注入。在创建数组之前,我还清理了数据。我使用这个函数来添加给定名称的数据表和一个列名称和值如下的数组 $tabla = 'tabla' $datos = array( 'id' => 'NULL', 'id_usuario' => "'{$usuario['id']}'", 'id_tipo' => "'{$tipo}'"

所以我开始阅读PDO和PDO语句来更新我的代码并给它更多的安全性,但我真的不知道这是否可行,或者是否有可能进行注入。在创建数组之前,我还清理了数据。我使用这个函数来添加给定名称的数据表和一个列名称和值如下的数组

$tabla = 'tabla'
$datos = array(
        'id' => 'NULL',
        'id_usuario' => "'{$usuario['id']}'",
        'id_tipo' => "'{$tipo}'",
        'id_estado' => "'{$estado}'",
        'id_visibilidad' => "'{$visibilidad}'",
        'titulo' => "'{$titulo}'",
        'contenido' => "'{$contenido}'",
        'fecha' => 'CURRENT_TIMESTAMP'
      );

function pdo_agregar($tabla, $datos) {
  global $pdo;
  $columnas = implode(', ', array_keys($datos));
  $valores = implode(', ', array_values($datos));
  $sentencia = $pdo->prepare("INSERT INTO $tabla ($columnas) VALUES ($valores)");
  foreach($datos as $indice => $valor) {
    $sentencia->bindParam(':'.$indice, $valor);
  }
  if($sentencia->execute()) {
    return true;
  } else {
    return false;
  }
  $sentencia->close();
  $pdo->close();
}
这样行吗?o我必须做出如下陈述吗

$sentencia=$pdo->prepare(“插入$tabla(列、列2、列3)) 值(:col,:col2,:col3”)

然后分别绑定参数


提前感谢!

您不需要这些绑定东西,您可以直接向PDO的execute函数抛出一个数组(它为您执行此绑定)

我的数组如下所示
[“data”=>“mydata”,“data2”=“mysecond”]
因此我将生成如下查询:

INSERT INTO `Tab`(`data`, `data2`) VALUES (:data, :data2)
代码是:

        foreach($data as $key=>$val){
            $keys[] = $key;
            $vals[] = ":".$key;
        }
        $keys = "`".implode("`,`", $keys)."`";
        $vals = implode(",", $vals);
        $sql = "INSERT INTO `".$tab."`(".$keys.") VALUES (".$vals.")";
        $prep_insert = $this->pdo->prepare($sql);
        $prep_insert->execute($data);

顺便说一句,你应该使用类和这个,而不是这个全局性的东西。

谢谢!还有,为什么用类来代替这个更好呢?阅读更好,你仍然在类中使用函数,但它更有组织性,你在创建类时做一次pdo连接,你可以从我的pdo类的每个函数中使用它,也许你明白我的意思了,非常感谢@StefanBD!我很欣赏itnp,顺便说一句,你应该在``中加上$tabla,我们的上一个编码器遇到了很多麻烦,他们没有这样做,例如,我们想添加字段alter(德语表示年龄),但这是mysql的一个保留字,所以我们非常困惑为什么数据没有保存请使用正确的英语,请参见