【问题标题】:PHP PDO: How to insert multiple rows?PHP PDO:如何插入多行?
【发布时间】:2012-09-01 22:56:29
【问题描述】:

我有很多 sql 语句,但我想要,但我想知道是否有任何方法或函数可以缩短并使用 PHP PDO 在尽可能少的行中完成。

我的一个想法是创建一个具有以下名称的数组:Perfiles、Usuarios、Customer、Mps、Poliza 和 Servicios 一起像 foreach 但我没有具体的想法,你能帮我吗?

SQL 语句

$sqlpermsPer = "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar)
                                            VALUES ($idPerfil,'Perfiles',0,0,0,0)";
$resultpermsPer = $this->dbConnect->query($sqlpermsPer) or die ($sqlpermsPer);

sqlpermsC = "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar)
                                            VALUES ($idPerfil,'Clientes',0,0,0,0)";
$resultpermsC = $this->dbConnect->query($sqlpermsC) or die ($sqlpermsC);

$sqlpermsU = "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar)
                                            VALUES ($idPerfil,'Usuarios',0,0,0,0)";
$resultpermsU = $this->dbConnect->query($sqlpermsU) or die ($sqlpermsU);

$sqlpermsM = "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar)
                                            VALUES ($idPerfil,'Mps',0,0,0,0)";
$resultpermsM = $this->dbConnect->query($sqlpermsM) or die ($sqlpermsM);

$sqlpermsP = "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar)
                                            VALUES ($idPerfil,'Poliza',0,0,0,0)";
$resultpermsP = $this->dbConnect->query($sqlpermsP) or die ($sqlpermsP);

$sqlpermsS = "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar)
                                            VALUES ($idPerfil,'Servicio',0,0,0,0)";
$resultpermsS = $this->dbConnect->query($sqlpermsS) or die ($sqlpermsS);

提前致谢!

【问题讨论】:

  • 您使用 PDO 的方式是对 sql 注入开放。
  • 当然,在这个语句中,我没有更改 query() 而是 prepare() 和 bindParam,而是使用 prepare() 和 bindParam ... 这样我可以解决它吗?
  • 应该很容易创建一个以关联数组和表字符串为参数的函数,然后创建插入。应该更漂亮。
  • 投票以重复关闭。见thisthis

标签: php sql pdo


【解决方案1】:

这会创建一个包含您的字符串的数组,并循环遍历它们,每次都使用绑定的参数执行相同的查询。

$stmt = $this->dbConnect->prepare("INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar) VALUES (:idPerfil,:str,0,0,0,0)");
$stmt->bindParam(':idPerfil', $idPerfil);
$stmt->bindParam(':str',$val);
$in_arr = array("Perfiles","Clientes","Usuarios","Mps","Poliza","Servicio");

foreach ($in_arr as $key => $val) {
    $stmt->execute();
}  

【讨论】:

    【解决方案2】:
    INSERT INTO
      table 
        (column_one, column_two) 
      VALUES
        ('value_one_one', 'value_one_two'), 
        ('value_two_one', 'value_two_two'), 
        ('value_three_one', 'value_three_two'); 
    

    【讨论】:

      【解决方案3】:

      只要正确终止每个INSERT,就可以将它们连接起来。以下代码示例还利用prepare 来防止SQL 注入。

      $sql  = "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar) VALUES (:idPerfil,'Perfiles',0,0,0,0);";
      ssql .= "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar) VALUES (:idPerfil,'Clientes',0,0,0,0);";
      $sql .= "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar) VALUES (:idPerfil,'Usuarios',0,0,0,0);";
      $sql .= "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar) VALUES (:idPerfil,'Mps',0,0,0,0);";
      $sql .= "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar) VALUES (:idPerfil,'Poliza',0,0,0,0);";
      $sql .= "INSERT INTO t_perfiles_permisos (Id_Perfil, Area_Permiso, Buscar, Crear, Eliminar, Modificar) VALUES (:idPerfil,'Servicio',0,0,0,0);";
      
      try
      {
        if ( $stmt = $db->prepare( $sql ) )
        {
          if ( ! $stmt->execute( array( ':idPerfil' => $idPerfil ) )
            error_log( $stmt->errorInfo() );
        }
      }
      catch ( PDOException $e )
      {
        error_log( $e->getMessage() );
      }
      

      【讨论】:

      • PDO 不支持单个 execute() 调用中的多个语句。这将失败并出现 MySQL 语法错误。
      • 我一直这样做。这里唯一的区别是这是使用(column) VALUES 语法,我从来没有这样做过。不确定这会有所不同。
      • 快速搜索该主题; stackoverflow.com/questions/6346674/…
      【解决方案4】:

      请查看answer

      您可能希望像这样执行 multiple-insert 语句

      $qry = 'INSERT INTO table (FirstName, LastName) VALUES ';
      $qry .= "(?,?), "
            . "(?,?), "
            . "(?,?)  "
            ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-25
        • 2014-12-21
        • 1970-01-01
        • 1970-01-01
        • 2015-02-28
        • 2019-01-25
        • 2019-07-15
        • 1970-01-01
        相关资源
        最近更新 更多