Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在数据库中存储数组内容_Php_Mysql_Arrays_Bulkinsert - Fatal编程技术网

Php 在数据库中存储数组内容

Php 在数据库中存储数组内容,php,mysql,arrays,bulkinsert,Php,Mysql,Arrays,Bulkinsert,我有一个php函数getContactList(): 将返回此数组: $contactList[] = array('name' => $name, 'email' =>$email); 我需要将这个数组的内容存储到MySQL数据库中。 不知何故,我可以一次性将数组的全部内容存储在数据库中吗?? 每次执行时,数组项的数量将超过500个,因此我希望避免通常的循环实践,并在for循环中调用“Insert”语句,因为这将需要很长时间才能执行 注意:我需要将结果存储在单独的列中-一列用于名

我有一个php函数
getContactList()

将返回此数组:

$contactList[] = array('name' => $name, 'email' =>$email);
我需要将这个数组的内容存储到MySQL数据库中。 不知何故,我可以一次性将数组的全部内容存储在数据库中吗?? 每次执行时,数组项的数量将超过500个,因此我希望避免通常的循环实践,并在for循环中调用“Insert”语句,因为这将需要很长时间才能执行


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

在循环中,您可以创建一个insert语句,并在循环后执行它。insert语句将包含所有内容。 这份声明看起来像

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

使用标准php序列化函数

$serData_str = serialize($contactList);
然后将其保存在数据库中

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

$myData_arr = unserialize($serContactList);

如果尝试插入多行,即多次运行同一查询,请使用。 使用,您可以执行以下操作:

// 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还将负责正确的字符串转义。

可能更好地对数据进行json_编码,因为其他语言可以解释数据。使用serialize意味着您必须使用PHP,从长远来看,这可能不是很有用。请看这里,但我不认为OP在其问题的任何地方指出,他希望将整个联系人列表存储在一列中。事实上,我明白您的观点Salman A,但问题是可以解释的。他说,
每次执行时,数组项的数量将超过500个
我怀疑他在表中的列数是否会超过500个,因此可以安全地假设他希望将其存储在一列中。然而,我们需要更多的信息从OP.:-)我需要将结果存储在单独的列中-一个用于名称,另一个用于电子邮件。我所说的500是指数组将有500个计数项,我需要插入500行-用于在每行中插入'Name'和'Email'。参考字符串转义:not“can”,“should”@米德斯:是的,我很懒:)@Johan:我已经建议在我的评论中使用
mysql\u real\u escape\u string
。代码不会在评论中运行,而是在主体中运行。把代码放在它实际工作的地方,不要把不安全和非功能的代码放在正文中,把真正的解决方案放在注释中。这毫无意义。当您使用PDO准备好的语句时,还有一件事您不必担心;-)。您每次对每一行执行一次查询,而Salman只对所有行执行一次,这就是问题所在。我根据需要多次执行相同的查询。但是,语句是准备好的,并使用占位符代替每次执行。关于准备好的语句的更多信息,请参见我答案中的php手册链接。但是OP询问“因此我想避免通常的循环实践并在for循环中调用“Insert”语句”是的,他可能想避免它,因为他担心发送500个不同查询会影响性能。使用准备好的语句,这不是问题,因为查询只编译一次(请参阅php手册的链接)。在我看来,这是“准备好的语句的用例”!
$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)
);
// 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();
}