Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2004/05/05

counter hits
since 1999/11/06


PHP5でのOCI8関数

PHP3からPHP4への移行については、それほど大きな混乱はなかった(多分。。。)と思いますが、PHP5ではZendエンジンのバージョンアップに伴う様々な変更が加えられており、PHP4からPHP5への移行はかなり混乱が起こりそうな気配です。。。(特にオブジェクト周りですね。PEARはどうするんでしょうか。。。?)

最近PHPマニュアルを見たところ、OCI8関数の数がかなり増えていました。よく見てみると同じような名前の関数が多数あり、それぞれの関数の説明を見てみると、

Note: In PHP versions before 5.0.0 you must use ocixxxx() instead. This name still can be used, it was left as alias of oci_xxxx() for downwards compatability. This, however, is deprecated and not recommended.

の一文が見受けられます。どうやら、「従来の関数はaliasとして残しておくが推奨しない」ようです。

とりあえずざっくりですが、PHPマニュアルからOCI8関数の対応表をつくってみました。これを元にエディタのマクロを使って関数名を置換させることで、多少は移行作業が楽になるかも知れません。なお、PHP5から(?)追加された関数もあるようです。

PHP5 PHP5以前 備考
oci_bind_by_name OCIBindByName -
oci_cancel OCICancel -
oci_close OCILogOff -
collection->append OCICollAppend -
collection->assign OCICollAssign -
collection->assignElem OCICollAssignElem -
collection->getElem OCICollGetElem -
collection->max OCICollMax -
collection->size OCICollSize -
collection->trim OCICollTrim -
oci_commit OCICommit -
oci_connect OCILogon -
oci_define_by_name OCIDefineByName -
oci_error OCIError -
oci_execute OCIExecute -
oci_fetch_all OCIFetchStatement -
oci_fetch_array OCIFetchInto? -
oci_fetch_assoc OCIFetchInto? oci_fetch_array()+OCI_ASSOC
oci_fetch_object OCIFetchInto? -
oci_fetch_row OCIFetchInto? oci_fetch_array()+OCI_NUM
oci_fetch OCIFetch -
oci_field_is_null OCIColumnIsNULL -
oci_field_name OCIColumnName -
oci_field_precision OCIColumnPrecision -
oci_field_scale OCIColumnScale -
oci_field_size OCIColumnSize -
oci_field_type_raw OCIColumnTypeRaw -
oci_field_type OCIColumnType -
collection->free OCIFreeCollection -
descriptor->free OCIFreeDesc -
oci_free_statement OCIFreeStatement+OCIFreeCursor -
oci_internal_debug OCIInternalDebug -
lob->append - -
lob->close ocicloselob -
oci_lob_copy - -
lob->eof - -
lob->erase - -
lob->export OCIWriteLobToFile? -
lob->flush - -
lob->getBuffering - -
lob->import OCISaveLobFile -
oci_lob_is_equal - -
lob->load OCILoadLob -
lob->read - -
lob->rewind - -
lob->save OCISaveLob -
lob->seek - -
lob->setBuffering - -
lob->size - -
lob->tell - -
lob->truncate - -
lob->writeTemporary ociwritetemporarylob -
lob->write - -
oci_new_collection OCINewCollection -
oci_new_connect OCINLogon -
oci_new_cursor OCINewCursor -
oci_new_descriptor OCINewDescriptor -
oci_num_fields OCINumCols -
oci_num_rows OCIRowCount -
oci_parse OCIParse -
oci_password_change - -
oci_pconnect OCIPLogon -
oci_result OCIResult -
oci_rollback OCIRollback -
oci_server_version OCIServerVersion -
oci_set_prefetch OCISetPrefetch -
oci_statement_type OCIStatementType -

一覧表を見てすぐに気づくと思いますが、「OCIxxxx」だった関数名が「oci_xxxx」とアンダースコアが入るようになっています。また、単語の変更では、「logon」「logoff」が「connect」「close」、「column」が「field」となっています。

また、新しい関数で書き直したサンプルは以下の通りです。元ネタは、SAMPLEの「BINDの利用」にあるHowToUseBind2.phpです。

●bind.php

<?php
    if ($_SERVER['REQUEST_METHOD'] == "POST") {
        $val1 = $_POST['val1'];
        $val2 = $_POST['val2'];

        $conn = oci_connect("scott", "tiger", "orcl");
        $sql  = "INSERT INTO test VALUES(:col1,:col2) ";
        $parse = oci_parse($conn, $sql);
        oci_bind_by_name($parse, ":COL1", $val1, -1);
        oci_bind_by_name($parse, ":COL2", $val2, -1);
        if (@oci_execute($parse, OCI_DEFAULT)) {
            echo "COMMITします<br>";
            oci_commit($conn);
        }
        else {
            echo "ROLLBACKします<br>";
            echo "<br>";
            oci_rollback($conn);
        }
        oci_free_statement($parse);

        // 結果の表示
        $stmt = oci_parse($conn, "select * from test ");
        oci_execute($stmt);
        $ncols = oci_num_fields($stmt);

        echo "<table border='1'>";
        echo "<tr>";
        for ( $i = 1; $i <= $ncols; $i++ ) {
            $column_name  = oci_field_name($stmt,$i);
            echo "<th>" . $column_name . "</th>";
        }
        echo "</tr>";

        while(oci_fetch($stmt))
        {
            echo "<tr>";
            for ( $i = 1; $i <= $ncols; $i++ ) {
                $column_name  = oci_field_name($stmt,$i);
                echo "<td>" . oci_result($stmt, $column_name) . "</td>";
            }
            echo "</tr>";
        }

        echo "</table>";

        oci_free_statement($stmt);
        oci_close($conn);
    }
?>
<form action="bind.php" method="post">
<li>val1<input type="text" name="val1">
<li>val2<input type="text" name="val2">
<input type="submit">
</form>


About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2004 by Hideyuki SHIMOOKA all rights reserved.