【问题标题】:How to write values from objects in a php array to mysql through pdo, with a loop如何通过pdo将php数组中对象的值写入mysql,带有循环
【发布时间】:2017-03-22 20:30:38
【问题描述】:

有一个 php 对象数组,每个对象都有一些来自同一组键的值。有一个 mysql 数据库,其中字段与每个对象中的键集匹配。想要使用 pdo 和循环将数组中每个对象的值写入 mysql。任何建议都会很棒!

PHP:(启动一些变量),3 个数组,其中数据转换为对象,放入代表会话变量的“$_STORAGE”数组中:

<?php
$Q = $A1 = $A2 = $A3 = $A4 = $A5 = $A6 = "";

$array1 = array(
    "Q" => "q1",
    "A1" => "a",
    "A3" => "c",
    "A6" => "f"
);

$array2 = array(
    "Q"  => "q2",
    "A4" => "j",
    "A5" => "k",
);

$array3 = array(
    "Q" => "q3",
    "A1" => "m",
    "A2" => "n",
    "A3" => "o",
    "A4" => "p",
    "A5" => "q",
    "A6" => "r"
);

$_POST1 = (object) $array1;
$_POST2 = (object) $array2;
$_POST3 = (object) $array3;

$_STORAGE = [];
$_STORAGE['answers'][0] = $_POST1;
$_STORAGE['answers'][1] = $_POST2;
$_STORAGE['answers'][2] = $_POST3;

?>

这是写入数据库(data_base)的MySql表(data_table)。字段与对象键相同:

CREATE TABLE data_base.data_table
(ID INT NOT NULL AUTO_INCREMENT, Q VARCHAR(20), A1 VARCHAR(20),  A2
VARCHAR(20), A3 VARCHAR(20),  A4 VARCHAR(20),  A5 VARCHAR(20),  
A6 VARCHAR(20), Date TIMESTAMP , PRIMARY KEY (ID)); 

这是将一个对象写入数据库的 pdo 代码(没有异常处理):

<?php
//connect to database
include "connection_info_data_base.php";
// sql query insert into data_table
$sql = "INSERT INTO `data_table` (`Q`,`A1`,`A2`,`A3`,`A4`,`A5`,`A6`,) VALUES(:Q,
:A1, :A2, :A3, :A4, :A5, :A6)";
$stmt =  $db->prepare($sql);
$stmt->bindParam(':Q', $Q);
$stmt->bindParam(':A1', $A1);
$stmt->bindParam(':A2', $A2);
$stmt->bindParam(':A3', $A3);
$stmt->bindParam(':A4', $A4);
$stmt->bindParam(':A5', $A5);
$stmt->bindParam(':A6', $A6);

//insert $sql query to server
$stmt->execute();
?>

如何编写一个循环,将 $_STORAGE["answers"][0] 中的值分配给变量 $Q、$A1、$A2、$A3、$A4、$A5、$A6,并使用 ""如果对象中没有该键的值,则作为值,然后运行 ​​pdo 代码,将值插入数据库的第 1 行,再次开始循环,从 $_STORAGE["answers"][1] 重写变量值,覆盖所有值并再次运行 pdo 代码以编写 数据库中的第 2 行,然后是第 3 行?

【问题讨论】:

    标签: php mysql arrays database pdo


    【解决方案1】:

    我想这就是你要找的东西:

    $sql = "INSERT INTO 'data_table' ('Q','A1','A2','A3','A4','A5','A6',) VALUES(:Q, :A1, :A2, :A3, :A4, :A5, :A6)";
    foreach ($_STORAGE['answers'] as $answer) {
        $stmt =  $db->prepare($sql);
        $stmt->bindParam(':Q', valueOrEmpty($answer, 'Q'));
        $stmt->bindParam(':A1', valueOrEmpty($answer, 'A1'));
        $stmt->bindParam(':A2', valueOrEmpty($answer, 'A2'));
        $stmt->bindParam(':A3', valueOrEmpty($answer, 'A3'));
        $stmt->bindParam(':A4', valueOrEmpty($answer, 'A4'));
        $stmt->bindParam(':A5', valueOrEmpty($answer, 'A5'));
        $stmt->bindParam(':A6', valueOrEmpty($answer, 'A6'));
        $stmt->execute();
    }
    
    function valueOrEmpty($object, $key) {
        return isset($object->{$key}) ? $object->{$key} : "";
    }
    

    【讨论】:

      【解决方案2】:

      你应该声明一个只有空值的基本数组:

      $base_array = array(
         "Q" => "",
        "A1" => "",
        "A2" => "",
        "A3" => "",
        "A4" => "",
        "A5" => "",
        "A6" => ""
      );
      

      然后使用array_merge 用每个数组中的可用键覆盖这些值:

      $array1 = array(
        "Q" => "q1",
        "A1" => "a",
        "A3" => "c",
        "A6" => "f"
      );
      
      $array2 = array(
        "Q"  => "q2",
        "A4" => "j",
        "A5" => "k",
      );
      
      $array3 = array(
         "Q" => "q3",
        "A1" => "m",
        "A2" => "n",
        "A3" => "o",
        "A4" => "p",
        "A5" => "q",
        "A6" => "r"
      );
      
      $mydata=[];
      $mydata[] = array_merge($base_array,$array1);
      $mydata[] = array_merge($base_array,$array2);
      $mydata[] = array_merge($base_array,$array3); 
      

      然后创建一个准备好的语句:

      $sql = "INSERT INTO `data_table` (`Q`,`A1`,`A2`,`A3`,`A4`,`A5`,`A6`,) 
              VALUES(:Q, :A1, :A2, :A3, :A4, :A5, :A6)";
      $stmt =  $db->prepare($sql);
      

      然后遍历$mydata并在每个循环上执行插入

      foreach($mydata as $data_array) {
      
          $stmt->bindParam(':Q', $data_array['Q']);
          $stmt->bindParam(':A1', $data_array['A1']);
          $stmt->bindParam(':A2', $data_array['A2']);
          $stmt->bindParam(':A3', $data_array['A3']);
          $stmt->bindParam(':A4', $data_array['A4']);
          $stmt->bindParam(':A5', $data_array['A5']);
          $stmt->bindParam(':A6', $data_array['A6']);
      
          //insert $sql query to server
          $stmt->execute();
      
      }
      

      我可以看到您有一些我没有复制的步骤,例如将数组转换为对象,然后使用 $_STORAGE 变量,无论如何。我没有考虑这个答案的那部分,它似乎与问题的范围无关。

      【讨论】:

      • 这里唯一的问题是他明确要求迭代一个对象数组而不是数组
      • 是的,你是对的。它只是在那里偷工减料,因为将数组转换为对象似乎没有结果。
      • 只是尝试穆里洛的回答。演员表没有结果,但代表了实际更复杂的代码。表单问题得到回答,而不是直接写入数据库,而是在会话变量中传递。当它们都被回答时,它们会从会话变量、对象数组中挑选出来,并写入数据库。
      【解决方案3】:

      按照您的方式准备声明。

      $sql = "INSERT INTO `data_table` (`Q`,`A1`,`A2`,`A3`,`A4`,`A5`,`A6`,) 
                                VALUES (:Q, :A1, :A2, :A3, :A4, :A5, :A6)";
      $stmt =  $db->prepare($sql);
      

      定义完整的键集:

      $complete_keys = ['Q','A1','A2','A3','A4','A5','A6'];
      

      迭代$_STORAGE。对于那里的每个项目,使用完整的键和来自 $_STORAGE 项目的值创建一个插入数组,并使用该数组执行准备好的语句:

      foreach ($_STORAGE['answers'] as $answer) {
          $values = [];
          foreach ($complete_keys as $key) {
              $values[":$key"] = isset($answer->$key) ? $answer->$key : null;
          }
          $stmt->execute($values);
      }
      

      【讨论】:

      • 谢谢,太好了。
      【解决方案4】:

      您可以只使用一个查询来完成,但您必须使用位置参数而不是命名参数。如果要使用命名参数,则需要在每次迭代结束时执行每个查询,因为查询中不能有两个同名的参数。

      $query = "INSERT INTO `data_table` (`Q`,`A1`,`A2`,`A3`,`A4`,`A5`,`A6`) VALUES ";
      
      $parameter_values = [];
      $parameters = [];
      
      foreach($_STORAGE['answers'] as $answer) {
      
        $parameter_values = array_merge($parameters, [
          $answer->Q, 
          $answer->A1, 
          $answer->A2, 
          $answer->A3, 
          $answer->A4, 
          $answer->A5, 
          $answer->A6, 
        ]);
      
        $parameters[] = "(?,?,?,?,?,?,?)";
      
      }
      
      $query.= implode(',', $parameters) . ';';
      
      $stmt =  $db->prepare($query);
      $stmt->execute($parameter_values);
      

      您的 SQL 查询应该类似于...

      INSERT INTO `data_table` (`Q`,`A1`,`A2`,`A3`,`A4`,`A5`,`A6`) VALUES
        (?,?,?,?,?,?,?),(?,?,?,?,?,?,?),(?,?,?,?,?,?,?);
      

      【讨论】:

      • 谢谢,太好了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 2016-02-02
      • 2020-03-24
      相关资源
      最近更新 更多