(PHP 5, PECL OCI8 >= 1.1.0)
oci_bind_by_name — Bindet eine PHP-Variable an einen Oracle Platzhalter
$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.
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.
Gibt bei Erfolg TRUE
zurück. Im Fehlerfall wird FALSE
zurückgegeben.
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($conn, OCI_D_ROWID);
oci_bind_by_name($stmt, ":empno", $empno, 32);
oci_bind_by_name($stmt, ":ename", $ename, 32);
oci_bind_by_name($stmt, ":rid", $rowid, -1, OCI_B_ROWID);
$update = oci_parse($conn, "
UPDATE
emp
SET
sal = :sal
WHERE
ROWID = :rid
");
oci_bind_by_name($update, ":rid", $rowid, -1, OCI_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.
*/
?>
Gibt bei Erfolg TRUE
zurück. Im Fehlerfall wird FALSE
zurückgegeben.
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.