将数组内容存储到数据库中

4

我有一个 PHP 函数 getContactList()

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

它将返回这个数组:

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

我需要将这个数组的内容存储到MySQL数据库中。有没有办法一次性将整个数组的内容存储到数据库中?每次数组项的数量都将超过500个,因此我想避免通常的循环实践,并在for循环中调用“Insert”语句,因为这会花费很长时间来执行。
注意:我需要将结果存储在单独的列中-一个用于名称,另一个用于电子邮件。对于那个包含500个项目的数组,我需要插入500行-每行一个名称-电子邮件对。
4个回答

6
$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)
);

1
关于字符串转义:不是“可能”,而是“应该”! - middus
@middus:是的,我有点懒惰 :) - Salman A
@Johan:我已经在我的评论中建议使用mysql_real_escape_string了。 - Salman A
1
代码不会在注释中运行,它只会在主体中运行。将代码放在实际可用的位置,不要将不安全和无效的代码放在主体中,而将真正的解决方案放在注释中。这毫无意义。 - Johan
1
当您使用PDO准备语句时,您不必担心的另一件事情;-)。 - middus
显示剩余2条评论

5

如果您尝试插入许多行,即运行相同的查询多次,请使用预处理语句。使用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只为所有行执行一次。 - Irishka
1
这就是关键所在。我会根据需要执行相同的查询。但是,该语句已经准备好并使用占位符,每次执行时都会替换它们。请参阅我的答案中的PHP手册链接以了解有关准备语句的更多信息。 - middus
1
但是 OP 问道,“我想避免通常的循环实践,而是在 for 循环中调用“Insert”语句”。 - Irishka
2
是的,他可能想避免这种情况,因为他担心发送500个不同的查询会影响性能。使用预处理语句,这不是问题,因为查询只编译一次(请参见php手册链接)。在我看来,这非常适合使用预处理语句! - middus

2
使用标准的PHP序列化函数。
$serData_str = serialize($contactList);

然后将其保存在数据库中

从数据库中读取数据后,只需反序列化即可

$myData_arr = unserialize($serContactList);

1
最好将数据转换为json_encode格式,因为其他语言可以解释它。使用serialize意味着你只能在PHP中使用,在长期运行中可能没有太大用处。 - Flukey
首选的存储 PHP 数组的方法是使用 JSON 编码而不是序列化。 - Irishka
1
正确,但我不认为OP在他的问题中声明他想将整个联系人列表存储在一个列中。 - Salman A
确实,我理解你的观点Salman A,但问题存在不同的解释。他说“每次操作数组项的数量将超过500个”,我怀疑他在表格中不会有超过500列,因此可以安全地假设他想要将其存储在一列中。然而,我们需要更多来自OP的信息。 :-) - Flukey
1
我需要将结果存储在不同的列中——一个用于姓名(Name),另一个用于电子邮件(Email)。我所说的500是指数组将有500个项目,我需要插入500行数据——在每一行中插入“姓名”和“电子邮件”。 - Sandy505

0

In the loop you can create an insert statement and execute it after the loop. the insert statement will include all content.

The statement would look like

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接