PDO::pgsqlCopyFromArray

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

PDO::pgsqlCopyFromArrayCopia dados de array PHP para tabela

Descrição

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

Copia dados do array rows para a tabela table_name usando delimiter como delimitador de campos e a lista de campos fields.

Parâmetros

table_name

String contendo o nome da tabela

rows

Array de strings com campos separados por delimiter

delimiter

Delimitador usado no array rows

null_as

Define como os valores nulos devem ser interpretados

fields

Lista de campos a serem inseridos

Valor Retornado

Retorna true em caso de sucesso, ou false em caso de falha.

adicione uma nota

Notas Enviadas por Usuários (em inglês) 1 note

up
2
Anonymous
9 years ago
If your $nullAs is '\\N', then you should use $nullAs as is in concatenation of cells of $rows, but send to pgsqlCopyFromArray() escaped version. Also fifth arg $fields should be a SQL-valid string for the column_names placeholder in COPY statement of PostgreSQL.

I provide my smart wrapper for pgsqlCopyFromArray() which do this automatically.

<?php
/**
*
* @param PDO $db
* @param string $tableName
* @param string[] $fields List of fields names.
* @param array[] $records Two-demension array of cells (array of rows).
* @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);
// Convert multiline text to one line.
$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