PDO::pgsqlCopyFromArray()
(PHP 5 >= 5.3.3, PHP 7)
Copy data from PHP array into table
说明
public PDO::pgsqlCopyFromArray(string $table_name,array $rows[,string $delimiter= 't'[,string $null_as= "N"[,string $fields]]]): bool
Copies data from$rowsarray to table$table_nameusing$delimiteras fields delimiter and$fieldslist
参数
- $table_name
String containing table name
- $rows
Array of strings with fields separated by$delimiter
- $delimiter
Delimiter used in$rowsarray
- $null_as
How to interpret null values
- $fields
List of fields to insert
返回值
Returns TRUE
on success,或者在失败时返回FALSE
.
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)); } ?>