【问题标题】:Store array contents in database将数组内容存储在数据库中
【发布时间】:2011-12-12 11:08:42
【问题描述】:

我有一个php函数getContactList()

$res = getContactList(trim($_POST['username']), trim($_POST['password']));

返回这个数组:

$contactList[] = array('name' => $name, 'email' =>$email);

我需要将此数组的内容存储到 MySQL 数据库中。 不知何故,我可以一次将数组的全部内容存储在数据库中吗? 数组项的数量每次都会超过 500 个,所以我想避免通常的循环做法并在 for 循环中调用“插入”语句,因为这需要很长时间才能执行。

注意:我需要将结果存储在单独的列中 - 一个用于名称,另一个用于电子邮件。该数组中有 500 个项目,我需要插入 500 行 - 每行一对名称-电子邮件。

【问题讨论】:

    标签: php mysql arrays bulkinsert


    【解决方案1】:

    在循环中你可以创建一个插入语句并在循环之后执行它。 insert 语句将包含所有内容。

    该语句看起来像

    INSERT INTO employee (name) VALUES ('Arrayelement[1]'),('Arrayelement[2]'), ('Arrayelement[3]'),('Arrayelement[4]');
    

    【讨论】:

      【解决方案2】:

      使用标准的php序列化函数

      $serData_str = serialize($contactList);
      

      然后将其保存在数据库中

      从数据库中读取数据后,只需将其反序列化

      $myData_arr = unserialize($serContactList);
      

      【讨论】:

      • 对数据进行 json_encode 可能更好,因为其他语言可以解释它。使用序列化意味着你被 PHP 困住了,从长远来看这可能不是很有用。
      • 对,但我认为 OP 在他的问题中没有提到他想将整个联系人列表存储在 一列 中。
      • 确实,我明白你的观点 Salman A 但是这个问题可以解释。他说he number of array items will be more than 500 at each go 我怀疑他的表中是否会有超过 500 列,因此可以肯定地假设他想将其存储在一列中。但是,我们需要来自 OP 的更多信息。 :-)
      • 我需要将结果存储在单独的列中 - 一个用于名称,另一个用于电子邮件。我所说的 500 的意思是该数组将包含 500 个项目,我需要插入 500 行 - 用于在每一行中插入“姓名”和“电子邮件”
      【解决方案3】:
      $values = array();
      // the above array stores strings such as:
      // ('username', 'user@domain.com')
      // ('o\'brien', 'baaz@domain.com')
      // etc
      foreach($contactList as $i => $contact) {
          $values[] = sprintf(
              "('%s', '%s')",
              mysql_real_escape_string($contact['name'], $an_open_mysql_connection_identifier),
              mysql_real_escape_string($contact['email'], $an_open_mysql_connection_identifier)
          );
      }
      $query = sprintf(
          "INSERT INTO that_table(name, email) VALUES %s",
          implode(",", $values)
      );
      

      【讨论】:

      • 关于字符串转义:不是“可以”,“应该”!
      • @middus: 是的,我很懒 :)
      • @Johan:我已经建议在我的评论中使用mysql_real_escape_string
      • 代码不在 cmets 中运行,它在正文中运行。将代码放在实际可以工作的地方,不要将不安全和无功能的代码放在正文中,将真正的解决方案放在注释中。这没有任何意义。
      • 当您使用 PDO 的准备好的语句时,您不必担心的另一件事 ;-)。
      【解决方案4】:

      如果您尝试插入许多行,即多次运行相同的查询,请使用prepared statement。 使用PDO,您可以这样做:

      // prepare statement
      $stmt = $dbh->prepare("INSERT INTO contacts (email, name) VALUES (:email, :name);");
      // execute it a few times
      foreach($contactList as $contact) {
          $stmt->bindValue(':email', $contact['email'], PDO::PARAM_STR);
          $stmt->bindValue(':name', $contact['name'], PDO::PARAM_STR);
          $stmt->execute();
      }
      

      PDO 还将负责正确的字符串转义。

      【讨论】:

      • 您每次对每一行执行一次查询,而 Salman 只对所有行执行一次
      • 这就是重点。我根据需要多次执行相同的查询。但是,该语句已准备好并使用替换每个执行的占位符。有关准备好的语句的更多信息,请参阅我的答案中指向 php 手册的链接。
      • 但 OP 询问“所以我想避免通常的循环实践并在 for 循环中调用“插入”语句”
      • 是的,他可能想避免它,因为他害怕发送 500 个不同的查询会影响性能。使用准备好的语句,这不是问题,因为查询只编译一次(参见 php 手册的链接)。在我看来,这尖叫着“准备好的陈述的用例”!
      猜你喜欢
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 2018-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      相关资源
      最近更新 更多