我正在使用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构建查询时,我似乎无法使用select方法。我收到了后面的错误。
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);
}
未捕获的例外&#39;例外&#39;使用消息&#39; SelectQuery :: getIterator()返回的对象必须是可遍历的或实现接口迭代器&#39; in .... {remove} ... FluentPDO / SelectQuery.php:116 ... SelectQuery :: fetchAll()...
如果我注释掉上面的选择行,它就可以了。否则我收到以下错误。有人熟悉这个图书馆吗?我认为它会在网站上运行。
答案 0 :(得分:1)
我不知道这个图书馆但是我在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;
}
答案 1 :(得分:0)
我想我刚刚找到了答案。选择“*”需要先清除。以下似乎有效。
->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);
}