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

San*_*505 4 php mysql arrays bulkinsert

我有一个PHP功能getContactList():

$res = getContactList(trim($_POST['username']), trim($_POST['password']));
Run Code Online (Sandbox Code Playgroud)

返回此数组:

$contactList[] = array('name' => $name, 'email' =>$email);
Run Code Online (Sandbox Code Playgroud)

我需要将此数组的内容存储到MySQL数据库中.不知怎的,我可以一次性将数组的全部内容存储在数据库中?每次运行时数组项的数量都将超过500,所以我想避免通常的循环练习并在for循环中调用"Insert"语句,因为这需要很长时间才能执行.

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

Sal*_*n A 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)
);
Run Code Online (Sandbox Code Playgroud)


mid*_*dus 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();
}
Run Code Online (Sandbox Code Playgroud)

PDO还会处理正确的字符串转义.

  • 是的,他可能想避免它,因为他害怕发送500个不同查询的性能影响.使用预处理语句,这不是问题,因为查询只编译一次(参见php手册的链接).在我看来,这尖叫"准备好的陈述的用例"! (2认同)