suche nach in der

oci_cancel> <oci_bind_array_by_name
Last updated: Fri, 18 May 2012

view this page in

oci_bind_by_name

(PHP 5, PECL OCI8 >= 1.1.0)

oci_bind_by_nameBindet eine PHP-Variable an einen Oracle Platzhalter

Beschreibung

bool oci_bind_by_name ( resource $statement , string $ph_name , mixed &$variable [, int $maxlength = -1 [, int $type = SQLT_CHR ]] )

Bindet die PHP-Variable variable an den Oracle-Platzhalter ph_name. Ob dieser zur Ein- oder Ausgabe genutzt wird, wird zur Laufzeit ermittelt und der benötigte Speicherplatz reserviert.

Parameter-Liste

statement

Ein OCI-Statement.

ph_name

Ein Platzhalter.

variable

Die PHP-Variable.

maxlength

Setzt die maximale Größe des Binds. Wenn dieser Wert auf -1 gesetzt wird, nimmt die Funktion die aktuelle Größe von variable und setzt diesen Wert als maximale Grösse.

type

Wenn ein abstrakter Datentyp wie (LOB/ROWID/BFILE) gebunden werden soll, muss zuerst oci_new_descriptor() verwendet werden. length gilt nicht für abstrakte Datentypen und sollte dann auf -1 gesetzt sein. type zeigt Oracle, welchen Typ wir binden wollen. Als Standardwert wird SQLT_CHR verwendet. Mögliche Typen sind:

  • SQLT_FILE - für BFILEs (Binärdatei);

  • SQLT_CFILE - für CFILEs (Textdatei);

  • SQLT_CLOB - für CLOBs (Text-LOB);

  • SQLT_BLOB - für BLOBs (Binär-LOB);

  • SQLT_RDD - für ROWIDs;

  • SQLT_NTY - für benamte Datentypen;

  • SQLT_INT - für INTEGERs;

  • SQLT_CHR - für VARCHARs;

  • SQLT_BIN - für RAW-Spalten;

  • SQLT_LNG - für LONG-Spalten;

  • SQLT_LBI - für LONG-RAW-Spalten;

  • SQLT_RSET - für Zeiger, die zuvor mit oci_new_cursor() generiert wurden.

Rückgabewerte

Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.

Beispiele

Beispiel #1 oci_bind_by_name()-Beispiel

<?php
/* oci_bind_by_name Beispiel thies at thieso dot net (980221)
  fügt 3 Datensätze in emp ein und benutzt ROWID, um die Datensätze
  direkt nach dem Einfügen zu ändern.
*/

$conn oci_connect("scott""tiger");

$stmt oci_parse($conn"
                          INSERT INTO
                                     emp (empno, ename)
                                              VALUES
                                     (:empno,:ename)
                            RETURNING
                                     ROWID
                                 INTO
                                     :rid
                                         "
);

$data = array(
              
1111 => "Larry",
              
2222 => "Bill",
              
3333 => "Jim"
             
);

$rowid oci_new_descriptor($connOCI_D_ROWID);

oci_bind_by_name($stmt":empno"$empno32);
oci_bind_by_name($stmt":ename"$ename32);
oci_bind_by_name($stmt":rid",   $rowid, -1OCI_B_ROWID);

$update oci_parse($conn"
                            UPDATE
                                  emp
                               SET
                                  sal = :sal
                             WHERE
                                  ROWID = :rid
                             "
);
oci_bind_by_name($update":rid"$rowid, -1OCI_B_ROWID);
oci_bind_by_name($update":sal"$sal,   32);

$sal 10000;

foreach (
$data as $empno => $ename) {
    
oci_execute($stmt);
    
oci_execute($update);
}

$rowid->free();

oci_free_statement($update);
oci_free_statement($stmt);

$stmt oci_parse($conn"
                          SELECT
                                *
                            FROM
                                emp
                           WHERE
                                empno
                              IN
                                (1111,2222,3333)
                              "
);
oci_execute($stmt);

while (
$row oci_fetch_assoc($stmt)) {
    
var_dump($row);
}

oci_free_statement($stmt);

/* löscht unseren "Müll" aus der Tabelle emp.... */
$stmt oci_parse($conn"
                          DELETE FROM
                                     emp
                                WHERE
                                     empno
                                   IN
                                     (1111,2222,3333)
                                   "
);
oci_execute($stmt);
oci_free_statement($stmt);

oci_close($conn);
?>

Bedenken Sie, dass diese Funktion die nachfolgenden Leerzeichen abschneidet, wie das folgende Beispiel zeigt:

Beispiel #2 oci_bind_by_name()-Beispiel

<?php
    $connection 
oci_connect('apelsin','kanistra');
    
$query "INSERT INTO test_table VALUES(:id, :text)";

    
$statement oci_parse($query);
    
oci_bind_by_name($statement":id"1);
    
oci_bind_by_name($statement":text""Leerzeichen folgen     ");
    
oci_execute($statement);
    
/*
     Dieser Code wird den String 'Leerzeichen folgen' ohne die
     nachfolgenden Leerzeichen in die DB einfügen.
    */
?>

Beispiel #3 oci_bind_by_name()-Beispiel

<?php
    $connection 
oci_connect('apelsin','kanistra');
    
$query "INSERT INTO test_table VALUES(:id, 'Leerzeichen folgen      ')";

    
$statement oci_parse($query);
    
oci_bind_by_name($statement":id"1);
    
oci_execute($statement);
    
/*
     Und dieser Code wird 'Leerzeichen folgen      ' hinzufügen und
     dabei die Leerzeichen erhalten.
    */
?>

Rückgabewerte

Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.

Anmerkungen

Warnung

Benutze magic_quotes_gpc oder addslashes() und oci_bind_by_name() nicht gleichzeitig, da kein Escapen nötig ist und jedes magisch durchgeführte Escapen in die Datenbank geschrieben wird. oci_bind_by_name() kann die magisch hinzugefügte nicht von den absichtlich hinzugefügten Quotierung unterscheiden.

Hinweis:

In der PHP-Versionen vor 5.0.0 muss man ocibindbyname() benutzen. Den Namen kann man immer noch nutzen. Er wurde als Alias für oci_bind_by_name() für die Abwärtskompatibilität erhalten. Dieses ist allerdings veraltet und wird nicht empfohlen.



add a note add a note User Contributed Notes
oci_bind_by_name
08-May-2007 10:59
This is what the old OCI_B_* constants are now called:
(PHP 5.1.6 win32)

OCI_B_NTY - SQLT_NTY
OCI_B_BFILE - SQLT_BFILEE
OCI_B_CFILEE - SQLT_CFILEE
OCI_B_CLOB - SQLT_CLOB
OCI_B_BLOB - SQLT_BLOB
OCI_B_ROWID - SQLT_RDD
OCI_B_CURSOR - SQLT_RSET
OCI_B_BIN - SQLT_BIN
OCI_B_INT - SQLT_INT
OCI_B_NUM - SQLT_NUM
tom at bitworks dot de
27-Jan-2007 01:27
Referes to:

Be careful that the variable argument is a reference. So, the following code does not work:
  foreach($some_array as $key => $value)
  {
   OCIBindByName($stmt, $key, $value);
  }

I assume this is because the contents of $value changes, even though the reference remains the same, so all bound variables end up pointing to the last loop iteration's value.

Instead use the following:
  foreach($some_array as $key => $value)
  {
   OCIBindByName($stmt, $key, $some_array[$key]);
  }

This dues to the foreach statement. $some_array in foreach() is a copy of the origine array. $key would be the "reference" in the copy, but $some_array[$key] points to the original one.
Chris Delcamp
11-Jan-2007 05:48
This is an example of returning the primary key from an insert so that you can do inserts on other tables with foreign keys based on that value.  The date is just used to provied semi-unique data to be inserted.

$conn = oci_connect("username", "password")
$stmt = oci_parse($conn, "INSERT INTO test (test_msg) values (:data) RETURN test_id INTO :RV");
$data = date("d-M-Y H:i:s");
oci_bind_by_name($stmt, ":RV", $rv, -1, SQLT_INT);
oci_bind_by_name($stmt, ":data", $data, 24);
oci_execute($stmt);
print $rv;
js at mcs dot be
20-Feb-2006 01:48
Be careful that the variable argument is a reference. So, the following code does not work:
  foreach($some_array as $key => $value)
  {
    OCIBindByName($stmt, $key, $value);
  }

I assume this is because the contents of $value changes, even though the reference remains the same, so all bound variables end up pointing to the last loop iteration's value.

Instead use the following:
  foreach($some_array as $key => $value)
  {
    OCIBindByName($stmt, $key, $some_array[$key]);
  }
ehsmeng
16-Feb-2006 09:43
If you do a wrapper for these functions there is a bug I found on php5.1.1 / oracle 9 / windows xp. see the section with oci_bind_by_name.

function db_layer_insert_1_row ($dbquery, $bindvar = array())
{
    global $_db_layer_database;
    global $_db_layer_lasterror;
   
    if (false === ($stid = oci_parse($_db_layer_database, $dbquery))) {
        db_layer_lasterror ();
        return -1;
    }
   
    // Bind variables. NOTE substituting $bindvar[$bcol] with $bval causes
    // all variables to be set to the last value of $bval?!?!
    foreach ($bindvar as $bcol => $bval) {
        oci_bind_by_name($stid, $bcol, $bindvar[$bcol]); //$bval); <- bug?!
    }
   
    ...
hfuecks at nospam dot org
16-Aug-2005 10:12
Note that there have been some changes on the constant identifiers and the documentation is currently not entirely accurate.

Running the following script;

<?php
foreach (array_keys(get_defined_constants()) as $const) {
    if (
preg_match('/^OCI_B_/', $const) ) {
        print
"$const\n";
    }
}
?>

Under PHP 4.4.0 I get;

OCI_B_SQLT_NTY < renamed to OCI_B_NTY with PHP5
OCI_B_BFILE
OCI_B_CFILEE
OCI_B_CLOB
OCI_B_BLOB
OCI_B_ROWID
OCI_B_CURSOR
OCI_B_BIN

Under PHP 5.0.4 I get;

OCI_B_NTY
OCI_B_BFILE < docs are wrong right now
OCI_B_CFILEE < docs are wrong right now
OCI_B_CLOB
OCI_B_BLOB
OCI_B_ROWID
OCI_B_CURSOR
OCI_B_BIN < it's a mystery

oci_cancel> <oci_bind_array_by_name
Last updated: Fri, 18 May 2012