PHP 8.1.0 Beta 1 available for testing


(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_insertÜberträgt Werte aus einem Array in eine Tabelle


pg_insert ( resource $connection , string $table_name , array $assoc_array , int $options = PGSQL_DML_EXEC ) : mixed

pg_insert() fügt die Werte des assoc_array in die Tabelle table_name ein. Falls options angegeben wurde, wird pg_insert() auf assoc_array mit den angegebenen Optionnen angewendet.

Falls options angegeben wurde, wird pg_convert() mit den angegebenen Flags auf das Array assoc_array angewendet.

Standardmäßig übergibt pg_insert() Rohwerte. Die Werte müssen entweder maskiert werden oder es muss die Option PGSQL_DML_ESCAPE angegeben werden. PGSQL_DML_ESCAPE maskiert Parameter und Bezeichner und setzt sie in Anführungszeichen. Daher muss bei Tabellen- und Spaltennamen zwischen Groß- und Kleinschreibung unterschieden werden.

Es ist zu beachten, dass weder die Maskierung noch eine vorbereitete Abfrage LIKE-Abfragen, JSON, Array, Regex usw. schützen können. Diese Parameter sollten im Kontext behandelt werden, d. h. Werte maskieren und validieren.



Die PostgreSQL-Verbindungskennung.


Der Name der Tabelle, in die die Zeilen eingefügt werden sollen. table_name muss mindestens soviele Spalten haben, wie das assoc_array Elemente.


Ein array, dessen Indizes die Feldnamen der Tabelle table_name sind und dessen Werte die Werte sind, die in die entprechenden Spalten eingefügt werden sollen.


Jede Kombination aus PGSQL_CONV_OPTS, PGSQL_DML_NO_CONV, PGSQL_DML_ESCAPE, PGSQL_DML_EXEC, PGSQL_DML_ASYNC und PGSQL_DML_STRING. Falls PGSQL_DML_STRING bei den options angegeben wurde, wird der Abfrage-String zurückgegeben. Werden PGSQL_DML_NO_CONV oder PGSQL_DML_ESCAPE angegeben, wird pg_convert() intern nicht aufgerufen.


Gibt bei Erfolg die Verbindungskennung zurück. Im Fehlerfall wird false zurückgegeben. Falls die Konstante PGSQL_DML_STRING in den options übergeben wurde, wird ein String zurückgegeben.


Beispiel #1 pg_insert()-Beispiel

// Das ist einigermaßen sicher, da alle Werte maskiert werden.
  // Allerdings unterstützt PostgreSQL JSON/Array. Diese sind nicht
  // sicher, da sie Abfragen weder maskieren noch vorbereiten.
$res pg_insert($dbconn'post_log'$_POSTPG_DML_ESCAPE);
  if (
$res) {
"Der Inhalt von $_POST wurde protokolliert\n";
  } else {
"Vermutlich wurden falsche Eingabedaten gesendet\n";

Siehe auch

  • pg_convert() - Konvertiert die Werte eines assoziativen Arrays in die für SQL-Anweisungen passende Form

add a note add a note

User Contributed Notes 9 notes

shane at treesandthings dot com
17 years ago
Returns SQL statement, slight improvement on the code from 'rorezende at hotmail dot com'.  This version adds bool values correctly.It also checks to make sure there is actually a value in the array before including it in the sql statement. (ie: null values or empty strings won't be added to the sql statement)

function db_build_insert($table,$array)

$str = "insert into $table ";
$strn = "(";
$strv = " VALUES (";
$name,$value) = each($array)) {

is_bool($value)) {
$strn .= "$name,";
$strv .= ($value ? "true":"false") . ",";

is_string($value)) {
$strn .= "$name,";
$strv .= "'$value',";
       if (!
is_null($value) and ($value != "")) {
$strn .= "$name,";
$strv .= "$value,";
$strn[strlen($strn)-1] = ')';
$strv[strlen($strv)-1] = ')';
$str .= $strn . $strv;

skippy at zuavra dot net
16 years ago
Beware of the following: pg_insert() and pg_update() are adding slashes to all character-like fields they work with. This makes them SQL injection super-safe, but there are unwanted consequences, as follows:

If you have a regular setup with magic_quotes_gcp=On, and you use pg_insert() or pg_update(), you will end up with fields that look as if you used addslashes() twice. To solve this, you can use stripslashes() on the data just before using it with pg_insert() or pg_update().

There's another alternative, which seems better to me. Why make yourself crazy all over the code, adding slashes, stripping slashes, worrying whether magic_quotes_gpc is on or off and so on and so forth? Why do this, when the only place you actually need those slashes is right when you push the data into the database?

So why not get rid of your addslashes() and stripslashes() from all over your code, and turn magic_quotes_gcp off. As long as you always use pg_insert() and pg_update() to do your DB work, you're SQL-injection safe AND slash-headache free.
phpuser at ego dot gen dot nz
9 years ago
This function cannot be used to insert a record with only default values - i.e. with an assoc_array of array()
jsnell at e-normous dot com
13 years ago
If you need schema support, this function will do something similar to pg_insert:

function pg_insert_with_schema($connection, $table, $updates)
$schema = 'public';
if (strpos($table, '.') !== false)
    list($schema, $table) = explode('.', $table);

    if (count($updates) == 0) {
        $sql = "INSERT INTO $schema.\"$table\" DEFAULT VALUES";
            return pg_query($sql);
        } else {
$sql = "INSERT INTO $schema.\"$table\" ";
$sql .= '("';
$sql .= join('", "', array_keys($updates));
$sql .= '")';

$sql .= ' values (';
for($i = 0; $i < count($updates); $i++)
   $sql .= ($i != 0? ', ':'').'$'.($i+1);
$sql .= ')';
return pg_query_params($connection, $sql, array_values($updates));
mina86 at tlen dot pl
17 years ago
Next version :) My version checks whether value is bool, null, string or numeric and if one of the values is not function returns false if not. null values are inserted as NULL, bool as true or false and strings are add-shlashed before adding to query string. Note, that this function is not safe. SQL injection is possible with column names if you use $_POST or something similar as a $array.

function db_build_insert($table, $array) {
  if (
count($array)===0) return false;
$columns = array_keys($array);
$values = array_values($array);

  for (
$i = 0, $c = count($values); $i$c; ++$i) {
    if (
is_bool($values[$i])) {
$values[$i] = $values[$i]?'true':'false';
    } elseif (
is_null($values[$i])) {
$values[$i] = 'NULL';
    } elseif (
is_string($values[$i])) {
$values[$i] = "'" . addslashes($values[$i]) . "'";
    } elseif (!
is_numeric($values[$i])) {

"INSERT INTO $table ($column_quote" . implode(', ', $columns) .
") VALUES (" . implode(', ', $values) . ")";
rorezende at hotmail dot com
18 years ago
Time is money, then I write a function similar to pg_insert in PHP (only output sql statement) :

   function db_mount_insert($table,$array) {

    $str = "insert into $table (";
    while(list($name,$value) = each($array)) {       
        $str .= "$name,";       
    $str[strlen($str)-1] = ')';
    $str .= " values (";
    while(list($name,$value) = each($array)) {       
            $str .= "'$value',";
            $str .= "$value,";
    $str[strlen($str)-1] = ')';
    $str .= ";"    ;
    return $str;

excalibur at nospam dot icehouse dot net
14 years ago
Today at work I isolated a problem I was having with this function to how I was formatting the date.  I was assigning the date in my code as follows:

$today = date( "Ymd" ); // ISO 8601

This format is acceptable to PostgreSQL, as verified by their documentation and buy tests using psql.  However, to make it work in my code, I had to make the following change:

$today = date( "Y-m-d" ); // also ISO 8601 format
15 years ago
Had a few issues while trying to run this in PHP 4.4.0:

- I could not get it to work with column names that are SQL reserved words (example: desc, order). I was forced to change the column names in order to use the function. I could not put the column names in quotes, because that caused pg_convert() to fail.

- Function was returning false until I passed the PGSQL_DML_EXEC option.
12 years ago
it seems to fail silently if you try to insert somehting with a mis-named column
To Top