PDO::pgsqlCopyFromArray

(PHP 5 >= 5.3.3, PHP 7, PHP 8)

PDO::pgsqlCopyFromArray将数据从 PHP 数组复制到表中

描述

public PDO::pgsqlCopyFromArray(
    string $table_name,
    array $rows,
    string $delimiter = "\t",
    string $null_as = "\\\\N",
    string $fields = ?
): bool

使用 delimiter 作为字段分隔符和 fields 列表,将数据从 rows 数组复制到表 table_name 中。

参数

table_name

包含表名的字符串

rows

字段以 delimiter 分隔的字符串数组

delimiter

rows 数组中使用的分隔符

null_as

如何解释空值

fields

要插入的字段列表

返回值

成功时返回 true,失败时返回 false

添加备注

用户贡献备注 1 个备注

2
匿名
8 年前
如果您的 $nullAs 是 '\\N',那么您应该在 $rows 的单元格连接中按原样使用 $nullAs,但发送到 pgsqlCopyFromArray() 时应使用转义版本。 此外,第五个参数 $fields 应该是一个有效的 SQL 字符串,用于 PostgreSQL 中 COPY 语句中的 column_names 占位符。

我提供了一个 pgsqlCopyFromArray() 的智能包装器,它可以自动执行此操作。

<?php
/**
*
* @param PDO $db
* @param string $tableName
* @param string[] $fields 字段名列表。
* @param array[] $records 单元格的二维数组(行数组)。
* @return boolean
*/
function pgInsertByCopy (PDO $db, $tableName, array $fields, array $records) {
static
$delimiter = "\t", $nullAs = '\\N';

$rows = [];

foreach (
$records as $record) {
$record = array_map(
function (
$field) use( $record, $delimiter, $nullAs) {
$value = array_key_exists($field, $record) ? $record[$field] : null;

if (
is_null($value)) {
$value = $nullAs;
} elseif (
is_bool($value)) {
$value = $value ? 't' : 'f';
}

$value = str_replace($delimiter, ' ', $value);
// 将多行文本转换为单行。
$value = addcslashes($value, "\0..\37");

return
$value;
},
$fields);
$rows[] = implode($delimiter, $record) . "\n";
}

return
$db->pgsqlCopyFromArray($tableName, $rows, $delimiter, addslashes($nullAs), implode(',', $fields));
}
?>
To Top