1. 通过db_query执行原生SQL语句
$ret = db_query('SELECT * FROM test_table WHERE tid = :tid', array(':tid' => $tid);
db_query语句返回的是一个对象,但是这个对象可以通过foreach遍历,就好像$ret是一个数组一样遍历。其成员是对象。
foreach ($ret as $row) {
echo $row->tid;
}
要注意的是,db_query语句返回的结果虽然可以项数组一样遍历,但只能遍历一次。其内部的实际逻辑是遍历的时候向数据库获取新一行数据,当数据获取完之后并不会重头再获取。
对于对象是怎样实现foreach操作的,可以参考:http://php.net/manual/en/language.oop5.iterations.php
2. 直接获取第一条查询结果:fetch
有时候,我们的查询结果只有一行,可以直接用fetch来获取第一行数据,不必通过foreach等。如果没有第一行,该方法返回FALSE
$obj = $ret->fetch();
if ($obj) {
echo $obj->tid
}
3. 一次性获取所有结果:fetchAll
如果我们需要对返回结果进行反复遍历,那么需要先把数据通过fetchAll保存到一个数据再操作。否则,我们没有必要这样做,因为这增加了PHP内存的开销。
$rows = $ret->fetchAll();
4. 如果查询语句只返回一列,可以通过fetchCol把该列以数组返回
$ret = db_query('SELECT tid FROM test_table')->fetchCol();
foreach ($ret as $tid) {
echo $tid;
}
5. 如果返回结果只有两列,并且其中一列是ID,可以通过fetchAllKeyed把结果返回成关联数组
$ret = db_query('SELECT tid, name FROM test_table')->fetchAllKeyed('tid');
foreach ($ret as $tid => $name) {
echo $tid . ':' . $name;
}
6. 获取结果行数:rowCount
echo $ret->rowCount();
7. 把结果以某一列作为key值关联到一数组:fetchAllAssoc
$ret = db_query('SELECT * FROM test_table')->fetchAllAssoc();
foreach ($ret as $tid => $row) {
echo $row->name;
}
8. 把返回结果行以数组形式返回
$ret = db_query('SELECT * FROM test_table', array('fetch' => PDO::FETCH_ASSOC));
foreach ($ret as $row) {
echo $row['tid'];
}
9. 动态生成SQL语句:db_select
一般情况下,用db_query写原生的SQL是更得心应手一些的。使用框架提供的语法去些SQL语句相当于要多记一些语法。但有时逻辑分支太多,写原生的SQL就需要做大量的字符串拼接,程序可读性会变得很差,这时就应该使用框架提供的数据库操作方式去实现。
看一下db_select的API文档里面的代码例子一般可以猜出这条函数的用法。db_select本身返回一个对象,对象的大部分方法会返回对象本身。但有少量方法除外,例如:join表格。涉及这些方法的时候要注意不要把语句连着写,否则会报错。例如:
$query = db_select('test_table', 't')
->join('test_table2', 't2');
$result = $query->condition('tid', 5)
->execute();
不要写成,这是很容易烦的错误,也是很难调试出的问题。
$result = db_select('test_table', 't')
->join('test_table2', 't2');
->condition('tid', 5)
->execute();
评论