PDO::pgsqlCopyFromArray

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

PDO::pgsqlCopyFromArrayCopie des données d'un tableau PHP dans une table

Description

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

Copie des données du tableau row dans la table table_name en utilisant delimiter comme délimiteur de champs et la liste fields

Liste de paramètres

table_name

chaîne de caractères contenant le nom de la table.

rows

Un tableau de chaîne de caractères avec les champs séparé par delimiter.

delimiter

Délimiteur utilisé dans le tableau rows.

null_as

Comment interpréter les valeurs nulles.

fields

Liste de champs à insérer.

Valeurs de retour

Retourne true en cas de succès, ou false si une erreur survient.

add a note add a note

User Contributed Notes 1 note

up
3
Anonymous
8 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