10.1使用DBM数据库
问题
数据可以很容易地表示键值对,希望能安全地存储这些数据,可以根据数据键快速地查找。
解决办法
使用DBA抽象层访问DBM数据库
dba_open(DIR.'./dish.db','c','db4')
第一个参数是文件名
第二个参数是模式
r以只读的方式进行
w以读写方式访问
c是以可读可执行的方式进行,如果数据库不存在,则创建数据库。
n如果数据库已经存在,就清空
第三个参数是处理程序。
要关闭一个数据库,需要调用dba_close(),
可以使用dba_firstkey()和dba_nextkey()迭代处理一个dbm文件
$dbh=dba_open($data_file,'r','db4');
$k=dba_firstkey($dbh);
while($k){
$total_length+=strlen(dba_fetch($k,$dbh));
$k=dba_nextkey($dbh);
}
print 'sssss';
$dba_close($dbh);
10.2使用SQLite数据库
问题
希望使用一个关系型数据库而不需要运行一个单独的服务器进程。
解决方案
可以使用
10.3链接sql数据库
问题
希望访问一个sql数据库来存储或获取信息,如果没有数据库,动态网站将无法提供充分的动态性。
解决方案
用适当的连接字符创建一个新的pdo对象
$mysql=new PDO('mysql:host=db.example.com',$user,$password);
讨论
如果一切正常,pdo构造函数会返回一个金对象,可以用来查询数据库,如果存在问题,则跑出一个PDOException异常
10.4查询sql数据库
问题
希望从数据库中获取一些数据
解决方案
使用PDO:query想数据库发送sql差啊讯,然后利用一个foreach循环获取每一行结构
fetchall返回各个行
fetch返回一行
10.6修改sql数据库中的数据
问题
希望增加、删除、或修改sql数据库中的数据
解决方案
使用PDO::exec()发送一个insert,delete,update命令
$db->exec("insert into family (id,name) values (1,"vito")");
$db->exec("delete form family where name like 'fredo'");
$db->exec("update family set is_naive=1 where name like 'key'");
10.7高效重复执行查询
问题
希望多次运行同一个查询,每次换入不同的值
解决方案
execute的值被称为绑定参数
10.8查看查询返回的行数
问题
希望知道一个select查询返回多少行,希望知道insert,update,delete查询改变了多少行
解决方案
PO::exec()执行了这个语句,exec的返回值就是所修的行数
rowCount()统计行数
count
10.9转义字符
问题
需要保证文本或二进制数据对于查询是安全的
解决方案
如果需要自行专业,可以使用PDO::quote()方法,极少情况下,我们希望对来自用户输入的SQL通配符进行转义。
10.10记录调试信息和错误
问题
希望访问一些信息来帮助你调试数据库问题。例如 ,一个查询失败时,希望查看数据库返回的错误信息。
解决方案
执行一个操作后,如果操作失败,使用PDO::errorcode或或PDOSTATEMENT::errorCode()得到一个错误码。
相应的errorInfo()方法可以返回错误的更多信息。
讨论
errorCode()返回一个5字符错误码。
根据这个标准,00000表示“无错误”。所以返回00000的errorCode()调用表示成功。
包含三个参数
第一个包含5字符的SQLSTATE
第二个元素是一个特定于数据库后端的错误码
第三个元素是一个特定于数据库后端的错误消息。
10.5缓存查询和结果
问题
如果结果并没有改变,你不希望重新运行可能开销很大的数据库查询
解决方案
可以使用PEAR的Cache_Lite包。利用这个包,缓存任意的数据会变得简单。在这里,可以缓存一个select查询的结果。
并使用查询文本作为缓存件
类似Cache_Lite的PHP层解决方案的一个好处是,他们是数据库无关的。不过取决于你使用的数据库,可以利用数据库特定的查询缓存机制。这些缓存与数据库 继承更加紧密,对于数据改变时缓存数据到期的情况,可以用更聪明的方法进行处理。
网友评论