mirror of
https://github.com/php/web-php.git
synced 2026-03-29 18:52:08 +02:00
1273 lines
54 KiB
HTML
1273 lines
54 KiB
HTML
<HTML>
|
|
<HEAD>
|
|
<TITLE>PHP Frequently Asked Questions</TITLE>
|
|
<STYLE type="text/css">
|
|
BODY {background: #FFFFFF;}
|
|
H1,H2,H3 {color: #5B69A6;}
|
|
</STYLE>
|
|
</HEAD>
|
|
|
|
<BODY>
|
|
|
|
<H1>PHP Frequently Asked Questions</H1>
|
|
|
|
<!-- The website should stop chopping. -->
|
|
|
|
<P>
|
|
This is a list of Frequently Asked Questions about PHP and
|
|
their answers. If you have suggestions or additions, send them to
|
|
<A HREF="mailto:php3@lists.php.net">php3@lists.php.net</A>.
|
|
<P>
|
|
<HR noshade>
|
|
|
|
<DL>
|
|
<DT><a HREF="#1">1. General Information</A></DT>
|
|
<DT><a HREF="#2">2. Obtaining PHP</A></DT>
|
|
<DT><a HREF="#3">3. Installation</A></DT>
|
|
<DT><a HREF="#4">4. Build Problems</A></DT>
|
|
<DT><a HREF="#5">5. Using PHP</A></DT>
|
|
<DT><a HREF="#6">6. New Features</A></DT>
|
|
<DT><a HREF="#7">7. Common Problems</A></DT>
|
|
<DT><a HREF="#8">8. Migrating from PHP2 to PHP3</A></DT>
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<A NAME="1">
|
|
<H2>1. General Information</H2>
|
|
</A>
|
|
|
|
<DL>
|
|
<DT><B>
|
|
<a name="1.1">1.1</a> What is PHP?
|
|
</B></DT>
|
|
<DD>
|
|
From the <A href="http://www.php.net/manual/">manual</A>:
|
|
|
|
<BLOCKQUOTE>
|
|
<P>PHP Version 3.0 is an HTML-embedded scripting
|
|
language. Much of its syntax is borrowed from C, Java and Perl with a
|
|
couple of unique PHP-specific features thrown in. The goal of the language
|
|
is to allow web developers to write dynamically generated pages quickly.
|
|
</BLOCKQUOTE>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.2">1.2</a> What is its relation to PHP/FI?
|
|
</B></DT>
|
|
<DD>
|
|
PHP is the successor to PHP/FI 2.0.
|
|
<P>
|
|
</DD>
|
|
<DT><B>
|
|
<a name="1.3">1.3</a> Can I run both PHP/FI 2.0 and PHP at the same time?
|
|
</B></DT>
|
|
<DD>
|
|
Yes, PHP was written so as to not interfere with an existing PHP/FI 2 installation.
|
|
Instructions for building Apache 1.3.0 with both PHP/FI 2 and PHP modules can be
|
|
found <a href="php2.php3">HERE</a>. A different spin on this is
|
|
<a href="http://www.jeo.net/php/both.htm">HERE</a>, although the first step where
|
|
the PHP2 regex code is substituted with the PHP regex code seems redundant. The
|
|
two regex dirs are pretty much identical.
|
|
<P>
|
|
|
|
<DT><B>
|
|
<a name="1.4">1.4</a> What are the differences between PHP and PHP/FI 2.0?
|
|
</B></DT>
|
|
<DD>
|
|
For a complete list of the changes, read the <A
|
|
href="changes.php3">CHANGES</A> file included in the PHP
|
|
distribution. Some highlights:
|
|
|
|
<UL>
|
|
<LI>All-new parser.
|
|
<LI>Persistent database connections.
|
|
<LI>A native Windows95/NT port.
|
|
<LI>IMAP, SNMP, and LDAP extensions.
|
|
</UL>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.5">1.5</a> I heard it's possible to access Microsoft SQL Server from PHP. How?
|
|
</B></DT>
|
|
<DD>
|
|
On Windows 95/NT machines, you can simply use the included ODBC support
|
|
and the correct ODBC driver.
|
|
|
|
<P>A copy of step-by-step ODBC setup can be found <A HREF="/manual/config-odbc.html">here</A>.
|
|
|
|
<P>On Unix machines, you can use the Sybase-CT driver
|
|
to access Microsoft SQL Servers because they are (at
|
|
least mostly) protocol-compatible. Sybase has made a <A
|
|
href="/extra/ctlib-linux-elf.tar.gz">free version of the necessary
|
|
libraries for Linux systems</A>. For other Unix operating systems,
|
|
you need to contact Sybase for the correct libraries. Also see
|
|
the answer to the next question - 1.6.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.6">1.6</a> Can I access Microsoft Access databases?
|
|
</B></DT>
|
|
<DD>
|
|
Yes. You already have all the tools you need if you are running
|
|
entirely under Windows 95/98 or NT, where you can use ODBC and Microsoft's
|
|
ODBC drivers for Microsoft Access databases.<P>
|
|
If you are running PHP on a Unix box and want to talk to MS-Access on
|
|
a Windows box you will need Unix ODBC drivers.
|
|
<A href="http://www.openlinksw.com/">OpenLink Software</A> has Unix-based
|
|
ODBC drivers that can do this. There is a free pilot program where you
|
|
can download an evaluation copy that doesn't expire and prices start at
|
|
$675 for the commercial supported version.
|
|
|
|
<P>Another alternative is to use an SQL server that has
|
|
Windows ODBC drivers and use that to store the data, which you can
|
|
then access from Microsoft Access (using ODBC) and PHP (using the
|
|
built-in drivers), or to use an intermediary file format that Access
|
|
and PHP both understand, such as flat-files or dBase databases.
|
|
On this point Tim Hayes from OpenLink software writes:
|
|
<blockquote><blockquote>
|
|
Using another database as an intermediary is not a good idea, when you can
|
|
use ODBC from PHP straight to your database - i.e. with OpenLink's drivers. If
|
|
you do need to use an intermediary file format, OpenLink have now released
|
|
Virtuoso (a virtual database engine) for NT, Linux and other unix platforms.
|
|
Please visit our
|
|
<A href="http://www.openlinksw.com/">website</A> for a free download.
|
|
</blockquote></blockquote>
|
|
|
|
<P>One option that has proven successful is to use MySQL and its
|
|
MyODBC drivers on Windows and synchronizing the databases. Steve Lawrence
|
|
writes:
|
|
<blockquote><blockquote>
|
|
<ol>
|
|
<li> Install MySQL on your platform according to instructions with MySQL.
|
|
Latest available from www.mysql.org (get it from your mirror!). No special
|
|
configuration required except when you set up a database, and configure the
|
|
user account, you should put % in the host field, or the host name of the
|
|
Windows computer you wish to access MySQL with. Make a note of your server
|
|
name, username, and password.<P>
|
|
|
|
<li> Download the MyODBC for Windows driver from the MySQL site. Latest
|
|
release is myodbc-2_50_19-win95.zip (NT available too, as well as source
|
|
code). Install it on your Windows machine. You can test the operation with
|
|
the utilities included with this program.<P>
|
|
|
|
<li> Create a user or system dsn in your ODBC administrator, located in the
|
|
control panel. Make up a dsn name, enter your hostname, user name, password,
|
|
port, etc for you MySQL database configured in step 1.<P>
|
|
|
|
<li> Install Access with a full install, this makes sure you get the proper
|
|
add-ins.. at the least you will need ODBC support and the linked table
|
|
manager.<P>
|
|
|
|
<li> Now the fun part! Create a new access database. In the table window right
|
|
click and select Link Tables, or under the file menu option, select Get
|
|
External Data and then Link Tables. When the file browser box comes up,
|
|
select files of type: ODBC. Select System dsn and the name of your dsn
|
|
created in step 3. Select the table to link, press ok, and presto! you can
|
|
now open the table and add/delete/edit data on your MySQL server! You can
|
|
also build queries, import/export tables to MySQL, build forms and reports,
|
|
etc.<P>
|
|
</ol>
|
|
<b>Tips and Tricks:</b>
|
|
- You can construct your tables in access and export them to MySQL, then
|
|
link them back in. That makes table creation quick.<br>
|
|
- When creating tables in access, you must have a primary key defined in
|
|
order to have write access to the table in access. Make sure you create a
|
|
primary key in MySQL before linking in access.<br>
|
|
- If you change a table in MySQL, you have to re-link it in access. Go to
|
|
tools>add-ins>linked table manager, cruise to your ODBC DSN, and select the
|
|
table to re-link from there. you can also move your dsn source around there,
|
|
just hit the always prompt for new location checkbox before pressing ok.
|
|
</blockquote></blockquote>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.7">1.7</a> Is there a PHP mailing list?
|
|
</B></DT>
|
|
<DD>
|
|
Of course! To subscribe, send mail to
|
|
<CODE>php3-subscribe@lists.php.net</CODE>. You don't need to include
|
|
anything special in the subject or body of the message.
|
|
|
|
<P>To unsubscribe, send mail to <CODE>php3-unsubscribe@lists.php.net</CODE>.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.8">1.8</a> Help! I can't seem to subscribe to the mailing list!
|
|
</B></DT>
|
|
<DT><B>
|
|
Help! I can't seem to unsubscribe from the mailing list!
|
|
</B></DT>
|
|
<DD>
|
|
If you have problems subscribing to or unsubscribing from the
|
|
PHP mailng list, it may be because the mailing list software
|
|
can't figure out the correct mailing address to use. If
|
|
your email address was <CODE>joeblow@example.com</CODE>,
|
|
you can send your subscription request to
|
|
<CODE>php3-subscribe-joeblow=example.com@lists.php.net</CODE>,
|
|
or your unsubscription request to
|
|
<CODE>php3-unsubscribe-joeblow=example.com@lists.php.net</CODE>.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.9">1.9</a> Is there an archive of the mailing list anywhere?
|
|
</B></DT>
|
|
<DD>
|
|
Yes, you will find a list of archive sites on the <a href="/support.php3">Support</a>
|
|
page.<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.10">1.10</a> How did you do those pop-out windows for the Search and Mirror buttons?
|
|
</B></DT>
|
|
<DD>
|
|
Our site designer, Colin Viebrock (<A href="mailto:cmv@privateworld.com">cmv@privateworld.com</A>), says:
|
|
|
|
<BLOCKQUOTE>
|
|
<P>Those fancy pop-out layers are done with Dynamic HTML (DHTML), Cascading Style Sheets (CSS) and Javascript (version 1.2).<P>
|
|
There are plenty of references on the web about DHTML and CSS, including:
|
|
<P><UL>
|
|
<LI>CSS Level 1 Spec: <A HREF="http://www.w3.org/TR/REC-CSS1">www.w3.org/TR/REC-CSS1</A>
|
|
<LI>Macromedia's DHTML Zone: <A HREF="http://www.dhtmlzone.com/index.html">www.dhtmlzone.com/index.html</A>
|
|
<LI>Webreference's DHTML Lab: <A HREF="http://www.webreference.com/dhtml/">www.webreference.com/dhtml/</A>
|
|
<LI>Guide to Cascading Style Sheets: <A HREF="http://www.htmlhelp.com/reference/css/">www.htmlhelp.com/reference/css/</A>
|
|
<LI>Dynamic Duo - Cross-Browser DHTML: <A HREF="http://www.dansteinman.com/dynduo/">www.dansteinman.com/dynduo/</A>
|
|
<LI>Netscape's Guide to JS 1.2: <A HREF="http://developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm">developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm</A>
|
|
</UL>
|
|
<P>But your best source of information is to view the source code to the pages on the PHP site.
|
|
To see the actual DHTML/Javascript code, use your browser's "View Source" function. To see how this code was
|
|
generated dynamically using PHP, click on the "Source" button in the upper-right corner of any PHP page. You
|
|
will probably also want to view the source of the "shared.inc" file - there is a link to it at the bottom of every
|
|
source page.
|
|
</BLOCKQUOTE><P>
|
|
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="1.11">1.11</a> Can I access Empress RDBMS databases?
|
|
</B></DT>
|
|
<DD>
|
|
Yes. PHP 3.0.6 and Empress RDBMS v8.10 and higher are compatible.
|
|
<P>
|
|
You already have all the tools you need if you are running entirely under
|
|
Windows 95/98 or NT, where you can use ODBC and the Empress ODBC driver for
|
|
Windows.
|
|
<P>
|
|
If you are running PHP on a Unix box and want to access Empress databases, you
|
|
can link
|
|
the Empress ODBC client driver directly into the PHP unified ODBC API.
|
|
<BR>
|
|
<I>Note that does NOT make PHP an ODBC client. The unified ODBC interface
|
|
simplies uses the ODBC application program interface (API).</I>
|
|
<P>
|
|
Because Empress uses the PHP unified ODBC interface it has very little explicit
|
|
Empress specific syntax. It is of course possible to use Empress specific SQL
|
|
in the SQL statements themselves, but this does not affect the interface.
|
|
It is a good general policy to stick to ANSI standard SQL whenever
|
|
possible.
|
|
|
|
<P>
|
|
<DL>
|
|
<DT><B>Empress Specifics: </B> The only item which is specific to Empress in
|
|
PHP is that there are two methods for specifying the DNS in the
|
|
<code>odbc_connect ()</code> and <code>odbc_pconnect ()</code> functions.
|
|
The connect syntax is:
|
|
<DL>
|
|
<DT><code>odbc_connect (dsn, user_id, password)</code>
|
|
<DT><code>odbc_pconnect (dsn, user_id, password)</code>
|
|
</DL>
|
|
For Empress dsn can be specified as either:
|
|
<DL>
|
|
<DT>Data source name
|
|
<DD>This is the logical database name specified in the ODBC.INI file.
|
|
|
|
<DT>A full connection string, as specified in the ODBC standard.
|
|
<DD>
|
|
eg<BR>
|
|
dsn="DATABASE=<i>db_name</i>;SERVER=<i>server_name</i>;PORT=<i>server_port</i>"
|
|
<P>
|
|
<i>Note that there are other options for this string. But the three shown
|
|
above are the most important for use with PHP.</i>
|
|
</DL>
|
|
Which of these you use is up to you. There are advantages and disadvantages to both.
|
|
Using the full connection string means that you do NOT require an ODBC.INI file
|
|
to access the database. However, if you move the datasource, or change the port on
|
|
which the RDBMS server listens, you will have to modify every call to the
|
|
odbc_connect/pconnect function.
|
|
<BR>The choice is yours...
|
|
<P>
|
|
<DT><B>Empress Installation: </B>
|
|
In order to add the Empress interface to PHP you require an Empress RDBMS with
|
|
the Empress Connectivity option. If your PHP installation is on the same
|
|
platform as the RDBMS then setting EMPRESS_PATH to the installation directory
|
|
will automatically locate the Empress ODBC client driver. However, if the
|
|
PHP installation is on a separate platform from the RDBMS you will also
|
|
require an ODBC client on that platform, and you will need to specify the
|
|
location of the driver when configuring the PHP installation.
|
|
</DL>
|
|
|
|
</DD>
|
|
|
|
</DL>
|
|
|
|
</BODY>
|
|
</HTML>
|
|
|
|
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<A NAME="2">
|
|
<H2>2. Obtaining PHP</H2>
|
|
</A>
|
|
|
|
<DL>
|
|
<DT><B>
|
|
<a name="2.1">2.1</a> Where can I obtain PHP?
|
|
</B></DT>
|
|
<DD>
|
|
You can download PHP from any of the members of the
|
|
PHP network of sites. These can be found at <A
|
|
href="http://www.php.net/">http://www.php.net/</A>.
|
|
You can also use anonymous CVS to get the absolute latest
|
|
version of the source. For more information, go to <A
|
|
href="http://cvs.php.net">http://cvs.php.net</A>.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="2.2">2.2</a> Are pre-compiled binary versions available?
|
|
</B></DT>
|
|
<DD>
|
|
Yes, although they are not always up to date. The Windows binary is
|
|
generally current, but the Unix binaries lag behind and are only available
|
|
for certain platforms. All download are available in the <a href="/downloads.php3">
|
|
Downloads</a> section.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="2.3">2.3</a> Where can I get libraries needed to compile some of the optional
|
|
PHP extensions?
|
|
</B></DT>
|
|
<DD>
|
|
<B>Note:</B> Those marked with * are not thread-safe libraries, and
|
|
should not be used with PHP as a server module in the multi-threaded
|
|
Windows web servers (IIS, Netscape). This does not matter in Unix
|
|
environments, yet.
|
|
|
|
<UL>
|
|
<LI>LDAP (unix): <a href="ftp://ftp.openldap.org/pub/openldap/openldap-stable.tgz">ftp://ftp.openldap.org/pub/openldap/openldap-stable.tgz</a>
|
|
<LI>LDAP* (unix): <A href="ftp://terminator.rs.itd.umich.edu/ldap/ldap-3.3.tar.Z">ftp://terminator.rs.itd.umich.edu/ldap/ldap-3.3.tar.Z</A>
|
|
<LI>LDAP (unix/win): <A HREF="http://developer.netscape.com/tech/directory/downloads.html" TARGET="_top">Netscape Directory (LDAP) SDK 1.1</A>
|
|
There is also a free LDAP server at: <A href="ftp://ftp.critical-angle.com/pub/cai/slapd/">ftp://ftp.critical-angle.com/pub/cai/slapd/</A>.
|
|
<LI>Berkeley DB2 (Unix/Win): <A href="http://www.sleepycat.com/">http://www.sleepycat.com/</A>
|
|
<LI>SNMP* (Unix): <A href="http://www.ece.ucdavis.edu/ucd-snmp/">http://www.ece.ucdavis.edu/ucd-snmp/</A> (Note: PHP uses the native SNMP interface in Windows.)
|
|
<LI>GD* (Unix/Win): <A href="http://www.boutell.com/gd/#buildgd">http://www.boutell.com/gd/#buildgd</A>
|
|
<LI>mSQL* (Unix): <A href="http://www.hughes.com.au/">http://www.hughes.com.au/</A>
|
|
<LI>mSQL* (Win) : <A HREF="http://blnet.com/msqlpc/">MSQL PC Home Page</a>
|
|
<LI>MySQL (Unix): <A href="http://www.mysql.com/">http://www.mysql.com/</A>
|
|
<LI>IMAP* (Win/Unix): <A HREF="ftp://ftp.cac.washington.edu/imap/old/imap-4.5.tar.Z">ftp://ftp.cac.washington.edu/imap/old/imap-4.5.tar.Z</A>
|
|
<LI>Sybase-CT* (Linux, libc5): <A href="/extra/ctlib-linux-elf.tar.gz">Available locally</A>
|
|
<LI>FreeType (libttf): <A HREF="http://www.freetype.org/">http://www.freetype.org/</A>
|
|
<LI>ZLib (Unix/Win32): <A HREF="http://www.cdrom.com/pub/infozip/zlib/">http://www.cdrom.com/pub/infozip/zlib/</a>
|
|
<LI>expat XML parser (Unix/Win32): <A HREF="http://www.jclark.com/xml/expat.html">http://www.jclark.com/xml/expat.html</a>
|
|
<LI>PDFLib: <A HREF="http://www.ifconnection.de/~tm/">http://www.ifconnection.de/~tm/</A>
|
|
<LI>mcrypt: <a href="ftp://argeas.cs-net.gr/pub/unix/mcrypt/">ftp://argeas.cs-net.gr/pub/unix/mcrypt/</a>
|
|
<LI>mhash: <a href="http://sasweb.de/mhash/">http://sasweb.de/mhash/</a>
|
|
<LI>t1lib: <a href="http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html">http://www.neuroinformatik.ruhr-uni-bochum.de/ini/PEOPLE/rmz/t1lib/t1lib.html</a>
|
|
<LI>dmalloc: <a href="http://www.dmalloc.com/">http://www.dmalloc.com/</a>
|
|
<LI>aspell: <a href="http://metalab.unc.edu/kevina/aspell/aspell-.26.2.tar.gz">http://metalab.unc.edu/kevina/aspell/aspell-.26.2.tar.gz</a>
|
|
</UL>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="2.4">2.4</a> How do I get these libraries to work?
|
|
</B></DT>
|
|
<DD>
|
|
You will need to follow instructions provided with the library. Some of
|
|
these libraries are detected automatically when you run the 'configure'
|
|
script of PHP (such as the GD library), and others you will have to
|
|
enable using '--with-EXTENSION' options to 'configure'. Run 'configure
|
|
--help' for a listing of these.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="2.5">2.5</a> I got the latest version of the PHP source code from the CVS
|
|
repository on my Windows 95/NT machine, what do I need to compile it?
|
|
</B></DT>
|
|
<DD>
|
|
First, you will need Microsoft Visual C++ v6 (v5 may do
|
|
it also, but we do it with v6), and you will need to <A
|
|
href="http://www.php.net/extra/win32build.zip">download the
|
|
support files</A>. You will need to unzip this file (which
|
|
has subdirectories, so make sure your unzip program keeps them)
|
|
into the win32 subdirectory of the source distribution.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="2.6">2.6</a> Where do I find the Browser Capabilities File?
|
|
</B></DT>
|
|
<DD>
|
|
You can find PHP's own browscap.ini file at <a href="http://php.netvision.net.il/browscap/">http://php.netvision.net.il/browscap/</a>.
|
|
There is also another browscap.ini file at <a href="http://www.cyscape.com/asp/browscap/">http://www.cyscape.com/asp/browscap/</a>.
|
|
<P>
|
|
</DD>
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<A NAME="3">
|
|
<H2>3. Installation</H2>
|
|
</A>
|
|
|
|
<P>To install PHP, follow the instructions in the <A
|
|
href="http://cvs.php.net/cvsweb.cgi/INSTALL?rev=HEAD">INSTALL</A>
|
|
file located in the distribution. Windows
|
|
95 and NT users should also read the <A
|
|
href="http://cvs.php.net/cvsweb.cgi/README.WIN32?rev=HEAD">README.WIN32</A>
|
|
file. There are also some helpful hints for Windows users
|
|
<a href="/manual/config-apache-nt.html">here</A>.
|
|
<P>If you are trying to install PHP for use with Netscape's web server on
|
|
Unix see: <a href="http://www.webgenx.com/Kwazy/phpunix.html">http://www.webgenx.com/Kwazy/phpunix.html</a>
|
|
|
|
<DL>
|
|
<DT><B>
|
|
<a name="3.1">3.1</a> Where should my <i>php3.ini</i> file be located?
|
|
</B></DT>
|
|
<DD>
|
|
By default on UNIX it should be in <i>/usr/local/lib</i>. Most people will want
|
|
to change this at compile-time with the --with-config-file-path flag. You would, for
|
|
example, set it to something like:
|
|
<PRE>
|
|
--with-config-file-path=/etc
|
|
</PRE>
|
|
And then you would copy <i>php3.ini-dist</i> from the distribution to <i>/etc/php3.ini</i> and
|
|
edit it to make any local changes you want.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="3.2">3.2</a> I installed PHP using RPMS, but Apache isn't processing the PHP pages! What's going on here?
|
|
</B></DT>
|
|
<DD>
|
|
<UL>
|
|
<LI>Assuming you installed Apache PHP completely with RPMS, you need to uncomment or add some or all of the following lines in your http.conf file:<BR>
|
|
<CODE># Extra Modules</CODE><BR>
|
|
<CODE>AddModule mod_php.c</CODE><BR>
|
|
<CODE>AddModule mod_php3.c</CODE><BR>
|
|
<CODE>AddModule mod_perl.c</CODE><BR>
|
|
|
|
<CODE># Extra Modules</CODE><BR>
|
|
<CODE>LoadModule php_module modules/mod_php.so</CODE><BR>
|
|
<CODE>LoadModule php3_module modules/libphp3.so</CODE><BR>
|
|
<CODE>LoadModule perl_module modules/libperl.so</CODE><BR>
|
|
|
|
<LI>And add:<BR>
|
|
<CODE>AddType application/x-httpd-php3 .php3</CODE><BR>
|
|
To the global properties, or to the properties of the VirtualDomain you want to have PHP support added to.
|
|
</UL><P></DD>
|
|
|
|
<DT><B>
|
|
<a name="3.3">3.3</a> I installed PHP using RPMS, but it doesn't compile with the database support I need! What's going on here?
|
|
</B></DT>
|
|
<DD>
|
|
Due to the way PHP is currently built, it is not easy to build a complete flexible PHP RPM. This
|
|
issue will be addressed in PHP4. For PHP, we currently suggest you use the mechanism described
|
|
in the INSTALL.REDHAT file in the PHP distribution. If you insist on using an RPM version of PHP,
|
|
read on...<BR>
|
|
Currently the RPM packagers are setting up the RPMS to install without database support to simplify installations AND because RPMS use /usr/ instead of the standard /usr/local/ directory for files.
|
|
You need to tell the RPM spec file which databases to support and the location of the <EM>top-level</EM> of your database server.<BR>
|
|
This example will explain the process of adding support for the popular MySQL database server, using the mod installation for Apache.<BR>
|
|
Of course all of this information can be adjusted for any database server that PHP supports.
|
|
I will assume you installed MySQL and Apache completely with RPMS for this example as well.
|
|
|
|
<UL>
|
|
<LI>First remove mod_php3<BR>
|
|
<CODE>rpm -e mod_php3</CODE><BR>
|
|
|
|
<LI>Then get the source rpm and INSTALL it, NOT --rebuild<BR>
|
|
<CODE>rpm -Uvh mod_php3-3.0.5-2.src.rpm</CODE><BR>
|
|
<LI>Then edit the /usr/src/redhat/SPECS/mod_php3.spec file<BR>
|
|
In the %build section add the database support you want, and the path.<BR>
|
|
For MySQL you would add <CODE>--with-mysql=/usr \</CODE><BR>
|
|
The %build section will look something like this:<BR>
|
|
|
|
<CODE>
|
|
./configure --prefix=/usr \<BR>
|
|
--with-apxs=/usr/sbin/apxs \<BR>
|
|
--with-config-file-path=/usr/lib \<BR>
|
|
--enable-debug=no \<BR>
|
|
--enable-safe-mode \<BR>
|
|
--with-exec-dir=/usr/bin \<BR>
|
|
--with-mysql=/usr \<BR>
|
|
--with-system-regex<BR>
|
|
</CODE>
|
|
<LI>Once this modification is made then build the binary rpm as follows:<BR>
|
|
<CODE>rpm -bb /usr/src/redhat/SPECS/mod_php3.spec </CODE><BR>
|
|
<LI>Then install the rpm<BR>
|
|
<CODE>rpm -ivh /usr/src/redhat/RPMS/i386/mod_php3-3.0.5-2.i386.rpm</CODE><BR>
|
|
</UL>
|
|
Make sure you restart Apache, and you now have PHP with MySQL support using RPM's.
|
|
Note that it is probably much easier to just build from the distribution tarball of
|
|
PHP and follow the instructions in INSTALL.REDHAT found in that distribution.
|
|
<P>
|
|
</DD>
|
|
</DL>
|
|
<HR noshade>
|
|
|
|
<A NAME="4">
|
|
<H2>4. Build Problems</H2>
|
|
</A>
|
|
|
|
<DL>
|
|
<DT><B>
|
|
<a name="4.1">4.1</a> I got the latest version of PHP using the anonymous CVS service,
|
|
but there's no configure script!
|
|
</B></DT>
|
|
<DD>
|
|
You have to have the GNU autoconf package installed so you can
|
|
generate the configure script from configure.in. Just run
|
|
<CODE>make -f build.mk</CODE> in the top-level directory after getting
|
|
the sources from the CVS server. (Also, unless you run configure
|
|
with the <CODE>--enable-maintainer-mode</CODE> option, the
|
|
configure script will not automatically get rebuilt when the
|
|
configure.in file is updated, so you should make sure to do that
|
|
manually when you notice configure.in has changed. One symptom
|
|
of this is finding things like @VARIABLE@ in your Makefile after
|
|
configure or config.status is run.)
|
|
<P>
|
|
</DD>
|
|
<DT><B>
|
|
<a name="4.2">4.2</a> I'm having problems configuring PHP to work with Apache. It says
|
|
it can't find httpd.h, but it's right where I said it is!
|
|
</B></DT>
|
|
<DD>
|
|
You need to tell the configure/setup script the location of the
|
|
<EM>top-level</EM> of your Apache source tree. This means that
|
|
you want to specify '<CODE>--with-apache=/path/to/apache</CODE>'
|
|
and <EM>not</EM> '<CODE>--with-apache=/path/to/apache/src</CODE>'.
|
|
<P>
|
|
</DD>
|
|
<DT><B>
|
|
<a name="4.3">4.3</a> When I run configure, it says that it can't find the include files or
|
|
library for GD, gdbm, or some other package!
|
|
</B></DT>
|
|
<DD>
|
|
You can make the configure script looks for header files and libraries
|
|
in non-standard locations by specifying additional flags to pass to
|
|
the C preprocessor and linker, such as:
|
|
<FONT FACE="monospaced"><PRE>
|
|
CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
|
|
</PRE></FONT>
|
|
If you're using a csh-variant for your login shell (why?), it would be:
|
|
<FONT FACE="monospaced"><PRE>
|
|
env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
|
|
</PRE></FONT>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="4.4">4.4</a> When it is compiling the file language-parser.tab.c, it gives me errors
|
|
that say 'yytname undeclared'.
|
|
</B></DT>
|
|
<DD>
|
|
You need to update your version of Bison. You can find the latest version
|
|
at <A href="ftp://prep.ai.mit.edu/pub/gnu/">ftp://prep.ai.mit.edu/pub/gnu/</A>.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="4.5">4.5</a> When I run 'make', it seems to run fine but then fails when it
|
|
tries to link the final application complaining that it can't find
|
|
some files.
|
|
</B></DT>
|
|
<DD>
|
|
Some old versions of make that don't correctly put the compiled
|
|
versions of the files in the functions directory into that same
|
|
directory. Try running "<CODE>cp *.o functions</CODE>" and then
|
|
re-running 'make' to see if that helps. If it does, you should really
|
|
upgrade to a recent version of GNU make.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="4.6">4.6</a> When linking PHP, it complains about a number of undefined references.
|
|
</B></DT>
|
|
<DD>
|
|
Take a look at the link line and make sure that all of the appropriate
|
|
libraries are being included at the end. Common ones that you might have
|
|
missed are '-ldl' and any libraries required for any database support
|
|
you included.
|
|
<P>
|
|
If you're linking with Apache 1.2.x, did you remember to add the
|
|
appropriate information to the EXTRA_LIBS line of the Configuration
|
|
file and re-rerun Apache's Configure script? See the <A href="http://cvs.php.net/cvsweb.cgi/INSTALL?rev=1.18">INSTALL</A> file that
|
|
comes with the distribution for more information.
|
|
<P>
|
|
Some people have also reported that they had to add '-ldl' immediately
|
|
following 'libphp3.a' when linking with Apache.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="4.7">4.7</a> I can't figure out how to build PHP with Apache 1.3.
|
|
</B></DT>
|
|
<DD>
|
|
<P>This is actually quite easy. Follow these steps carefully:
|
|
<UL>
|
|
<LI>Grab the latest Apache 1.3 distribution from <A href="http://www.apache.org/dist/">www.apache.org</A>.
|
|
<LI>Ungzip and untar it somewhere, for example /usr/local/src/apache-1.3.
|
|
<LI>Compile PHP by first running ./configure --with-apache=/<i><path></i>/apache-1.3 (substitute <i><path></i> for the actual path to your apache-1.3 directory.
|
|
<LI>Type 'make' followed by 'make install' to build PHP and copy the
|
|
necessary files to the Apache distribution tree.
|
|
<LI>Change directories into to your /<i><path></i>/apache-1.3/src directory and edit the <i>Configuration</i> file. At the end of the file, add: <tt>AddModule modules/php3/libphp3.a</tt>.
|
|
<LI>Type: './Configure' followed by 'make'.
|
|
<LI>You should now have a PHP-enabled httpd binary!
|
|
</UL>
|
|
<b>Note:</b> You can also use the new Apache ./configure script. See the instructions in the README.configure file
|
|
which is part of your Apache distribution. Also have a look at the INSTALL file in the PHP distribution.
|
|
<P>
|
|
</DD>
|
|
<DT><B>
|
|
<a name="4.8">4.8</a> I have followed all the steps to install the Apache module version on UNIX, and my
|
|
PHP scripts show up in my browser or I am being asked to save the file. Help!
|
|
</B></DT>
|
|
<DD>
|
|
<P>This means that the PHP module is not getting invoked for some reason. Three things to check before
|
|
asking for further help:
|
|
<UL>
|
|
<LI> Make sure that the httpd binary you are running is the actual new httpd binary you just built. To do this,
|
|
try running: <i>/path/to/binary/httpd -l</i><br>
|
|
If you don't see <b>mod_php3.c</b> listed then you are not running the right binary. Find and install the correct binary.
|
|
<LI> Make sure you have added the correct Mime Type to one of your Apache .conf files. It should be: <b><i>AddType application/x-httpd-php3 .php3</i></b><br>
|
|
Also make sure that this AddType line is not hidden away inside a <Virtualhost> or <Directory> block which would
|
|
prevent it from applying to the location of your test script.
|
|
<LI> Finally, the default location of the Apache configuration files changed between Apache 1.2 and Apache 1.3. You
|
|
should check to make sure that the configuration file you are adding the AddType line to is actually being read.
|
|
You can put an obvious syntax error into your httpd.conf file or some other obvious change that will tell you if
|
|
the file is being read correctly.
|
|
</UL>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="4.9">4.9</a> It says to use: --activate-module=src/modules/php3/libphp3.a, but that file
|
|
doesn't exist, so I changed it to --activate-module=src/modules/php3/libmodphp3.a and it doesn't work!?
|
|
What's going on?
|
|
</B></DT>
|
|
<DD>
|
|
Well, you decided to try to outsmart the people who wrote those nice step-by-step instructions for you and you
|
|
have now discovered that these people cannot be outsmarted. The libphp3.a file is not supposed to
|
|
exist. The Apache build process will create it.<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="4.10">4.10</a> When I try to build Apache with PHP as a static module using
|
|
--activate-module=src/modules/php3/libphp3.a it tells me that my compiler is not ANSI
|
|
compliant.
|
|
</B></DT>
|
|
<DD>
|
|
This is a crappy error message and has been fixed in Apache-1.3.10 (not available yet). For now, go
|
|
and edit the src/Configure file in the Apache source directory and down around line 2140 you will find
|
|
a line that looks like this: <pre>if ./helpers/TestCompile sanity; then</pre>
|
|
Change this line to be this: <pre>if ./helpers/TestCompile -v sanity; then</pre>
|
|
and now re-run the Apache configure script. It will now show you the actual errors
|
|
that caused your build to fail. It is usually due to a missing library.
|
|
</DD>
|
|
<DT><B>
|
|
<a name="4.11">4.11</a> When I try to build PHP using --with-apxs I get strange error messages
|
|
</B></DT>
|
|
<DD>
|
|
There are two things to check here. First, for some reason when Apache builds the apxs Perl
|
|
script, it sometimes ends up getting built without the proper compiler and flags variables.
|
|
Edit your apxs (sometimes found in /usr/local/apache/bin/apxs or /usr/sbin/apxs) and check
|
|
for these lines:
|
|
<pre>my $CFG_CFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl
|
|
my $CFG_LD_SHLIB = ' '; # substituted via Makefile.tmpl
|
|
my $CFG_LDFLAGS_SHLIB = ' '; # substituted via Makefile.tmpl</pre>
|
|
If this is what you see, you have found your problem. Change these lines to say:
|
|
<pre>my $CFG_CFLAGS_SHLIB = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmpl
|
|
my $CFG_LD_SHLIB = 'gcc'; # substituted via Makefile.tmpl
|
|
my $CFG_LDFLAGS_SHLIB = q(-shared);# substituted via Makefile.tmpl </pre>
|
|
The second possible problem should only be an issue on RedHat-6.1. The apxs script RedHat
|
|
ships is broken. Look for this line:
|
|
<pre>my $CFG_LIBEXECDIR = 'modules'; # substituted via APACI install</pre>
|
|
If you see the above line, change it to this:
|
|
<pre>my $CFG_LIBEXECDIR = '/usr/lib/apache'; # substituted via APACI install</pre>
|
|
</DD>
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<A NAME="5">
|
|
<H2>5. Using PHP</H2>
|
|
</A>
|
|
|
|
<DL>
|
|
<DT><B>
|
|
<a name="5.1">5.1</a> I would like to write a generic PHP script that can handle data coming
|
|
from any form. How do I know which POST method variables are available?
|
|
</B></DT>
|
|
<DD>
|
|
Make sure that the <i>track_vars</i> feature is enabled in your php3.ini file. If you
|
|
compiled PHP with "--enable-track-vars" it will be on by default.
|
|
Alternatively you can enable it at run-time on a per-script basis by putting
|
|
<?php_track_vars?> at the top of your file.
|
|
When <i>track_vars</i> is on, it creates three associative arrays. $HTTP_GET_VARS, $HTTP_POST_VARS
|
|
and $HTTP_COOKIE_VARS. So, to write a generic script to handle POST
|
|
method variables you would need something similar to the following:<PRE>
|
|
while (list($var, $value) = each($HTTP_POST_VARS)) {
|
|
echo "$var = $value<br>\n";
|
|
}</PRE>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.2">5.2</a> I need to convert all single-quotes (') to a backslash followed by
|
|
a single-quote. How can I do this with a regular expression?
|
|
</B></DT>
|
|
<DD>
|
|
First off, take a look at the <A href="manual/function.addslashes.php3">addslashes()</A> function. It will do
|
|
exactly what you want. You should also have a look at the magic_quotes_gpc directive in your php3.ini
|
|
file.
|
|
<P>
|
|
The ereg_replace magic you're looking for, however, is simply:<PRE>
|
|
$escaped = ereg_replace("'", "\\'", $input);</PRE>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.3">5.3</a> When I do the following, the output is printed in the wrong order:<PRE>
|
|
function myfunc($argument) {
|
|
echo $argument + 10;
|
|
}
|
|
$variable = 10;
|
|
echo "myfunc($variable) = " . myfunc($variable);
|
|
</PRE>
|
|
<P>What's going on?
|
|
</B></DT>
|
|
<DD>
|
|
To be able to use the results of your function in an expression (such
|
|
as concatenating it with other strings in the example above), you need
|
|
to <B>return</B> the value, not echo it.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.4">5.4</a> Hey, what happened to my newlines in:
|
|
<PRE>
|
|
<PRE>
|
|
1 <?echo $result[1];?>
|
|
2 <?echo $result[2];?>
|
|
</PRE>
|
|
</B></DT>
|
|
<DD>
|
|
In PHP, the ending for a block of code is either "?>" <B>or</B>
|
|
"?>\n" (where \n means a newline). This means that you need to
|
|
insert an extra newline after each block of PHP code in the above
|
|
example.
|
|
<P>
|
|
Why does PHP do this? Because when formatting normal HTML, this
|
|
usually makes your life easier because you don't want that newline,
|
|
but you'd have to create extremely long lines or otherwise make the
|
|
raw page source unreadable to achieve that effect.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.5">5.5</a> I need to access information in the request header directly. How can
|
|
I do this?
|
|
</B></DT>
|
|
<DD>
|
|
The getallheaders() function will do this if you are running PHP as a
|
|
module. So, the following bit of code will show you all the request
|
|
headers:<PRE>
|
|
$headers = getallheaders();
|
|
for(reset($headers); $key = key($headers); next($headers)) {
|
|
echo "headers[$key] = ".$headers[$key]."<br>\n";
|
|
}
|
|
</PRE>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.6">5.6</a> When I try to use authentication with IIS I get 'No Input file specified'
|
|
</B></DT>
|
|
<DD>
|
|
The security model of IIS is at fault here. This is a problem
|
|
common to all CGI programs running under IIS. A workaround is
|
|
to create a plain HTML file (not parsed by php) as the entry page
|
|
into an authenticated directory. Then use a META tag to redirect
|
|
to the PHP page, or have a link to the PHP page. PHP will
|
|
then recognize the authentication correctly. When the ISAPI
|
|
module is ready, this will no longer be a problem. This should
|
|
not effect other NT web servers. For more information, see: <A
|
|
href="http://support.microsoft.com/support/kb/articles/q160/4/22.asp"
|
|
target="_new">http://support.microsoft.com/support/kb/articles/q160/4/22.asp</A>.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.7">5.7</a> I've followed all the instructions, but still can't get PHP and IIS
|
|
to work together!
|
|
</B></DT>
|
|
<DD>
|
|
Make sure any user who needs to run a PHP script has the rights
|
|
to run php.exe! IIS uses an anonymous user which is added at the
|
|
time IIS is installed. This user needs rights to php.exe. Also,
|
|
any authenticated user will also need rights to execute php.exe. And
|
|
for IIS4 you need to tell it that PHP is a script engine.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.8">5.8</a> My PHP script works on IE and Lynx, but on Netscape some of my output
|
|
is missing. When I do a "View Source" I see the content in IE but not in Netscape.
|
|
Even when I telnet to port 80 directly the correct content shows up. How can this be? PHP
|
|
is server-side and my browser can't possibly know that the content it is seeing is generated
|
|
by PHP, so what is going on?
|
|
</B></DT>
|
|
<DD>
|
|
Very good question! ;) This is a tricky little issue and it has come up twice in the
|
|
past month as of this writing. Both times I ended up spending a good 20 minutes trying to
|
|
figure out what the heck was going on. The answer is that both IE and Lynx ignore any NULs
|
|
(\0) in the HTML stream. Netscape does not. The best way to check for this is to compile
|
|
the command-line version of PHP (also known as the CGI version) and run your script from the
|
|
command line and pipe it through 'od -c' and look for any \0 characters. (If you are on
|
|
Windows you need to find an editor or some other program that lets you look at binary files)
|
|
When Netscape sees a NUL in a file it will typically not output anything else on that line
|
|
whereas both IE and Lynx will. If this issue has bitten you, congratulations! You are not
|
|
alone.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.9">5.9</a> How do I get all the results from a SELECT MULTIPLE HTML tag?
|
|
</B></DT>
|
|
<DD>
|
|
The SELECT MULTIPLE tag in an HTML construct allows users to select multiple items from a list.
|
|
These items are then passed to the action handler for the form. The problem is that they are
|
|
all passed with the same widget name. ie.
|
|
<PRE> <SELECT NAME="var" MULTIPLE></PRE>
|
|
Each selected option will arrive at the action handler as:
|
|
|
|
<PRE> var=option1
|
|
var=option2
|
|
var=option3</PRE>
|
|
|
|
Each option will overwrite the contents of the previous $var variable. The solution is to use PHP's
|
|
non-indexed array feature. The following should be used:
|
|
|
|
<PRE> <SELECT NAME="var[]" MULTIPLE></PRE>
|
|
|
|
This tells PHP to treat <i>var</i> as an array and each assignment of a value to var[] adds an item to
|
|
the array. The first item becomes $var[0], the next $var[1], etc. The count() function can be used to
|
|
determine how many options were selected, and the sort() function can be used to sort the option
|
|
array if necessary.<P>
|
|
|
|
Note that if you are using JavaScript the <i>[]</i> on the element name might cause you problems when you
|
|
try to refer to the element by name. Use it's numerical form element id instead, or enclose the
|
|
variable name in single quotes and use that as the index to the <I>elements</I> array, for example:
|
|
|
|
<PRE> variable = documents.forms[0].elements['var[]'];
|
|
</PRE>
|
|
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.10">5.10</a> How am I supposed to mix XML and PHP? It complains about my <?xml> tags!
|
|
</B></DT>
|
|
<DD>
|
|
You need to turn off the short tags by setting short_tags to 0 in your
|
|
php3.ini file, or by using the php3_short_tags Apache directive. (You
|
|
could even use a <File> section to do this selectively.) You can
|
|
also disable and re-enable the short tags in your script using the
|
|
short_tags() function.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.11">5.11</a> How can I use PHP with FrontPage or Dreamweaver or some other HTML editor that insists on moving my code around?
|
|
</B></DT>
|
|
<DD>
|
|
One of the easiest things to do is to enable using ASP tags in your
|
|
PHP code. This allows you to use the ASP-style <% and %> code
|
|
delimiters. Most of the popular HTML editors handle those more
|
|
intelligently (for now). To enable the ASP-style tags, you need
|
|
to set the asp_tags php3.ini variable, or use the php3_asp_tags
|
|
Apache directive.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.12">5.12</a> Where can I find a complete list of pre-set variables available
|
|
to me, and why are these not documented in the PHP documentation?
|
|
</B></DT>
|
|
<DD>
|
|
The best way is to stick a <?phpinfo()?> tag on a page and load it up. This will
|
|
show you all sorts of information about your PHP setup, including a list of both
|
|
environment variables and also special variables set by your web server. This list
|
|
can't really be documented in the PHP documentation because it will change from one
|
|
server to another.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.13">5.13</a> Why do I always get an error that looks something like this:<br>
|
|
<tt>Warning: 0 is not a MySQL result index in file on line 8</tt><br>
|
|
What am I doing wrong?
|
|
</B></DT>
|
|
<DD>
|
|
You are trying to use a result identifier that is 0. The 0 indicates that your query failed
|
|
for some reason. You need to check for errors after submitting a query and before you
|
|
attempt to use the returned result identifier. The proper way to do this is with code similar
|
|
to the following:<pre>
|
|
$result = mysql_query("select * from tables_priv");
|
|
if(!$result) {
|
|
echo mysql_error();
|
|
exit;
|
|
}</pre>
|
|
or:<pre>
|
|
$result = mysql_query("select * from tables_priv")
|
|
or die("Bad query: ".mysql_error());</pre>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="5.14">5.14</a> I'm trying to use an <INPUT TYPE="image"> tag, but the <I>$foo.x</I> and
|
|
<I>$foo.y</I> variables aren't available. Where are they?
|
|
</B></DT>
|
|
<DD>
|
|
When submitting a form, it is possible to use an image instead of the standard submit button
|
|
with a tag like:<pre>
|
|
<INPUT TYPE="image" SRC="image.gif" NAME="foo"></pre>
|
|
When the user clicks somewhere on the image, the accompanying form will be transmitted to the
|
|
server with two additional variables: foo.x and foo.y.
|
|
<P>
|
|
Because $foo.x and $foo.y are invalid variable names in PHP, they are automagically converted to
|
|
$foo_x and $foo_y. That is, the periods are replaced with underscores.
|
|
<P>
|
|
</DD>
|
|
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<A NAME="6">
|
|
<H2>6. New Features</H2>
|
|
</A>
|
|
|
|
<DL>
|
|
<DT><B>
|
|
<a name="6.1">6.1</a> I saw PHP offers persistent database connections. What does that mean?
|
|
</B></DT>
|
|
<DD>
|
|
Persistent connections are SQL links that do 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 link. An 'identical'
|
|
connection is a connection that was opened to the same host, with
|
|
the same username and the same password (where applicable).
|
|
|
|
<P>People who aren't thoroughly familiar with the way web servers
|
|
work and distribute the load may mistake persistent connects for what
|
|
they're not. In particular, they do <B>not</B> give you an ability
|
|
to open 'user sessions' on the same SQL link, they do <B>not</B>
|
|
give you an ability to build up a transaction efficently, and they
|
|
don't do a whole lot of other things. In fact, to be extremely
|
|
clear about the subject, persistent connections don't give you <B>any</B>
|
|
functionality that wasn't possible with their non-persistent brothers.
|
|
|
|
<P>Why?
|
|
|
|
<P>This has to do with the way web servers work. There are three ways
|
|
in which your web server can utilize PHP to generate web pages.
|
|
|
|
<P>The first method is to use PHP as a CGI "wrapper". When run this
|
|
way, an instance of the PHP interpreter is created and destroyed for
|
|
every page request (for a PHP page) to your web server. Because it
|
|
is destroyed after every request, any resources that it acquires (such
|
|
as a link to an SQL database server) are closed when it is destroyed.
|
|
In this case, you do not gain anything from trying to use persistent
|
|
connections -- they simply don't persist.
|
|
|
|
<P>The second, and most popular, method is to run PHP as a module
|
|
in a <I>multiprocess</I> web server, which currently only includes
|
|
Apache. A multiprocess server typically has one process (the parent)
|
|
which coordinates a set of processes (its children) who actually do
|
|
the work of serving up web pages. When each request comes in from a a
|
|
client, it is handed off to one of the children that is not already
|
|
serving another client. This means that when the same client makes
|
|
a second request to the server, it may be serviced by a different
|
|
child process than the first time. What a persistent connection does
|
|
for you in this case it make it so each child process only needs
|
|
to connect to your SQL server the first time that it serves a page
|
|
that makes us of such a connection. When another page then requires
|
|
a connection to the SQL server, it can reuse the connection that
|
|
child established earlier.
|
|
|
|
<P>The last method is to use PHP as a plug-in for a <I>multithreaded</I>
|
|
web server. Currently this is only theoretical -- PHP does not
|
|
yet work as a plug-in for any multithreaded web servers. Work is
|
|
progressing on support for ISAPI, WSAPI, and NSAPI (on Windows),
|
|
which will all allow PHP to be used as a plug-in on multithreaded
|
|
servers like Netscape FastTrack, Microsoft's Internet Information
|
|
Server (IIS), and O'Reilly's WebSite Pro. When this happens, the
|
|
behavior will be essentially the same as for the multiprocess model
|
|
described before.
|
|
|
|
<P>If persistent connections don't have any added functionality,
|
|
what are they good for?
|
|
|
|
<P>The answer here is extremely simple -- efficiency. Persistent
|
|
connections are good if the overhead to create a link to your SQL
|
|
server is high. Whether or not this overhead is really high depends
|
|
on many factors. Like, what kind of database it is, whether or
|
|
not it sits on the same computer on which your web server sits,
|
|
how loaded the machine the SQL server sits on is and so forth.
|
|
The bottom line is that if that connection overhead is high,
|
|
persistent connections help you considerably. They cause the child
|
|
process to simply connect only once for its entire lifespan, instead
|
|
of every time it processes a page that requires connecting to the
|
|
SQL server. This means that for every child that opened a persistent
|
|
connection will have its own open persistent connection to the server.
|
|
For example, if you had 20 different child processes that ran a script
|
|
that made a persistent connection to your SQL server, you'd have 20
|
|
different connections to the SQL server, one from each child.
|
|
|
|
<P>An important summary. Persistent connections were designed to
|
|
have one-to-one mapping to regular connections. That means that you
|
|
should <B>always</B> be able to replace persistent connections with
|
|
non-persistent connections, and it won't change the way your script
|
|
behaves. It <B>may</B> (and probably will) change the efficiency
|
|
of the script, but not its behavior!
|
|
<P>
|
|
</DD>
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<A NAME="7">
|
|
<H2>7. Common Problems</H2>
|
|
</A>
|
|
|
|
<DL>
|
|
<DT><b>
|
|
<a name="7.1">7.1</a> I installed PHP, but every time I load a document, I get the
|
|
message 'Document Contains No Data'! What's going on here?
|
|
</b></DT>
|
|
<DD>
|
|
This probably means that PHP is having some sort of problem
|
|
and is core-dumping. Look in your server error log to see if
|
|
this is the case, and then try to reproduce the problem with
|
|
a small test case. If you know how to use 'gdb', it is very
|
|
helpful when you can provide a backtrace with your bug report
|
|
to help the developers pinpoint the problem. If you are using
|
|
PHP as an Apache module try something like:
|
|
<ul>
|
|
<li> Stop your httpd processes
|
|
<li> gdb httpd
|
|
<li> > run -X -f /path/to/httpd.conf
|
|
<li> Then fetch the URL causing the problem with your browser
|
|
<li> If you are getting a core dump, gdb should inform you of this now
|
|
<li> type: bt
|
|
<li> Send the resulting backtrace to <a href="mailto: php-dev@lists.php.net">php-dev@lists.php.net</a>
|
|
</ul>
|
|
<P>
|
|
If your script uses the regular expression functions (<CODE>ereg()</CODE>
|
|
and friends), you should make sure that you compiled PHP and
|
|
Apache with the same regular expression package. (This should
|
|
happen automatically with PHP and Apache 1.3.x)
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="7.2">7.2</a> I'm trying to access one of the standard CGI variables (such
|
|
as $DOCUMENT_ROOT or $HTTP_REFERER) in a user-defined function,
|
|
and it can't seem to find it. What's wrong?
|
|
</B></DT>
|
|
<DD>
|
|
Environment variables are now normal global variables, so you must
|
|
either declare them as global variables in your function (by using
|
|
"<CODE>global $DOCUMENT_ROOT;</CODE>", for example) or by using
|
|
the global variable array (ie, "<CODE>$GLOBALS["DOCUMENT_ROOT"]</CODE>".
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="7.3">7.3</a> I patched Apache with the FrontPage extensions patch, and suddenly PHP stopped
|
|
working. Is PHP incompatible with the Apache FrontPage extensions?
|
|
</B></DT>
|
|
<DD>
|
|
No, PHP works fine with the FrontPage extensions.
|
|
The problem is that the FrontPage patch modifies several Apache structures,
|
|
that PHP relies on.
|
|
Recompiling PHP (using 'make clean ; make') after the FP patch is applied
|
|
would solve the problem.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="7.4">7.4</a> I think I found a bug! Who should I tell?
|
|
</B></DT>
|
|
<DD>
|
|
You should go to the PHP Bug Database and make sure the bug
|
|
isn't a known bug. If you don't see it in the database, use
|
|
the reporting form to report the bug. It is important to use
|
|
the bug database instead of just sending an email to one of the
|
|
mailing lists because the bug will have a tracking number assigned
|
|
and it will then be possible for you to go back later and check
|
|
on the status of the bug. The bug database can be found at <A
|
|
href="http://bugs.php.net">http://bugs.php.net</A>.
|
|
<P>
|
|
</DD>
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<A NAME="8">
|
|
<H2>8. Migrating from PHP2 to PHP3</H2>
|
|
</A>
|
|
|
|
<DL>
|
|
<DT><B>
|
|
<a name="8.1">8.1</a> When I add two strings together and then echo it, it echoes zero instead
|
|
of the concatenation of the two strings! What's going on? Wouldn't it
|
|
be great if adding two strings just concatenated them together?
|
|
</B></DT>
|
|
<DD>
|
|
PHP3 does not support the overloading of the addition operator for
|
|
strings because values that arrive via the GET and POST methods and
|
|
from databases are always stored as strings. This means that if the
|
|
plus operator were overloaded to concatenate strings, you could add
|
|
what you thought were two numbers and get the wrong result! (For
|
|
example, "4" + "5" would be equal to "45".) One way around this would
|
|
be to explicitly type-cast one or both of the operands, which is what
|
|
PHP/FI 2 did.
|
|
|
|
<P>This has been simplified in PHP3 by the addition of a real string
|
|
concatenation operator. If you want to "add" two strings together,
|
|
just write it like: <CODE>"this" . "that"</CODE> which will result in
|
|
the string "thisthat".
|
|
|
|
<P>The answer to the final part of the question is an emphatic no.
|
|
Operator overloading can be a source of great confusion, especially
|
|
when variables aren't very strongly typed to begin with, as they are
|
|
in PHP3.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="8.2">8.2</a> When I use the chmod(), umask(), or mkdir() functions, the permissions
|
|
are wrong!
|
|
</B></DT>
|
|
<DD>
|
|
Unlike PHP/FI 2, PHP3 does not interpret the numeric arguments for
|
|
these functions any differently than for any other function, which
|
|
means you need to pass in an octal value if you are specifying an
|
|
octal number, such as:
|
|
<PRE>
|
|
chmod($myfile, 0600);
|
|
</PRE>
|
|
<B>not</B>
|
|
<PRE>
|
|
chmod($myfile, 600);
|
|
</PRE>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="8.3">8.3</a> I converted my script from PHP/FI 2.0 to PHP3 syntax, but now it just
|
|
hangs! When I looked at the processes running on my server, there was
|
|
one process that was chewing up all of the CPU cycles!
|
|
</B></DT>
|
|
<DD>
|
|
You probably missed the semi-colon on a <CODE>while
|
|
(condition);</CODE> statement. This will cause PHP3 to spin out of
|
|
control because it is simply executing an empty body for your while
|
|
loop! Change the semi-colon to a colon and it should work correctly.
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="8.4">8.4</a> My user-functions don't work any more! I get a "Parse error (expecting '('"
|
|
on the first line of the function.
|
|
</B></DT>
|
|
<DD>
|
|
PHP3's function declaration now resembles C function declarations, so
|
|
your function should look like:
|
|
<PRE>
|
|
function printsum($a, $b) {
|
|
echo $a + $b;
|
|
}
|
|
</PRE>
|
|
<P>You can also use old-style function declarations by use the
|
|
'old_function' designation, like so:
|
|
<PRE>
|
|
old_function printsum $a, $b (
|
|
echo $a + $b;
|
|
);
|
|
</PRE>
|
|
<P>
|
|
</DD>
|
|
|
|
<DT><B>
|
|
<a name="8.5">8.5</a> What happened to the securevar() function that was in PHP2? How can
|
|
I make sure that a GET-method variable does not overwrite a POST-method one?
|
|
</B></DT>
|
|
<DD>
|
|
The securevar() function in PHP2 was a badly named function. It gave the impression that
|
|
when used the POST-method was secure. It is not. It is only slightly more difficult to
|
|
fake POST-method variables than GET-method ones.
|
|
<P>
|
|
There are a couple of ways to achieve similar things in PHP3. The most straightforward way is
|
|
to do it manually by using the <i>$HTTP_POST_VARS</i> array. See <a href="#5.1">FAQ question 5.1</a>
|
|
for instructions on how to enable it. To make sure that $foo, for example, comes from the POST data
|
|
and nowhere else you would do:
|
|
<PRE>
|
|
$foo = $HTTP_POST_VARS["foo"];
|
|
</PRE>
|
|
A second way to do this is to change the gpc_order setting in your php3.ini file. The default setting is
|
|
"GPC" which means that GET variables are parsed first followed by POST variables and lastly by
|
|
COOKIE variables. This means that GET vars are overwritten by POST vars which are in turn overwritten by
|
|
COOKIE vars. So, by default if you have the same variables in your GET and POST data the POST one will
|
|
be the one that shows up in the main PHP symbol table and you would have to use the <i>$HTTP_GET_VARS</i>
|
|
to get at it. Along with changing the order from "GPC" to something like "CGP" which
|
|
would make POST variables have the highest priority, you can leave out any of the letters to completely
|
|
disable PHP's ability to see a certain type of variable. If you never wanted GET-method data to be turned
|
|
into PHP variables you could use a gpc_order setting of "PC".
|
|
<DD>
|
|
|
|
</DD>
|
|
</DL>
|
|
|
|
<HR noshade>
|
|
|
|
<H2>Credits</H2>
|
|
|
|
<P>This FAQ was originally written by Jim Winstead. It is currently
|
|
maintained by the PHP Development Team.
|
|
|
|
<P>
|
|
<!-- The website should start chopping again. -->
|
|
|
|
<SMALL>
|
|
<CODE>$Id$</CODE>
|
|
</SMALL>
|
|
|
|
</BODY>
|
|
</HTML>
|