HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/MDalebout3/prdct.nl/wwwroot/timesheet/includes/adodb5/docs/tips_portable_sql.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
	<title>Tips on Writing Portable SQL for Multiple Databases for PHP</title>
</head>

<body bgcolor=white>
<table width=100% border=0><tr><td><h2>Tips on Writing Portable SQL &nbsp;</h2></td><td>
 <div align=right><img src="cute_icons_for_site/adodb.gif"></div></td></tr></table>
  <p>Updated 6 Oct 2006. Added OffsetDate example.
  <p>Updated 18 Sep 2003. Added Portable Native SQL section.
<p>

 If you are writing an application that is used in multiple environments and 
  operating systems, you need to plan to support multiple databases. This article 
  is based on my experiences with multiple database systems, stretching from 4th 
  Dimension in my Mac days, to the databases I currently use, which are: Oracle, 
  FoxPro, Access, MS SQL Server and MySQL. Although most of the advice here applies 
  to using SQL with Perl, Python and other programming languages, I will focus on PHP and how 
  the <a href="http://adodb.sourceforge.net/">ADOdb</a> database abstraction library 
  offers some solutions.<p></p>
<p>Most database vendors practice product lock-in. The best or fastest way to 
  do things is often implemented using proprietary extensions to SQL. This makes 
  it extremely hard to write portable SQL code that performs well under all conditions. 
  When the first ANSI committee got together in 1984 to standardize SQL, the database 
  vendors had such different implementations that they could only agree on the 
  core functionality of SQL. Many important application specific requirements 
  were not standardized, and after so many years since the ANSI effort began, 
  it looks as if much useful database functionality will never be standardized. 
  Even though ANSI-92 SQL has codified much more, we still have to implement portability 
  at the application level.</p>
<h3><b>Selects</b></h3>
<p>The SELECT statement has been standardized to a great degree. Nearly every 
  database supports the following:</p>
<p>SELECT [cols] FROM [tables]<br>
  &nbsp;&nbsp;[WHERE conditions]<br>
  &nbsp; [GROUP BY cols]<br>
  &nbsp; [HAVING conditions] <br>
  &nbsp; [ORDER BY cols]</p>
<p>But so many useful techniques can only be implemented by using proprietary 
  extensions. For example, when writing SQL to retrieve the first 10 rows for 
  paging, you could write...</p>
<table width="80%" border="1" cellspacing="0" cellpadding="0" align="center">
  <tr> 
	<td><b>Database</b></td>
	<td><b>SQL Syntax</b></td>
  </tr>
  <tr> 
	<td>DB2</td>
	<td>select * from table fetch first 10 rows only</td>
  </tr>
  <tr> 
	<td>Informix</td>
	<td>select first 10 * from table</td>
  </tr>
  <tr> 
	<td>Microsoft SQL Server and Access</td>
	<td>select top 10 * from table</td>
  </tr>
  <tr> 
	<td>MySQL and PostgreSQL</td>
	<td>select * from table limit 10</td>
  </tr>
  <tr> 
	<td>Oracle 8i</td>
	<td>select * from (select * from table) where rownum &lt;= 10</td>
  </tr>
</table>
<p>This feature of getting a subset of data is so useful that in the PHP class 
  library ADOdb, we have a SelectLimit( ) function that allows you to hide the 
  implementation details within a function that will rewrite your SQL for you:</p>
<pre>$connection-&gt;SelectLimit('select * from table', 10);
</pre>
<p><b>Selects: Fetch Modes</b></p>
<p>PHP allows you to retrieve database records as arrays. You can choose to have 
  the arrays indexed by field name or number. However different low-level PHP 
  database drivers are inconsistent in their indexing efforts. ADOdb allows you 
  to determine your prefered mode. You set this by setting the variable $ADODB_FETCH_MODE 
  to either of the constants ADODB_FETCH_NUM (for numeric indexes) or ADODB_FETCH_ASSOC 
  (using field names as an associative index).</p>
<p>The default behaviour of ADOdb varies depending on the database you are using. 
  For consistency, set the fetch mode to either ADODB_FETCH_NUM (for speed) or 
  ADODB_FETCH_ASSOC (for convenience) at the beginning of your code. </p>
<p><b>Selects: Counting Records</b></p>
<p>Another problem with SELECTs is that some databases do not return the number 
  of rows retrieved from a select statement. This is because the highest performance 
  databases will retu