oci_bind_by_name

(PHP 5)

oci_bind_by_name --  Oracle プレースホルダーに PHP 変数をバインドする

説明

bool oci_bind_by_name ( resource stmt, string ph_name, mixed &variable [, int maxlength [, int type]] )

ocibindbyname() は、PHP 変数 variable を Oracle プレースホルダー ph_name にバインドします。実行時に入力用、 出力用に使用されるによらず、必要な記憶領域が確保されます。 length パラメータは、バインド時の最大長を 設定します。length を -1 に設定した場合、 oci_bind_by_name()variable の現在の長さを最大長として設定し ます。

抽象データ型 (LOB/ROWID/BFILE) をバインドする必要がある場合、まず OCINewDescriptor() 関数を使用してこれを確保する必要があります。 length は抽象データ型用には 使用されず、-1 を設定する必要があります。 type パラメータは、 使用されるディスクリプタをOracle に伝えます。 使用可能な値は次のようになります。

例 1. oci_bind_by_name() の例

<?php
/* oci_bind_by_name  の例 thies at thieso dot net (980221)
  3レコードをempに挿入し、挿入の直後にレコードを更新するために
  ROWIDを使用します。
*/

$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);

/* テーブル emp から "junk" を削除する.... */
$stmt = oci_parse($conn, "
                          DELETE FROM
                                     emp
                                WHERE
                                     empno
                                   IN
                                     (1111,2222,3333)
                                   "
);
oci_execute($stmt);
oci_free_statement($stmt);

oci_close($conn);
?>

この関数は余分な空白を除去する事を忘れないでください。 次の例を見てください。

例 2. oci_bind_by_name() の例

<?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", "trailing spaces follow     ");
    
oci_execute($statement);
    
/*
     このコードは DB に文字列 'trailing spaces follow' に余分な空白を付けないで
     挿入します。
    */
?>

例 3. oci_bind_by_name() の例

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

    
$statement = oci_parse($query);
    
oci_bind_by_name($statement, ":id", 1);
    
oci_execute($statement);
    
/*
     また、このコードは余分な空白を保持したまま 'trailing spaces follow      '
     を追加します。
    */
?>

警告

magic_quotes_gpcaddslashes()oci_bind_by_name() を同時に使用しないでください。 これは、引用符を追加する必要がないためで、 また、magic quote により付加された引用符は、 oci_bind_by_name() が magic quote によ り付加された引用符と意図的に付加されたものを区別できないため、 そのままデータベースに書き込まれるためです。

成功した場合に TRUE を、失敗した場合に FALSE を返します。

注意: PHP バージョン 5.0.0 以前では、代わりに ocibindbyname() を使用しなければなりません。 まだこの名前を使用することができ、下位互換性のため oci_bind_by_name() への別名として残されていますが、 推奨されません。