【问题标题】:Php pdo and offset=0php pdo 和 offset=0
【发布时间】:2017-01-14 10:34:35
【问题描述】:

我正在尝试在 PHP PDO 中构建应用程序。

$sql = 'SELECT * FROM journal where LIMIT :limit OFFSET :offset';  
$res = db_con->prepare($sql);  
$res->bindParam(':limit', $limit, PDO::PARAM_INT);
$res->bindParam(':offset', $offset, PDO::PARAM_INT);
$res->execute();

这是工作。但是如果 $offset=0,我会得到错误

PDOStatement::execute(): SQLSTATE[HY093]: 参数号无效: 绑定变量的数量与中的标记数量不匹配

【问题讨论】:

  • 为什么查询中的“where”语句为空?

标签: php mysql pdo


【解决方案1】:

您的 SQL 查询无效。

你有:

$sql = 'SELECT * FROM journal where LIMIT :limit OFFSET :offset';

正如@Jessie Jackson 指出的那样,为什么“哪里”部分是空的?

以下有效”

$sql = 'SELECT * FROM journal LIMIT :limit OFFSET :offset';

我不明白为什么你会得到你得到的错误:

PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: 绑定变量的数量与标记的数量不匹配

无效 where 语句的错误应该如下所示:

PDOException: SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 'LIMIT 附近使用的正确语法?抵消 ?'在第 1 行的 /path/to/stackoverflow/tmp/pdo.php 第 18 行

绝对可以肯定,以下测试可以正常工作:

<?php

$pdo = new PDO(
    'mysql:dbname=test',
    'yser',
    'pass'
);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

$limit = 0;
$offset = 0;

$sql = 'SELECT * FROM journal LIMIT :limit OFFSET :offset';
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
$res = $stmt->execute();

var_dump($res);
var_dump($stmt->fetchAll());

那么,为什么您会收到该错误与$offset=0 无关。

更新

可能的原因是如果您将PDO::ATTR_EMULATE_PREPARES 设置为true,请阅读Parametrized PDO query and LIMIT clause - not working

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2011-07-27
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多