Σύνδεση εφαρμογής σε Βάση Δεδομένων PHP
PHP H PHP είναι μια γλώσσα προγραμματισμού για τη δημιουργία σελίδων web με δυναμικό περιεχόμενο. Μια σελίδα PHP περνά από επεξεργασία από ένα συμβατό διακομιστή του Παγκόσμιου Ιστού (π.χ. Apache), Παράγεται σε πραγματικό χρόνο το τελικό περιεχόμενο, που θα σταλεί στο πρόγραμμα περιήγησης των επισκεπτών σε μορφή κώδικα HTML. Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Σύνδεση Oracle με PHP Η PHP έχει διάφορες επεκτάσεις που επιτρέπουν εφαρμογές να χρησιμοποιούν την Oracle. Η επέκταση OCI8 (OCI8 Extension): είναι η προτεινόμενη για χρήση επέκταση. Περιλαμβάνεται στις εκδόσεις 3, 4, και 5 και 6 της PHP, ενώ είναι open source. Εγκατάσταση της επέκτασης PHP OCI8 Extension σε Windows Κατεβάζουμε το Apache HTTPD Server (http://httpd.apache.org/download.cgi) και το Windows PHP 5.2 zip package (http://www.php.net/downloads.php). Χρησιμοποιούμε το default bundle αν επιθυμούμε να τρέξουμε την PHP ως Apache module. Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Σύνδεση Oracle με PHP Εγκαθιστούμε PHP και Apache ακολουθώντας τις οδηγίες του PHP οδηγού για την εγκατάσταση σε Windows συστήματα (http://gr.php.net/install.windows). Ελέγχουμε αν η PHP δουλεύει κανονικά πριν προχωρήσουμε στα επόμενα βήματα. Εγκαθιστούμε την Oracle Database. Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Σύνδεση Oracle με PHP Κατεβάζουμε την επέκταση OCI8 1.3 για την PHP 5.2 από το http://www.php.net/archive/2008.php#id2008-12-10-1). These functions allow you to access Oracle Database 11g, 10g, 9i and 8i. They support SQL and PL/SQL statements. Το τρέχον πακέτο OCI8 1.3 για την PHP 5.2 είναι το εξής: php_oci8-1.3.5-5.2-win32-vc6-x86.zip, το οποίο περιλαμβάνει δύο dll αρχεία, τα php_oci8.dll και php_oci8_11g.dll (για oracle 11i). Αποσυμπιέζουμε το πακέτο και μεταφέρουμε τα δύο dll αρχεία στον κατάλογο όπου έχει εγκατασταθεί η PHP (π.χ. C:\php-5.2.9\ext). Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Εναλλακτικός τρόπος εκτέλεσης ιστοσελίδων χωρίς χρονοβόρες διαδικασίες LAMP: συνδυασμός Linux/Apache/PHP/MySQL, που είναι η πιο δημοφιλής πλατφόρμα εκτέλεσης ιστοσελίδων είναι γνωστός και με το ακρωνύμιο. Ο LAMP συνήθως εγκαθίσταται και ρυθμίζεται στο Linux με τη βοήθεια του διαχειριστή πακέτων της εκάστοτε διανομής. Άλλα λειτουργικά συστήματα: το κατέβασμα και η ρύθμιση των ξεχωριστών προγραμμάτων μπορεί να είναι πολύπλοκη, υπάρχουν έτοιμα πακέτα προς εγκατάσταση, XAMPP και το WAMP για τα Windows και το MAMP για το Mac OS X. Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Σύνδεση Oracle με PHP Αλλάζουμε τη σύνταξη στο php.ini και θέτουμε το extension_dir στον κατάλογο, όπου βρίσκονται τα αρχεία dll της επέκτασης PHP: extension_dir="c:\php-5.2.9\ext. στο αρχείο php.ini, θέτουμε την επέκταση OCI8 ως εξής: extension=php_oci8_11g.dll (στην περίπτωση που χρησιμοποιούμε την Oracle 11i. Αν χρησιμοποιούμε το Oracle 10.2 Instant Client, θέτουμε το extension ως εξής: extension=php_oci8.dll. Κάνουμε επανεκκίνηση στο Apache. Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Σύνδεση Oracle με PHP Επιβεβαίωση της ορθής εγκατάστασης της επέκτασης Για να ελέγξουμε ότι η επέκταση έχει εγκατασταθεί σωστά, δημιουργούμε ένα απλό PHP script μέσα στο κατάλογο Apache: <?php phpinfo();?> Φορτώνουμε το script σε έναν browser, παραδείγματος χάριν "http://localhost/phpinfo.php" Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Σύνδεση με την Oracle Η αυθεντικοποίηση (authentication) της Oracle και η πληροφορία σχετικά με τη ΒΔ περιέχεται στην εντολή oci_connect(). Ένα παράδειγμα αφορά στη σύνδεση στο HR σχήμα της MYDB υπηρεσίας ΒΔ που τρέχει στο τοπικά: $c = oci_connect('hr', 'hr_password', /localhost/mydb'). Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
Χρήση της Oracle Ένα παράδειγμα της χρήσης της Oracle είναι το απλό script, testoci.php. Προσαρμόζουμε τις λεπτομέρειες της σύνδεσης στη δική μας ΒΔ και το φορτώνουμε σε έναν browser. Το συγκεκριμένο παράδειγμα θεωρεί ότι όλοι οι πίνακες βρίσκονται κάτω από την κατοχή του χρήστη HR: <?php $conn = oci_connect('hr', 'hr_password', Localhost/MYDB'); $query = 'select table_name from user_tables'; $stid = oci_parse($conn, $query); oci_execute($stid, OCI_DEFAULT); while ($row = oci_fetch_array($stid, OCI_ASSOC)) { foreach ($row as $item) { echo $item." "; echo "<br>\n"; oci_free_statement($stid); oci_close($conn);?> Τμ. Ψηφιακών Συστημάτων, Παν. Πειραιώς 12/1/2016
PHP application Connect to Oracle DB <?php $c = oci_connect("hr", "hr_password", "localhost/xe"); if (!$c) { echo "Unable to connect: ". var_dump( oci_error() ); die();
PHP application Connect to Oracle DB // Drop old table... $s = oci_parse($c, "drop table tab1"); oci_execute($s, OCI_DEFAULT); // Create new table... $s = oci_parse($c, "create table tab1 (col1 number, col2 varchar2(30))"); oci_execute($s, OCI_DEFAULT); // Insert data into table... $s = oci_parse($c, "insert into tab1 values (1, 'Frank')"); oci_execute($s, OCI_DEFAULT);
PHP application Connect to Oracle DB // Insert data using bind variables... $var1 = 2; $var2 = "Scott"; $s = oci_parse($c, "insert into tab1 values (:bind1, :bind2)"); oci_bind_by_name($s, ":bind1", $var1); oci_bind_by_name($s, ":bind2", $var2); oci_execute($s, OCI_DEFAULT);
PHP application Connect to Oracle DB // Select Data... $s = oci_parse($c, "select * from tab1"); oci_execute($s, OCI_DEFAULT); while (oci_fetch($s)) { echo "COL1 = ". oci_result($s, "COL1"). ", COL2 = ". oci_result($s, "COL2"). "<br>\n"; // Commit to save changes... oci_commit($c); // Logoff from Oracle... oci_free_statement($s); oci_close($c);?>
SQL in Application Code oci_fetch_array() Modes Constant Description OCI_BOTH OCI_ASSOC OCI_NUM OCI_RETURN_NULLS Returns an array with both associative and numeric indices. This is the same as OCI_ASSOC + OCI_NUM and is the default behavior. Returns an associative array. Returns a numeric array. Creates elements for NULL fields. The element values will be a PHP NULL.
Example #1 oci_fetch_array() with OCI_BOTH <?php $conn = oci_connect('hr', 'welcome', 'localhost/xe'); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); $stid = oci_parse($conn, 'SELECT department_id, department_name FROM depart ments'); oci_execute($stid); while (($row = oci_fetch_array($stid, OCI_BOTH))) { // Use the uppercase column names for the associative array indices echo $row[0]. " and ". $row['department_id']. " are the same<br>\n"; echo $row[1]. " and ". $row['department_name']. " are the same<br>\n"; oci_free_statement($stid); oci_close($conn);?>
Example #2 oci_fetch_array() with OCI_NUM <?php /* Before running, create the table: CREATE TABLE mytab (id NUMBER, description CLOB); INSERT INTO mytab (id, description) values (1, 'A very long string'); COMMIT; */ $conn = oci_connect('hr', 'welcome', 'localhost/xe'); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); $stid = oci_parse($conn, 'SELECT id, description FROM mytab'); oci_execute($stid); while (($row = oci_fetch_array($stid, OCI_NUM))) { echo $row[0]. "<br>\n"; echo $row[1]->read(11). "<br>\n"; // this will output first 11 bytes from DESCRIPTION // Output is: // 1 // A very long oci_free_statement($stid); oci_close($conn);?>
Example #3 oci_fetch_array() with OCI_ASSOC <?php $conn = oci_connect('hr', 'welcome', 'localhost/xe'); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); $stid = oci_parse($conn, 'SELECT id, description FROM mytab'); oci_execute($stid); while (($row = oci_fetch_array($stid, OCI_ASSOC))) { echo $row['id']. "<br>\n"; echo $row['description']-> read(11). "<br>\n"; // this will output first 11 bytes from DESCRIPTION // Output is: // 1 // A very long oci_free_statement($stid); oci_close($conn);
oci_fetch_array() with OCI_RETURN_NULLS <?php $conn = oci_connect('hr', 'welcome', 'localhost/xe'); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); $stid = oci_parse($conn, 'SELECT 1, null FROM dual'); oci_execute($stid); while (($row = oci_fetch_array ($stid, OCI_ASSOC))) { // Ignore NULLs var_dump($row); /* The above code prints: array(1) { [1]=> string(1) "1" */ This function displays structured information about one or more expressions that includes its type and value
Example #1 var_dump() example <?php $a = array(1, 2, array("a", "b", "c")); var_dump($a);?> The above example will output: array(3) { [0]=> int(1) [1]=> int(2) [2]=> array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c"
oci_fetch_array() with OCI_RETURN_NULLS (2) $stid = oci_parse($conn, 'SELECT 1, null FROM dual'); oci_execute($stid); while (($row = oci_fetch_array ($stid, OCI_ASSOC+OCI_RETURN_NULLS ))) { // Fetch NULLs var_dump($row); /* The above code prints: array(2) { [1]=> string(1) "1" ["NULL"]=> NULL */?>
Example #1 oci_fetch() with defined variables <?php $conn = oci_connect('hr', 'welcome', 'localhost/xe'); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); $sql = 'SELECT location_id, city FROM locations WHERE location_id < 1200'; $stid = oci_parse($conn, $sql); // The defines MUST be done before executing oci_define_by_name($stid, 'LOCATION_ID', $locid); oci_define_by_name($stid, 'CITY', $city); oci_execute($stid); // Each fetch populates the previously defined variables with the next row's data while (oci_fetch($stid)) { echo "Location id $locid is $city<br>\n"; // Displays: // Location id 1000 is Roma // Location id 1100 is Venice oci_free_statement($stid); oci_close($conn); Associates a PHP variable with a column for query fetches using oci_fetch().
Example #2 oci_fetch() with oci_result() <?php $conn = oci_connect('hr', 'welcome', 'localhost/xe'); if (!$conn) { $e = oci_error(); trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR); $sql = 'SELECT location_id, city FROM locations WHERE location_id < 1200'; $stid = oci_parse($conn, $sql); oci_execute($stid); while (oci_fetch($stid)) { echo oci_result($stid, 'LOCATION_ID'). " is "; echo oci_result($stid, 'CITY'). "<br>\n"; // Displays: // 1000 is Roma // 1100 is Venice oci_free_statement($stid); oci_close($conn);?>
Reference http://php.net/manual/en/book.oci8.php
Call stored procedure <?php $c = oci_connect('phphol', 'welcome', '//localhost/orcl'); $s = oci_parse($c, "call myproc('mydata', 123)"); oci_execute($s); echo "Completed";?>
Call stored procedure (2) <?php $c = oci_connect('phphol', 'welcome', '//localhost/orcl'); $s = oci_parse($c, "call myproc('mydata', :bv)"); $v = 456; oci_bind_by_name($s, ":bv", $v); oci_execute($s); echo "Completed";?>
Call function <?php $c = oci_connect('phphol', 'welcome', '//localhost/orcl'); $s = oci_parse($c, "begin :bv := myfunc('mydata', 123); end;"); oci_bind_by_name($s, ":bv", $v, 10); oci_execute($s); echo $v, "<br>\n"; echo "Completed";?>