我使用PHP PDO与MS SQL Server。下面的工作很好。结果如预期的那样是一个位置数组。
function getAllCentersOld() {
global $fpdo, $pdo;
$query = $pdo->query("SELECT"
." [LOCID]"
.", [LOCNAME]"
.", [LOCSHORT]"
.", RIGHT('00'+ CAST([CENTER] as varchar(4)),4) as CENTER"
.", [LAT]"
.", [LONG]"
.", [LOCATION_ID]"
." FROM locs2 with (nolock) WHERE LOCNAME <> 'Someplace'"
." ORDER BY LOCNAME asc");
$result = $query->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
$rows[] = $row;
}
return json_encode($rows);
}
但是,当我尝试使用FluentPDO来构建查询时,我似乎无法使用选择方法。我得到了下面的错误。
function getAllCenters() {
global $fpdo, $pdo;
$query = $fpdo->from('locs2')
->select('[LOCID], [LOCNAME], [LOCSHORT]')
->where(array("LOCNAME <> ?" => "Someplace"))
->orderBy("LOCNAME asc")
;
$result = $query->fetchAll(PDO::FETCH_ASSOC);
foreach ($result as $row) {
$rows[] = $row;
}
return json_encode($rows);
}
未捕获异常' exception ',消息' SelectQuery::getIterator()返回的对象必须是可遍历的或实现接口Iterator'在....{remove}…FluentPDO/SelectQuery.php: 116…SelectQuery:: fetchAll()……
如果我注释掉上面的选择行,它可以工作。否则我得到以下错误。有人熟悉这个图书馆吗?我想它会像在网站上一样运行。
http://fluentpdo.com/documentation.html选择
我不知道这个库,但我在github上看过源代码。$query
不是PDOStatement
对象,所以你所说的fetchAll
将不起作用。
$query
是一个SelectQuery对象,也有一个fetchAll
方法,但有其他参数:
/** Fetch all row
* @param string $index specify index column
* @param string $selectOnly select columns which could be fetched
* @return array of fetched rows
*/
public function fetchAll($index = '', $selectOnly = '') {
...
最简单的方法是直接迭代$query
对象,因为它实现了IteratorAggregate
。(不是直接继承而是通过继承)
所以下面应该可以工作:
$rows = array();
foreach ($query as $row) {
$rows[] = $row;
}
我想我刚刚找到了答案。首先需要清除选中的"*"。
->select(null)->select('[LOCID], [LOCNAME], [LOCSHORT]')
我还需要修改where()方法中的PDO参数绑定。似乎这个库与预期的有点不同(注意'PDO::FETCH_ASSOC'是不需要的)。完整的工作代码如下:
function getAllCenters() {
global $fpdo, $pdo;
$query = $fpdo->from('z_cc_locs2')
->select(null)->select("[LOCID], [LOCNAME], [LOCSHORT], RIGHT('00'+ CAST([CENTER] as varchar(4)),4) as CENTER, [LAT], [LONG], [LOCATION_ID]")
->where("LOCNAME <> :name", array(':name' => 'Formosa'))
->orderBy("LOCNAME ASC");
$result = $query->fetchAll();
foreach ($result as $row) {
$rows[] = $row;
}
return json_encode($rows);
}