OCIBindByName

(PHP 3>= 3.0.4, PHP 4 )

OCIBindByName --  PHP változó kötése egy Oracle értékhez

Leírás

int OCIBindByName ( int stmt, string ph_name, mixed & variable, int length [, int type])

Az OCIBindByName() a variable paraméterben megadott PHP változót köti a ph_name paraméterben megadott Oracle értékez (placeholder-hez). Akár bemeneti, akár kimeneti értékként kerül felhasználásra, ez futásidőben dől el, és a szükséges tárolási kapacitás lefoglalásra kerül. A length paraméter adja meg a kötés maximális méretét. Ha a length paramétert -1 értékkel adod meg, az OCIBindByName() a variable paraméterben megadott változó aktuális hosszát veszi maximum méretnek.

Ha absztrakt adattípust kell kötnöd (például LOB, ROWID vagy BFILE), először az OCINewDescriptor() függvényt kell használnod. A length paraméternek nincs jelentősége absztrakt adattípusok használatakor, mindenképpen -1 értékre kell állítani ebben az esetben. A type paraméter adja meg az Oracle-nek, hogy milyen leírót szeretnél használni. Lehetséges értékek: OCI_B_FILE (Binary-File), OCI_B_CFILE (Character-File), OCI_B_CLOB (Character-LOB), OCI_B_BLOB (Binary-LOB) és OCI_B_ROWID (ROWID).

Példa 1. OCIBindByName

<?php
/* OCIBindByName példa - thies@thieso.net (980221)
  Három rekord felvétele a "dolgozok" táblába, és a ROWID
  használata az adatok frissítésére rögtön a felvitel után.
*/

$conn = OCILogon("scott","tiger");

$stmt = OCIParse($conn,"insert into dolgozok (dolgozoid, dnev) ".
					   "values (:dolgozoid,:dnev) ".
					   "returning ROWID into :rid");

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

$rowid = OCINewDescriptor($conn, OCI_D_ROWID);

OCIBindByName($stmt,":dolgozoid",&$dolgozoid, 32);
OCIBindByName($stmt,":dnev",     &$dnev,      32);
OCIBindByName($stmt,":rid",      &$rowid,     -1, OCI_B_ROWID);

$update = OCIParse($conn,
              "update dolgozok set fizetes = :fizetes ".
              "where ROWID = :rid");
OCIBindByName($update,":rid",     &$rowid,     -1, OCI_B_ROWID);
OCIBindByName($update,":fizetes", &$fizetes,   32);

$fizetes = 10000;

while (list($dolgozoid,$dnev) = each($adatok)) {
	OCIExecute($stmt);
	OCIExecute($update);
} 

$rowid->free();

OCIFreeStatement($update);
OCIFreeStatement($stmt);

$stmt = OCIParse($conn,"select * from dolgozok where dolgozoid in (1111,2222,3333)");
OCIExecute($stmt);
while (OCIFetchInto($stmt, &$tomb, OCI_ASSOC)) {
	var_dump($tomb);
}
OCIFreeStatement($stmt);

/* Töröljük a "szemetünket" a dolgozok táblából.... */
$stmt = OCIParse($conn,"delete from dolgozok where dolgozoid in (1111,2222,3333)");
OCIExecute($stmt);
OCIFreeStatement($stmt);

OCILogoff($conn);
?>

Figyelem

Nem jó ötlet a "magic quotes" szolgáltatást, és az OciBindByName() függvényt egyszerre használni, mivel semmilyen átalakítás nem szükséges a változókon, és bármilyen extra idézőjel, ami az értékekben megjelenik az adatbázisba kerül. Az OciBindByName() nem tud különbséget tenni a korábban a karaktersorozatban lévő és a "magic quotes" átalakítás során bekerült idézőjelek között.