データベースでの PHP のサポートを使用できるのは、SQL Anywhere バージョン 11 以降のデータベースのみです。SQL Anywhere 10 データベースがロードされている場合、データベースでの PHP のサポートを使用しようとすると、外部環境がサポートされていないことを示すエラーが返されます。
PHP をデータベースで使用するには、データベースサーバが PHP 実行ファイルを検出して開始できる必要があります。データベースサーバが PHP 実行ファイルを検出して開始できるかどうかを確認するには、次の文を実行します。
START EXTERNAL ENVIRONMENT PHP; |
「外部実行ファイル」が見つからないというメッセージが表示された場合、問題の原因はデータベースサーバが PHP 実行ファイルを検出できていないことにあります。この場合は、ALTER EXTERNAL ENVIRONMENT 文を実行し、PHP 実行ファイルのロケーション (実行ファイル名も含む) を明示的に設定するか、PHP 実行ファイルがあるディレクトリが PATH 環境変数に含まれていることを確認する必要があります。
ALTER EXTERNAL ENVIRONMENT PHP LOCATION 'php-path'; |
次に例を示します。
ALTER EXTERNAL ENVIRONMENT PHP LOCATION 'c:\\php\\php-5.4.8-win32\\php.exe'; |
デフォルト設定に戻すには、次の文を実行します。
ALTER EXTERNAL ENVIRONMENT PHP LOCATION 'php'; |
「メインスレッド」が見つからないというメッセージが表示された場合は、次のことを確認します。
START EXTERNAL ENVIRONMENT PHP 文は、データベースサーバが PHP を開始できるかどうかを確認する以外で使用することはありません。通常、PHP ストアドプロシージャまたはファンクションを呼び出すと、PHP は自動的に開始されます。
これと同様に、PHP のインスタンスを停止するために STOP EXTERNAL ENVIRONMENT PHP 文を使用する必要もありません。インスタンスは、接続が切断されると自動的に停止します。ただし、PHP をこれ以上使用することがなく、一部のリソースを解放する必要がある場合は、STOP EXTERNAL ENVIRONMENT PHP 文を使用して接続のための PHP インスタンスを解放します。
データベースサーバが PHP 実行ファイルを開始できることを確認したら、次に必要な PHP コードをデータベースにインストールします。これは、INSTALL 文を使用して行います。たとえば、次の文を実行して、特定の PHP スクリプトをデータベースにインストールできます。
INSTALL EXTERNAL OBJECT 'php-script' NEW FROM FILE 'php-file' ENVIRONMENT PHP; |
PHP コードは、次のようにして式から構築してインストールすることもできます。
INSTALL EXTERNAL OBJECT 'php-script' NEW FROM VALUE 'php-statements' ENVIRONMENT PHP; |
PHP コードは、次のようにして変数から構築してインストールすることもできます。
CREATE VARIABLE PHPVariable LONG VARCHAR; SET PHPVariable = 'php-statements'; INSTALL EXTERNAL OBJECT 'php-script' NEW FROM VALUE PHPVariable ENVIRONMENT PHP; |
PHP コードをデータベースから削除するには、次のように REMOVE 文を使用します。
REMOVE EXTERNAL OBJECT 'php-script'; |
既存の PHP コードを変更するには、次のように INSTALL 文の UPDATE 句を使用します。
INSTALL EXTERNAL OBJECT 'php-script' UPDATE FROM FILE 'php-file' ENVIRONMENT PHP; |
INSTALL EXTERNAL OBJECT 'php-script' UPDATE FROM VALUE 'php-statements' ENVIRONMENT PHP; |
SET PHPVariable = 'php-statements'; INSTALL EXTERNAL OBJECT 'php-script' UPDATE FROM VALUE PHPVariable ENVIRONMENT PHP; |
PHP コードがデータベースにインストールされたら、次に必要な PHP ストアドプロシージャおよび関数を作成できます。PHP ストアドプロシージャおよび関数を作成するときは、LANGUAGE に必ず PHP を指定します。また、EXTERNAL NAME 文字列には、PHP サブルーチンを呼び出し、OUT パラメータを返すために必要な情報が含まれています。
引数は $argv 配列で PHP スクリプトに渡されます。これは、PHP がコマンドラインから引数を受け取る方法 ( $argv[1] が最初の引数) に似ています。出力パラメータを設定するには、出力パラメータを適切な $argv 要素に割り当てます。戻り値は、常にスクリプトの出力 (LONG VARCHAR) です。
PHP ストアドプロシージャは、入出力の引数にあらゆるデータ型セットを指定して作成できます。ただし、PHP スクリプト内で使用されるために、パラメータは boolean、integer、double、または string の間で変換されます。戻り値は、常に LONG VARCHAR 型のオブジェクトです。簡単な PHP の例を次に示します。
INSTALL EXTERNAL OBJECT 'SimplePHPExample' NEW FROM VALUE '<?php function SimplePHPFunction( $arg1, $arg2, $arg3, $arg4 ) { return ($arg1 * 1000) + ($arg2 * 100) + ($arg3 * 10) + $arg4; } ?>' ENVIRONMENT PHP; CREATE FUNCTION SimplePHPDemo( IN thousands INT, IN hundreds INT, IN tens INT, IN ones INT) RETURNS LONG VARCHAR EXTERNAL NAME '<file=SimplePHPExample> print SimplePHPFunction( $argv[1], $argv[2], $argv[3], $argv[4]);' LANGUAGE PHP; // The number 1234 should appear SELECT SimplePHPDemo(1,2,3,4); |
PHP では、EXTERNAL NAME 文字列は 1 行の SQL 文で指定されます。
サーバ側の PHP を使用するには、PHP コードでデフォルトのデータベース接続を使用します。データベース接続のハンドルを取得するには、空の文字列引数 ('' または "") を指定して sasql_pconnect を呼び出します。空の文字列引数を指定することで、新しい外部環境接続を開くのではなく、現在の外部環境接続を返すように SQL Anywhere PHP ドライバに伝えます。次の例では、テーブルを作成してから PHP ストアドプロシージャを呼び出して、テーブルにデータを移植します。
CREATE TABLE phpTab(c1 int, c2 char(128)); INSTALL EXTERNAL OBJECT 'ServerSidePHPExample' NEW FROM VALUE '<?php function ServerSidePHPSub() { $conn = sasql_pconnect( '''' ); sasql_query( $conn, "INSERT INTO phpTab SELECT table_id, table_name FROM SYS.SYSTAB" ); sasql_commit( $conn ); } ?>' ENVIRONMENT PHP; CREATE PROCEDURE PHPPopulateTable() EXTERNAL NAME '<file=ServerSidePHPExample> ServerSidePHPSub()' LANGUAGE PHP; CALL PHPPopulateTable(); // The following should return 2 identical rows SELECT count(*) FROM phpTab UNION ALL SELECT count(*) FROM SYS.SYSTAB; |
PHP では、EXTERNAL NAME 文字列は 1 行の SQL 文で指定されます。上の例では、SQL での引用符の解析方法に従って、単一引用符が二重になっています。PHP ソースコードがファイル内にある場合は、単一引用符を二重にしません。
エラーをデータベースサーバに戻すには、PHP 例外をスローします。次の例は、これを行う方法を示します。
CREATE TABLE phpTab(c1 int, c2 char(128)); INSTALL EXTERNAL OBJECT 'ServerSidePHPExample' NEW FROM VALUE '<?php function ServerSidePHPSub() { $conn = sasql_pconnect( '''' ); if( !sasql_query( $conn, "INSERT INTO phpTabNoExist SELECT table_id, table_name FROM SYS.SYSTAB" ) ) throw new Exception( sasql_error( $conn ), sasql_errorcode( $conn ) ); sasql_commit( $conn ); } ?>' ENVIRONMENT PHP; CREATE PROCEDURE PHPPopulateTable() EXTERNAL NAME '<file=ServerSidePHPExample> ServerSidePHPSub()' LANGUAGE PHP; CALL PHPPopulateTable(); |
上の例は、テーブル phpTabNoExist
が見つからないことを示す SQLE_UNHANDLED_EXTENV_EXCEPTION エラーで終了します。
データベースでの PHP サポートの使用に関する詳細および例については、%SQLANYSAMP16%\SQLAnywhere\ExternalEnvironments\PHP ディレクトリのサンプルを参照してください。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |