sql server -错误重写PHP PDO查询到FluentPDO查询问题


sql server - Error rewriting PHP PDO query to FluentPDO query issue

我使用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);
}