【问题标题】:PDOException: SQLSTATE[IMSSP]: Tried to bind parameter number 65536. SQL Server supports a maximum of 2100 parametersPDOException: SQLSTATE[IMSSP]: 尝试绑定参数号 65536。SQL Server 最多支持 2100 个参数
【发布时间】:2017-05-04 23:54:19
【问题描述】:

好的,所以我遇到了一个非常奇怪的 PDOException,我似乎无法理解。这是生成的异常:

PDOException: SQLSTATE[IMSSP]: Tried to bind parameter number 65536.  SQL Server supports a maximum of 2100 parameters. in D:\Work\CEUR16-004\Project\www_root\includes\scripts\php\libCore\products.php:169
Stack trace:
#0 D:\Work\CEUR16-004\Project\www_root\includes\scripts\php\libCore\products.php(169): PDOStatement->execute()
#1 D:\Work\CEUR16-004\Project\www_root\includes\pages\products\products.php(5): ProductCore->build_product_list()
#2 D:\Work\CEUR16-004\Project\www_root\index.php(27): include('D:\\Work\\CEUR16-...')
#3 {main}

这里是它引用的代码:

public function build_product_list()
    {
        // This function builds the product list visible on the main site (guests only)
        try
        {
            if($this->product_type_id == "999")
            {
                $query = 'SELECT sp.product_id, sp.product_name, sp.product_price, pt.product_type_name FROM shop_products AS sp LEFT JOIN product_types AS pt ON sp.product_type_id = pt.product_type_id ORDER BY sp.product_type_id ASC'; // Line 161
            }
            else
            {
                $query = 'SELECT sp.product_id, sp.product_name, sp.product_price, pt.product_type_name FROM shop_products AS sp LEFT JOIN product_types AS pt ON sp.product_type_id = pt.product_type_id WHERE sp.product_type_id = :product_type_id ORDER BY sp.product_id ASC';
            }
            $stmt = $this->dbcore_prod_core->dbc->prepare($query);
            $stmt->bindParam(':product_type_id', $this->product_type_id, PDO::PARAM_INT);
            $stmt->execute(); // Line 169
            // Function continues below...

现在,仅当 $this->product_type_id 等于 999 时才会生成此异常,后者在第 161 行运行查询(在上面的代码中注释)。我已经直接在服务器上运行了查询,它返回了预期的结果,那么为什么 PDO 会抛出异常呢?

【问题讨论】:

    标签: php sql-server pdo


    【解决方案1】:

    我花了几分钟才发现自己做错了什么,但很快就发现我正在尝试将 product_type_id 绑定到在第 161 行调用的查询中不存在的占位符,但是存在于第 166 行的查询中。因此,如果 $this->product_type_id 等于 999,则 PDO 将由于尝试绑定到第 161 行的查询而引发异常,但任何其他时间它都可以正常工作,因为它会尝试在第 166 行运行查询。这需要对代码稍作调整,如下所示:

    public function build_product_list()
        {
            // This function builds the product list visible on the main site (guests only)
            try
            {
                if($this->product_type_id == "999")
                {
                    $query = 'SELECT sp.product_id, sp.product_name, sp.product_price, pt.product_type_name FROM shop_products AS sp LEFT JOIN product_types AS pt ON sp.product_type_id = pt.product_type_id ORDER BY sp.product_type_id ASC'; // Line 161
                    $stmt = $this->dbcore_prod_core->dbc->prepare($query);
                }
                else
                {
                    $query = 'SELECT sp.product_id, sp.product_name, sp.product_price, pt.product_type_name FROM shop_products AS sp LEFT JOIN product_types AS pt ON sp.product_type_id = pt.product_type_id WHERE sp.product_type_id = :product_type_id ORDER BY sp.product_id ASC';
                    $stmt = $this->dbcore_prod_core->dbc->prepare($query);
                    $stmt->bindParam(':product_type_id', $this->product_type_id, PDO::PARAM_INT);
                }
                $stmt->execute(); // Line 169
                // Function continues below...
    

    对于每个条件,都准备好查询。然后,如果调用第二个查询而不是第一个查询,它将仅在该点绑定参数。

    【讨论】:

      猜你喜欢
      • 2021-04-22
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      • 2020-11-10
      • 2022-08-04
      • 2016-11-28
      相关资源
      最近更新 更多