Oracle interMediaをPHPから使用できないか?
つ〜ことでGoogleって見た。
10g付属のinterMediaのservlet/jspサンプルと同じテーブル構成の物を、PHP5から実行するサンプルのようです。
EZ-Connectって書いてあるので、おそらくInstant-Client用の記述ですが、普通にOCI8のDSN書いてもコードは通りますね。
(当たり前だ)
サンプルスキーマとして、ORD_TESTを用意。テスト用なのでDBAロールを付与してしまいます。クォータも無制限。
CREATE USER ORD_TEST IDENTIFIED BY ******** DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE DEFAULT / GRANT DBA TO ORD_TEST / GRANT UNLIMITED TABLESPACE TO ORD_TEST /
引き続き、サンプルで使用するテーブルを作成。
CREATE TABLE photos( id NUMBER UNIQUE NOT NULL, description VARCHAR2(40) NOT NULL, location VARCHAR2(40), image ORDSYS.ORDIMAGE, thumb ORDSYS.ORDIMAGE );
引き続き、シーケンスを作成。
CREATE SEQUENCE photos_sequence;
サンプルコードは以下のようになってるので、そのまま利用。
<?php if (!isset($_POST['description']) || !isset($_POST['location']) || !isset($_FILES['photo'])) { ?> <HTML> <BODY> <FORM name="uploadForm" method="post" enctype="multipart/form-data"> <P> Location? <INPUT type="text" name="location"/><BR/> Description? <INPUT type="text" name="description"/><BR/> Image File? <INPUT type="file" name="photo"/><BR/> <INPUT type="submit" value="Submit" /> </P> </FORM> </BODY> </HTML> <?php } else{ // Connect to the DB. Using OCI8 syntax // (must have Oracle Net configured) $conn = oci_connect('ord_test', '********', '****'); // Call procedure to put photo $r = db_put_photo($conn, $_POST['description'], $_POST['location'], $_FILES['photo']['tmp_name'], $_FILES['photo']['type']); $here = $_SERVER['PHP_SELF']; if ($r) echo "Upload Successful. <a href=\"$here\"> Again? </a>"; else echo "Upload Failed. <a href=\"$here\"> Try Again? </a>"; } // // Function to put photo into database // function db_put_photo($conn, $description, $location, $imgfile, $defaultmime) { $stmttxt = "INSERT INTO photos t (id, description, location, image, thumb) VALUES(photos_sequence.nextval,:descr,:loc, ordimage.init(), ordimage.init()) RETURNING t.image.getcontent(), rowid into :lob, :rid"; $stmt = oci_parse($conn, $stmttxt); // Fill in text filelds oci_bind_by_name($stmt, ':descr', $description, -1); oci_bind_by_name($stmt, ':loc', $location, -1); // Get lob descriptor $lob = oci_new_descriptor($conn, OCI_D_LOB); oci_bind_by_name($stmt, ':lob', $lob, -1, OCI_B_BLOB); // Get rowid oci_bind_by_name($stmt, ':rid', $rid, 64); // Execute the statement oci_execute($stmt, OCI_DEFAULT); $handle = fopen($imgfile, "r"); while ( !feof($handle) ) $lob->write(fread($handle, 65534)); // Update the photo and create a thumbnail image. // If we can't figure out the mimetype, // use the mimetype passed into the webserver. $stmttxt = " DECLARE img ordimage; th ordimage; BEGIN select image, thumb into img, th from photos where rowid = :rid; begin img.setproperties(); img.processcopy ('fileFormat=JFIF maxScale=128 128', th); exception when others then img.setMimeType(:mt); th := null; end; update photos set image=img, thumb=th where rowid=:rid; commit; END;"; $stmt = oci_parse($conn, $stmttxt); oci_bind_by_name($stmt, ':rid', $rid, -1); oci_bind_by_name($stmt, ':mt', $defaultmime, -1); oci_execute($stmt, OCI_DEFAULT); oci_commit($conn); // Free up resources oci_free_statement($stmt); $lob->free(); return true; } ?>
このサンプルでは、LocationとDescription、画像ファイルを指定すると、対応する列にデータを格納するみたい。
…なのだが、どうにもサムネイルが上手く作成されない。
サムネイルを作るPL/SQLプロシジャが怪しいとにらんでいるけれども、とりあえずはデータ登録は可能になったようだ。
…続く?