Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Programmierung » Unterstützung für externe Umgebungen in SQL Anywhere » Die externe PHP-Umgebung

 

PHP aus der Datenbank verwenden

Die Unterstützung für PHP in der Datenbank steht nur für SQL Anywhere-Datenbanken der Version 11 oder später zur Verfügung. Wenn eine SQL Anywhere 10-Datenbank geladen ist und Sie versuchen, die Unterstützung für PHP in der Datenbank zu verwenden, wird ein Fehler zurückgegeben, der angibt, dass externe Umgebungen nicht unterstützt werden.

Um PHP in der Datenbank zu verwenden, muss der Datenbankserver in der Lage sein, die Position des PHP-Programms zu ermitteln und es zu starten. Sie können überprüfen, ob der Datenbankserver in der Lage ist, die Position des PHP-Programms zu ermitteln und es zu starten, indem Sie die folgende Anweisung ausführen:

START EXTERNAL ENVIRONMENT PHP;

Wenn eine Meldung des Inhalts angezeigt wird, dass das 'externe Programm' nicht gefunden wurde, dann liegt das Problem darin, dass der Datenbankserver nicht in der Lage ist, die Position des PHP-Programms zu ermitteln. In diesem Fall sollten Sie die ALTER EXTERNAL ENVIRONMENT-Anweisung ausführen, um explizit den Speicherort des PHP-Programms einschließlich des Programmnamens festzulegen, oder sicherstellen, dass die PATH-Umgebungsvariable das Verzeichnis umfasst, in dem sich das PHP-Programm befindet.

ALTER EXTERNAL ENVIRONMENT PHP 
  LOCATION 'php-path';

Beispiel:

ALTER EXTERNAL ENVIRONMENT PHP
  LOCATION 'c:\\php\\php-5.4.8-win32\\php.exe';

Um die Standardeinstellung wiederherzustellen, führen Sie die folgende Anweisung aus:

ALTER EXTERNAL ENVIRONMENT PHP
  LOCATION 'php';

Wenn Sie eine Meldung des Inhalts sehen, dass der 'Haupt-Thread' nicht gefunden werden kann, überprüfen Sie Folgendes:

Beachten Sie, dass die Anweisung START EXTERNAL ENVIRONMENT PHP nur benötigt wird, um zu überprüfen, ob der Datenbankserver in der Lage ist, PHP zu starten. Üblicherweise startet PHP automatisch, wenn Sie einen Aufruf einer gespeicherten PHP-Prozedur oder Funktion durchführen.

Die Anweisung STOP EXTERNAL ENVIRONMENT PHP ist auch nicht erforderlich, um eine Instanz von PHP zu stoppen, weil die Instanz mit dem Ende der Verbindung automatisch beendet wird. Wenn Sie allerdings die Arbeit mit PHP abgeschlossen haben und Ressourcen freigeben wollen, entfernt die Anweisung STOP EXTERNAL ENVIRONMENT PHP die PHP-Instanz für Ihre Verbindung.

Wenn Sie überprüft haben, dass der Datenbankserver das PHP-Programm starten kann, besteht der nächste Schritt darin, den erforderlichen PHP-Code in der Datenbank zu installieren. Sie erreichen dies, indem Sie die Anweisung INSTALL verwenden. Sie können beispielsweise die folgende Anweisung ausführen, um ein bestimmtes PHP-Skript in der Datenbank zu installieren.

INSTALL EXTERNAL OBJECT 'php-script' 
  NEW 
  FROM FILE 'php-file'
  ENVIRONMENT PHP;

PHP-Code kann wie folgt aus einem Ausdruck extrahiert und installiert werden:

INSTALL EXTERNAL OBJECT 'php-script' 
  NEW
  FROM VALUE 'php-statements'
  ENVIRONMENT PHP;

PHP-Code kann wie folgt aus einer Variablen extrahiert und installiert werden:

CREATE VARIABLE PHPVariable LONG VARCHAR;
SET PHPVariable = 'php-statements';
INSTALL EXTERNAL OBJECT 'php-script' 
  NEW 
  FROM VALUE PHPVariable
  ENVIRONMENT PHP;

Um PHP aus der Datenbank zu entfernen, verwenden Sie die Anweisung REMOVE:

REMOVE EXTERNAL OBJECT 'php-script';

Um bestehenden PHP-Code zu ändern, können Sie die UPDATE-Klausel der Anweisung INSTALL verwenden:

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;

Wenn der PHP-Code in der Datenbank installiert ist, können Sie anschließend die erforderlichen gespeicherten PHP-Prozeduren und -Funktionen erstellen. Wenn Sie gespeicherte PHP-Prozeduren und Funktionen erstellen, ist LANGUAGE immer PHP und die Zeichenfolge EXTERNAL NAME enthält die Informationen, die erforderlich sind, um die PHP-Subroutinen aufzurufen und OUT-Parameter zurückzugeben.

Die Argumente werden so an das PHP-Skript im $argv-Array übergeben, wie PHP Argumente von der Befehlszeile annehmen würde (d.h. $argv[1] ist das erste Argument). Um einen Ausgabeparameter festzulegen, ordnen Sie ihn dem entsprechenden $argv-Element zu. Der Rückgabewert ist immer die Ausgabe des Skripts (als Typ LONG VARCHAR).

Eine gespeicherte PHP-Prozedur kann mit jedem Datentypsatz für Eingabe- oder Ausgabeargumente erstellt werden. Die Parameter werden allerdings für die Verwendung innerhalb des PHP-Skripts von bzw. in boolean-, integer-, double- oder string-Werte konvertiert. Der Rückgabewert ist immer ein Objekt vom Typ LONG VARCHAR. Es folgt ein einfaches PHP-Beispiel:



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

Bei PHP wird die Zeichenfolge EXTERNAL NAME in einer einzigen Zeile mit SQL-Code angegeben.

Um serverseitiges PHP zu verwenden, kann der PHP-Code die Standarddatenbankverbindung benutzen. Um ein Handle für die Datenbankverbindung zu erhalten, rufen Sie sasql_pconnect mit einem leeren Zeichenfolgenargument ('' oder "") auf. Das leere Zeichenfolgenargument teilt dem SQL Anywhere PHP-Treiber mit, die aktuelle externe Umgebungsverbindung zurückzugeben, anstatt eine neue zu öffnen. Das folgende Beispiel erstellt eine Tabelle und ruft dann eine gespeicherte PHP-Prozedur auf, um die Tabelle mit Daten zu füllen:



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;

Bei PHP wird die Zeichenfolge EXTERNAL NAME in einer einzigen Zeile mit SQL-Code angegeben. Im Beispiel oben werden die Apostrophe aus Gründen der syntaktischen Analyse in SQL verdoppelt. Befände sich der PHP-Quellcode in einer Datei, würden die Apostrophe nicht verdoppelt werden.

Um einen Fehler an den Datenbankserver zurückzugeben, lösen Sie eine PHP-Ausnahme aus. Das folgende Beispiel zeigt, wie Sie hierzu vorgehen.



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

Das obenstehende Beispiel sollte mit dem Fehler SQLE_UNHANDLED_EXTENV_EXCEPTION beendet werden, der angibt, dass die Tabelle phpTabNoExist nicht gefunden wurde.

Weitere Hinweise und Beispiele zur Unterstützung für PHP in der Datenbank finden Sie unter den Beispielen, die sich im Verzeichnis %SQLANYSAMP16%\SQLAnywhere\ExternalEnvironments\PHP befinden.