将PHP PDO查询重写为FluentPDO查询问题时出错

时间:2014-05-08 23:04:33

标签: php sql-server pdo

我正在使用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()...

如果我注释掉上面的选择行,它就可以了。否则我收到以下错误。有人熟悉这个图书馆吗?我认为它会在网站上运行。

http://fluentpdo.com/documentation.html#select

2 个答案:

答案 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);
}