370 likes | 601 Views
Beginners Guide to Web-Enabling your Informix database. Using :. By: Peter Schmidt PRS Technologies, Inc. What is PHP ?. PHP (officially "PHP: Hypertext Preprocessor") ( Originally “Personal Home Page” ) A server-side HTML-embedded scripting language.
E N D
Beginners Guide to Web-Enabling your Informix database Using: By: Peter Schmidt PRSTechnologies, Inc.
What is PHP ? PHP (officially "PHP: Hypertext Preprocessor") • ( Originally “Personal Home Page” ) • A server-side HTML-embedded scripting language. • Writing a database-enabled web page is incredibly simple ! • PHP is in use on over 150,000 sites around the world. • Since PHP is executed on the web server, web browsers can’t see your PHP code. • PHP is very fast. • PHP is completely free(Open Source)
The following databases are currently supported: • Informix InterBase PostgreSQL • dBase FrontBase Solid • Empress mSQL Sybase • FilePro (read-only) Direct MS-SQL Unix dbm • IBM DB2 MySQL Adabas D • ODBC Velocis Ingres • Oracle (OCI7 and OCI8)
An introductory example of PHP <html> <body> <?php echo "Hi, I'm a PHP script!"; ?> </body> </html> Note that PHP code is embedded inside the HTML code. Demo 1
Switching between HTML and PHP <html> <body> Here I am in HTML! <BR> <?php echo ”Now I'm in PHP! <BR>"; ?> Back to HTML! <BR> </body> </html> HTML Note the PHP start and stop tags PHP Back to HTML PHP code is executed on the web server! Demo 2
Putting comments in PHP code <?php echo "This is a test <br>";// This is a one-line c++ style comment echo "This is a test <br>"; # This is Unix shell-style style comment /* This is the first line of a multi line comment This is the second line of comment */ ?> PHP supports 'C', 'C++' and Unix shell-style comments.
Connecting to the Informix database <?php $database = "video"; /* populate variables */ $server = "lapdog_tcp"; $login = ”username"; $password = ”password"; $dbs = $database . "@" . $server; /* concatenate */ $connect_id = ifx_pconnect($dbs,$g_login,$g_password); if (!$connect_id) { echo "Unable to connect to Informix database<br>\n"; chk_ifx_err1($connect_id); } else { echo “Informix connection successful! <br>”; } ?> This is my user defined function Demo 3
Use a tcp/ip connection to avoid error -27000 <?php $database = "video"; $server = "lapdog_tcp"; $login = ”username"; $password = ”password"; ?> Use a tcp/ip connection to the database (vs. a shared memory connection) Warning: E [SQLSTATE=IX 000 SQLCODE=-27000] in /u/www/lapdog/php_demo/php_demo4.php3 on line 40Unable to connect to Informix databaseInformix error: Cannot support multiple connections over shared memory. finderr -27000 -27000 Cannot support multiple connections over shared memory. An application cannot use the CONNECT statement to make more than one connection that uses shared-memory communication (IPC). Ensure that the application makes only one shared-memory connection at a time. If the application must use concurrent connections, the database server administrator might need to change the connection type (as specified in the nettype field of the sqlhosts file) from a shared -memory connection to a network connection. Demo 3
Persistent database connections • An SQL connection that does not close when the execution of your script ends. • When a persistent connection is requested, PHP checks if there's already an identical persistent connection (that remained open from earlier) - and if it exists, it uses it. • If it does not exist, it creates the connection. • if connection overhead is high, persistent connections help you considerably. • It may (and probably will) change the efficiency of the script, but should not change its behavior! $connect_id = ifx_pconnect();
Reporting an Informix error <?php function chk_ifx_err1($result_id) { $err_string = ifx_error($result_id); /* Note: error If 1st character of err_string is not blank */ if ($err_string[0] != ' ') { printf("Informix error: %s", ifx_errormsg()); die; } } ?> User defined function Get the error string Check for blank End program Warning: E [SQLSTATE=IX 000 SQLCODE=-952] in /u/www/lapdog/php_demo/php_demo4.php3 on line 40Unable to connect to Informix databaseInformix error: User's password is not correct for the database server. Demo 4
Selecting a count from a table <?php if ($connect_id) { $statmt_txt = "select count(*) count from vhs where type_code = 'ST1' "; $statmt_id1 = ifx_query($statmt_txt,$connect_id); // EXECUTE SQL if (!$statmt_id1) { chk_ifx_err1($statmt_id1); } // CHECK FOR ERROR $row = ifx_fetch_row($statmt_id1); // FETCH RESULT OF COUNT INTO ARRAY if (!$row) { chk_ifx_err1($statmt_id1); } // CHECK FOR ERROR $num_rows_selected = sprintf("%d",$row[count]); // FORMAT COUNT echo "<html>"; echo "$num_rows_selected rows selected <BR>"; // DISPLAY RESULT IN HTML echo "</html>"; } ?> Demo 5
Selecting rows Output to a HTML table. Use display label for clarity <?php $statmt_txt = "select tape_num Tape_Number ,title from vhs where type_code = 'ST1' order by title"; $statmt_id = ifx_prepare($statmt_txt,$connect_id,IFX_SCROLL); // PREPARE if (!$statmt_id) { chk_ifx_err1($statmt_id); } // CHECK FOR ERROR $ret_val = ifx_do($statmt_id); // EXECUTE PREPARED STATEMENT if (!$ret_val) { chk_ifx_err1($statmt_id); } // CHECK FOR ERROR ifx_htmltbl_result ($statmt_id, "BORDER='1' CELLSPACING=0 CELLPADDING=2 BGCOLOR='cornsilk' ALIGN=center"); ?> See output on next slide Demo 6
Selecting rows using a cursorslide 1 of 2 <?php $statmt_txt = "select * from vhs where type_code = 'ST1' order by title"; $statmt_id = ifx_prepare($statmt_txt,$connect_id,IFX_SCROLL); // PREPARE if (!$statmt_id) { chk_ifx_err1($statmt_id); } // CHECK FOR ERROR $ret_val = ifx_do($statmt_id); // EXECUTE PREPARED STATEMENT if (!$ret_val) { chk_ifx_err1($statmt_id); } // CHECK FOR ERROR echo <table border=5 cellspacing=0 cellpadding=5 bgcolor=cornsilk>”; // HTML --- Continued on next slide --- Demo 7
Selecting rows using a cursorslide 2 of 2 while ($row = ifx_fetch_row($statmt_id, ”NEXT” )) { $serial_id = $row[serial_id]; $type_code = chop($row[type_code]); $tape_num = $row[tape_num]; $title = chop($row[title]); $hours = $row[hours]; $comment = chop($row[comment]); echo "<tr>\n"; echo "<td><center>$serial_id</td>"; echo "<td><center>$type_code</td>"; echo "<td><center>$tape_num</td>"; echo "<td>$title</td>"; echo "<td>$hours</td>"; echo "<td>$comment</td>"; echo "<td>"; } echo "</table>"; ?> Create an “associative” array named “row”. Populate fields from associative array Use column names to identify fields. Use “chop” to remove trailing blanks if desired. --- Continued from previous slide --- Demo 7
Can’t use placeholders <?php $statmt_txt = "select * from vhs where type_code = ? order by title"; ?> Invalid statement “placeholders” are currently not supported, but you can do this instead. <?php $my_code = “ST1”; $statmt_txt = "select * from vhs where type_code = ’ $my_code ' order by title"; ?> valid statement Demo 7
Variables from outside PHPHTML Forms (GET and POST) • <html> • <form action="video_db2.php3" method="post"> • Tape Number: • <input type="text" name=”tape_num"> • <input type="submit"> • </form> • </html> <?php echo “The tape number is: $tape_num <br>”; ?>
Inserting a row <?php if ($connect_id) { $sql_txt = "insert into vhs (serial_id, type_code, tape_num, title) values "; $sql_txt .= ” ($serial_id, \”$type_code\”, $tape_num, \”$title\”) "; $ret_val = ifx_query($sql_txt,$connect_id); // INSERT RECORD if (!$ret_val) { chk_ifx_err1($statmt_id); } // CHECK FOR ERROR } ?>
Creating an associative array <?php $input_array = array ( "type_code" => $type_code, "tape_num" => $tape_num, "title" => $title, "hours" => $hours, "comment" => $comment ); ?> An associative array is an array which uses a string (instead of a number) to locate an element within the array.
Stepping through an associative array <?php $type_code_array = array ( "MOVIE" => "Movies", "DS9" => "Deep Space 9", "ST1" => "Star Trek (Original)", "ST2" => "Star Trek the Next Generation", "VOY" => "Star Trek Voyager", "HOME" => "Home Movies", "MAX" => "Max Headroom", "OTHER" => "Other"); echo “<select name='type_code'> <option value=' '>Choose Type of Video”; while (list($key,$value) = each($type_code_array)) { if ($key == $type_code) { echo "<option value='$key' selected>$value\n"; } else { echo "<option value='$key'>$value\n"; } } echo "</select>”; ?> Create an associative array of type codes Step through the array
Searching a string for a patternPerl-compatible Regular Expression functions <?php if (preg_match("/\|/",$query_string)) { // Search $query_string for a pipe … your code here … // Do this if pipe was found } ?> Search a string for the presence of a pipe symbol • Perform a regular expression match on a string. • Return (true) if match was positive. • The syntax for the pattern search closely resembles Perl.
Creating an array from a pipe-delimited stringPerl-compatible Regular Expression functions <?php $query_string = “ 123 | 456 | 789 “; $pipe_list = preg_split("/\|/",$query_string); // Create an array of strings while ( list($key,$value) = each($pipe_list)) { // for each element in the array... … your code here … ?> Create an array from pipe demimited string • Split string by a regular expression. • Returns an array containing substrings. • The syntax closely resembles Perl.
Call a functionpassing and returning variables Call a function Return multiple values <?php list($statmt_id,$cnt_found) = cnt_and_query("vhs",$where_clause); ?> Start function <?php function cnt_and_query ($table_name,$where_clause) { … more php code here … return array ($statmt_id2,$num_rows_selected); } ?> End function
Breaking your program up into logical modules • <?php • require("common.inc"); • require("menu.inc"); • require("display_form.inc"); • require("query.inc"); • require("add.inc"); • require("modify.inc"); • ?> • Use include() and require() to reference program modules. • With include, statements are re-evaluated each time - almost like calling a function. • With require, statements are replaced by the required file when it is first encountered. Good for user defined functions.
Scope of variables • Scope spans the entire module, including “included” and “required” files. • Variables defined outside of a function, can be referenced inside the function, if defined as globally available. • Any variable defined inside a function can only be used within that function, unless specifically defined as globally available in that function. • Globals can also be accessed via the special “GLOBALS” array. • See “demo8” for examples. global $variable5; $dbs = $GLOBALS["DATABASE"]; Demo 8
Installing PHP • PHP (without Informix) is usually available on most Linux and Apache installations using ODBC. • Configuring PHP to use Informix is NOT a cakewalk. • Requires use of ESQL/C libraries to compile (free w/Client SDK). • Don’t reuse previous versions of Apache httpd.conf if you are upgrading Apache from a earlier version. • If you want the database to reside in a machine separate from the web server, you will need Informix Client SDK or I-Connect on the web server. • If you're using I-Connect on the deployment machine, you must compile on a machine with ClientSDK installed. And CSDK and I-Connect need to be in the same directory on the two different machines.
Installing PHP with ApacheOverview • Aquire or download the software. • Unpack Apache and PHP tar-balls. • Set your Informix environmentals. • Pre-Configure Apache. • Configure, compile and install PHP • Configure, compile and install Apache. • Update Apache startup script with Informix environment • Update Apache httpd.conf • Re-start Apache web server. • Test.
Installing PHP with ApacheAquire or download the software • Go to http://www.php.net • Click on: downloads • Click on: Complete Source Code • PHP 4.0.2 - 29 August 2000 • Go to http://www.apache.org • Click on apache server. • Click on download. • Click on apache_1.3.14.tar.gz
Installing PHP with ApacheUnpack Apache and PHP tar-balls cd /usr/local gunzip apache_1.3.14.tar.gz tar xvf apache_1.3.14.tar gunzip php-4.0.2.tar.gz tar xvf php-4.0.2.tar
Installing PHP with ApacheSet your Informix environmentals INFORMIXDIR=/opt/informix INFORMIXSERVER=myserver_shm ONCONFIG=onconfig.myserver PATH=$PATH:$INFORMIXDIR/bin LD_LIBRARY_PATH=$INFORMIXDIR/lib:$INFORMIXDIR/lib/esql export INFORMIXDIR INFORMIXSERVER ONCONFIG LD_LIBRARY_PATH Optional Don’t forget this one!
Installing PHP with ApachePre-Configure Apache cd apache_1.3.14 ./configure --prefix=/usr/local/apache cd ..
Installing PHP with ApacheConfigure, compile and install PHP cd php-4.0.2 ./configure --with-apache=../apache_1.3.14 --with-informix=$INFORMIXDIR make make install cd ..
Installing PHP with ApacheConfigure, compile and install Apache cd apache_1.3.14 ./configure --prefix=/usr/local/apache \ --enable-module=rewrite \ --enable-shared=rewrite \ --enable-module=most \ --enable-shared=max \ --enable-module=so \ --activate-module=src/modules/php4/libphp4.a \ --enable-module=php4 make make install cd ..
Installing PHP with ApacheUpdate Apache startup script with Informix environment cd /etc/rc.d/init.d • On Linux, update the apache start-up script “httpd” to include the Informix environment. • Or use apachectl. (Varies by platform.)
Installing PHP with ApacheUpdate Apache httpd.conf cd /usr/local/apache/conf • Update the apache configuration file “httpd.conf”. • If you have upgraded Apache from a different version, do not use the previous “httpd.conf” file as a basis for the new one. AddModule mod_php4.c <IfModule mod_php4.c> AddType application/x-httpd-php4 .php4 AddType application/x-httpd-php4-source .phps </IfModule>
Installing PHP with ApacheRe-start Apache web server On Linux: cd /etc/rc.d/init.d ./httpd restart Also, you can use: apachectl apachectl configtest
PHP Resources PRSTechnologies, Inc. • http://www.prstech.com(downloads section) • This presentation • Entire source of videotape demo • Source of all examples • Tech-Notes article on PHP by Mario Estrada • Monterey Peninsula Ski Club - Cabin Reservation System by Jonathan Leffler • http://www.php.net • http://www.zend.com