【问题标题】:pgsql 42601 error with PDO::executePDO::execute 的 pgsql 42601 错误
【发布时间】:2012-01-08 23:39:25
【问题描述】:

我遇到了 $pdo->execute($values) 的问题。

如果我在没有 $values 的情况下使用 $pdo->execute(),它可以正常工作:

$dsn = sprintf('%s:host=%s;port=%s;dbname=%s', DB_TYPE, DB_HOST, DB_PORT, DB_NAME);
$pdo = new PDO($dsn, DB_USER, DB_PASS, array());
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = 'SELECT * FROM "user" ORDER BY id DESC LIMIT 50 OFFSET 0';
$stmt = $pdo->prepare(trim($sql));
$stmt->setFetchMode(PDO::FETCH_OBJ|PDO::FETCH_PROPS_LATE);
$stmt->execute();

echo "<pre>";
print_r($stmt->fetchAll());
echo "</pre>";

它工作正常,但是当我想添加值替换时:

$dsn = sprintf('%s:host=%s;port=%s;dbname=%s', DB_TYPE, DB_HOST, DB_PORT, DB_NAME);
$pdo = new PDO($dsn, DB_USER, DB_PASS, array());
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = 'SELECT * FROM "user" ORDER BY ? ? LIMIT 50 OFFSET 0';
$values = array('id','DESC');

$stmt = $pdo->prepare(trim($sql));
$stmt->setFetchMode(PDO::FETCH_OBJ|PDO::FETCH_PROPS_LATE);
$stmt->execute($values);

echo "<pre>";
print_r($stmt->fetchAll());
echo "</pre>";

它不起作用。它返回:

SQLSTATE[42601]:语法错误:7 错误:“$2”或附近的语法错误 第 1 行:SELECT * FROM "user" ORDER BY $1 $2 LIMIT 50 OFFSET 0 ^' in ...

【问题讨论】:

  • 没有意识到你实际上可以在 order by 子句中使用 bind vars,我认为这就像为表名绑定 vars

标签: php postgresql pdo


【解决方案1】:

如果 order by 子句中有多个列,ORDER BY 需要一个以逗号分隔的列列表

【讨论】:

  • 非常感谢。就是这么简单;))
猜你喜欢
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多