PHP Conference Japan 2024

PDO::pgsqlCopyFromArray

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

PDO::pgsqlCopyFromArray Pdo\Pgsql::copyFromArray() 的別名

說明

public PDO::pgsqlCopyFromArray(
    字串 $tableName,
    陣列 $rows,
    字串 $separator = "\t",
    字串 $nullAs = "\\\\N",
    ?字串 $fields = null
): 布林值

這個方法是以下方法的別名:Pdo\Pgsql::copyFromArray()

新增註釋

使用者貢獻的註釋 1 則註釋

匿名
9 年前
如果您的 `$nullAs` 是 `'\\N'`,那麼您應該在串接 `$rows` 的儲存格時照樣使用 `$nullAs`,但傳送到 `pgsqlCopyFromArray()` 時則需使用跳脫後的版本。此外,第五個參數 `$fields` 應該是 PostgreSQL 的 `COPY` 陳述式中 `column_names` 預留位置的有效 SQL 字串。

我提供了我的 `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