一般方法:
$dbhost = 'localhost';
$dbuser = 'root'; //你的mysql用户名
$dbpass = 'a'; //你的mysql密码
$dbname = 'mysql'; //你的mysql库名
$connect = mysql_connect($dbhost,$dbuser,$dbpass) or die(mysql_error());
mysql_select_db("mysql");
$sql="select * from user";
$result=mysql_query($sql) or die(mysql_error());
echo "<table>";
while($row=mysql_fetch_array($result))
{
echo "<tr><td>$row[0]</td><td>$row[1]</td>
<td>$row[2]</td></tr>";
}
echo "</table>";
mysql_close($connect);
使用DB类创建跨数据库
在PHP的应用中,免不了需要使用数据库,而PHP为我们提供了丰富的数据库支持:
dbase、fbsql、ibase、ifx、msql、mssql、mysql、oci8、odbc、pgsql、sqlite、
storage、sybase,面对众多的数据库,我们可以选择的函数也是多种多样的:
对于dbase,有dbase_*
对于mssql,有mssql_*
对于oci,有ora_*
……
这本应是好事,但是如果需要向其他数据库移植的时候,问题就来了:
查找dbase_*,替换为mssql_*
……
重新查找、分析、改写*_fetch_row,*_fetch_array
……
我们的恶梦开始了,如何才能开发与数据库独立的应用呢?
答案就是使用Pear中的Database 包。
Databse包现在已经包含如下三个主要类:
DB
DB_DataObject
MDB
每个类都可以完成跨数据库平台的设计任务,但是作为最早出来的DB类,
最为大家所熟悉,而其他的DB_DataObject事基于DB的、MDB的使用也和DB相类似。
所以本文简单介绍DB类的使用。
DB类是属于Pear(PHP Extension and Application Repository PHP扩展应用库)中的一个包(Database)。
首先看一个简单的使用DB类的例子:
<?php
$dsn = "mysql:host=localhost;dbname=book";
$db = new PDO($dsn, 'root', 'a');
$sql="select * from bbsmessage where title like '%级%'";
$r=$db->query($sql);
echo "<table>";
while($row=$r->fetch())
{
echo "<tr><td>$row[0]</td><td>$row[1]</td>
<td>$row[2]</td></tr>";
}
echo "</table>";
?>
<?php
require_once "DB.php";
$dsn="mysql://root:@localhost/med";
$db=DB::connect($dsn);
if(DB::iserror($db)) die($db->getMessage());
$sql="select username ,title,dateline
from article ";
$r=$db->query($sql);
if(DB::iserror($r)) die($r->getMessage());
echo "<table>";
while($r->fetchInto($row))
{
echo "<tr><td>$row[0]</td><td>$row[1]</td>
<td>$row[2]</td></tr>";
}
echo "</table>";
$r->free();
$db->disconnect();
?>
该例子包含常见的数据库使用过程:和数据库建立连接、错误检查、提交查询、析取结果、断开连接:
第一步:和数据库建立连接:
$db=DB::connect($dsn);
$dsn参数标明了我们需要使用的数据库类型、已经连接数据库所需要的地址、用户名、
密码等。$dsn的具体定义如下:
DSN: phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value
1:phptype: 后台数据库类型 (比如: mysql , odbc 等.)
可取如下值:
取值 | 对应的后台数据库类型 |
dbase | dBase |
fbsql | FrontBase |
ibase | InterBase |
ifx | Informix |
msql | Mini SQL |
mssql | Microsoft SQL Server |
mysql | MySQL (for servers running MySQL <= 4.0) |
mysqli | MySQL (for servers running MySQL >= 4.1) |
oci8 | Oracle 7/8/9 |
odbc | ODBC (Open Database Connectivity) |
pgsql | PostgreSQL |
sqlite | SQLite |
sybase | Syb |
2:dbsyntax: 当使用odbc作为phptype时候,设置该DBMS类型,以决定所使用的ODBC驱动.
比如: access, db2, mssql, navision, solid, 等.
3:username: 登录数据库服务器的用户名
4:password: 对应的密码
5:protocol: 使用的通讯协议 ( 常见的是tcp和unix.)
6:hostspec: 主机以hostname[:port]表示
7:database: 数据库服务器上要用的数据库
8:proto_opts: 协议选项
当成功建立连接后,DB::connect(#dsn)会返回一个DB_Common对象,对象包含了所有的数据库查询方法。使用DB_Common
对象的方法可以方便的对数据库进行查询。
第二步:检查错误:
if(DB::iserror($db)) die($db->getMessage());
当出现错误时,大多数DB类的成员函数(包括后面的查询)都会返回DB_Error对象,如果包含该对象,则表示出错,要检查该对象是否
存在可以使用DB::isError($db_common)(检查数据库通用对象是否出错)或者DB::isError($db_result)(检查查询结果是否出错
).同时DB_Error类还提供其他一些成员函数来获取错误消息:
成员函数名称 | 函数说明 |
getMessage() | The text messages returned by DB_Error::getMessage() are consistent between each DBMS. |
getCode() | The error code integers returned by DB_Error::getCode() are also consistent between each DBMS.The integers returned are based on the DB_ERROR_* constants defined in DB.php. |
getDebugInfo() | DB_Error::getUserInfo() return complete native DBMS error reports. |
第三步:向数据库发送查询:
$sql="select username ,title,dateline
from article ";
$r=$db->query($sql);
DB_Common的query($sql)方法来返回一个DB_Result 对象,使用DB_Result的一些方法来对查询结果进行数据析取。
第四步:从查询返回的结果集中析取数据:
echo "<table>";
while($r->fetchInto($row))
{
echo "<tr><td>$row[0]</td><td>$row[1]</td>
<td>$row[2]</td></tr>";
}
echo "</table>";
如前面所言:fetchInto($row)是DB_Result的一个成员函数,它将结果集中的当前行析取到一个数组中。
第五步:释放结果集对象以及断开连接:
$r->free();
$db->disconnect();
当查询结束后,特别是当返回一个包含很多行和列的结果集时
DB_Result会占用很多存储空间,程序结束时需要使用free()来释放所占存储空间。
最后使用DB_Common的disconnect()成员函数断开和数据库的连接。
这样,数据库独立的应用就建立好了,当我们需要进行数据库移植,则可以
简单的改变$dsn中的phptype就可以了,如果将这个$dsn放在一个头文件中,
其他的地方include的话,那么我们只需更改一个phptype,整个应用便实现了数据库平台的移植。