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から(?)追加された関数もあるようです。
一覧表を見てすぐに気づくと思いますが、「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>
|