Zend_Db_Adapter是zendfrmaeword的数据库抽象层api. 基于pdo, 你可以使用 Zend_Db_Adapter 连接和处理多种 数据库,包括:microsoft SQL Server,MySql,SQLite等等. 1.连接数据库
<?php require_once ‘Zend/Db.php’; $params = array (‘host’ => ‘127.0.0.1’, ‘username’ => ‘root’, ‘password’ => ‘root’, ‘dbname’ => ‘zendstudy’, charset’ => ‘utf8’) $db = Zend_Db::factory(‘PDO_MYSQL’, $params); ?>
2.SQL语句添加引号防止攻击
第一种是quote() 方法. 该方法会根据数据库adapter为标量加上 合适的引号;假如你试图对一个数组做quote操作, 它将为数组中 每个元素加上引号,并用”,”分隔返回. $value = $db->quote(‘St John”s Wort’); //$value 现在变成了 ‘St John\”s Wort’ $value = $db->quote(array(‘a’, ‘b’, ‘c’)); //$value现在变成了 ‘a’, ‘b’, ‘c'(“,”分隔的字符串) 第二种是 quoteInto() 方法. 你提供一个包含问号占位符的基础字符串 , 然后在该位置加入带引号的标量或者数组. 该 方法对于随需构建查询sql语句和条件语句是很有帮助的. 使用 quoteInto处理过的标量和数组返回结果与quote() 方法相同. $where = $db->quoteInto(‘id = ?’, 1);//id = 1 $where = $db->quoteInto(‘id IN(?)’, array(1, 2, 3));//id IN(1, 2, 3)
3.直接查询
$sql = $db->quoteInto(‘select * from `sys_course` where cid > ?’ , 0); $result = $db->query($sql); $rows = $result->fetchAll();//返回数组 你可以将数据自动的绑定到你的查询中。这意味着你在查询中可以设定多个指定的占位符,然后传送一个数组数据以代替这些占位符 $sql = ‘select * from `sys_course` where cid > :mycid and ccredit = :abc’; $data = array(‘mycid’=>’0′,’abc’=>’2’); $result = $db->query($sql,$data); $rows = $result->fetchAll();//返回数组 注意这里不再使用quteInto,其实如果多个参数你可使用多次quteInto进行连接sql语句
4.插入数据
为了方便起见,你可以使用 insert()方法将要插入的数据绑定并创建 一个insert语句(绑定的数据是自动进行加引号处理以避免数据库攻击的) 返回值并 不是 最后插入的数据的id,这样做的原因在于一些表 并没有一个自增的字段;相反的,这个插入的返回值是改变的数据行数(通常情况为1)。 假如你需要最后插入的数据id,可以在insert执行后调用 lastInsertId() 方法。 $bind = array(‘subject’ => ‘这是新闻标题’, ‘message’ => ‘这里可以存放很多很多内容,因为这是新闻内容~~’, ‘createtime’ => date(“Y-m-d”)); $table = ‘message’; $rows_affected = $db->insert($table, $bind);//返回的是插入的行数 $last_insert_id = $db->lastInsertId();//可以获取到主键的编号
5.更新数据
你可以使用 update() 方法确定需要update的数据并且创建一个 update语句(确定的数据是自动加引号处理以避免数据库攻击的)。你可以提供一个可选的where语句说明update的条件(注意:where语句并 不是一个绑定参数,所以你需要自己数据进行加引号的操作)。 $bind = array(‘subject’ => ‘更新标题’, ‘message’ => ‘这里可更新内容~~’, ‘createtime’ => date(“Y-m-d”)); $table = ‘message’; $where = ‘id = 8’;//这里可以使用$where = $db->quoteInto(‘id = ?’,8); $rows_affected = $db->update($table, $bind, $where);//返回的是更新影响的行数
6.删除数据
可以使用 delete() 方法创建一个delete语句;你 也可以提供一个where语句以说明数据的删除条件。(注意:where语句并不是一个绑 定参数,所以你需要自己进行数据加引号处理)。 $table = ‘message’; $where = ‘id = 8’;//这里可以使用$where = $db->quoteInto(‘id = ?’,8); $rows_affected = $db->delete($table, $where);//返回的是影响的行数
7.取回查询结果
尽管你可以使用query()方法直接对数据库进行操作,但是通常情况 下,仍然还是需要选择数据行并返回结果。以fetch开头的一系列的方法可以实现这个要求。对于每一种fetch系列的方法来说,你需 要传送一个select的sql语句;假如你在操作语句中使用指定的占位符,你也可以传送一个绑定数据的数组对你的操作语句进行处理和替换。 fetchAll() //取回结果集中所有字段的值,作为连续数组返回,二维数组,第一维是连续的 $result = $db->fetchAll(“select * from `message` where `id` > :id”,array(‘id’ => 0)); fetchAssoc()//取回结果集中所有字段的值,作为关联数组返回,第一维是用第一个字段的值作为键值,第一维可能不是连续的,二维数组 fetchCol()//取回所有结果行的第一个字段值。一维数组[手册中说是取回结果行的第一个字段名] 例子如下$result = $db->fetchCol(“select subject from `message` where `id` > :id”,array(‘id’ => 0)); fetchOne()//取回所有结果中第一个字段的值(一般用于统计,聚集函数使用) 例如:result = $db->fetchOne(“select count(*) from `message` where `id` > :id”,array(‘id’ => 0)); fetchPairs()//返回一维数组,键是第一个字段的值,值是第二个字段的值 $result = $db->fetchPairs(“select * from `message` where `id` > :id”,array(‘id’ => 0)); fetchRow()//取出满足条件的第一行,一维数组