MySQL中的预处理语句是否包含PREPARE和EXECUTE?

时间:2010-01-11 15:29:40

标签: php mysql prepared-statement

我想知道准备好的陈述是否可以按以下方式使用:

 public static function GetCategoryItems($categoryId,$pageNum, &$rnum_pages)
    {
    $sql = 'SELECT DISTINCT COUNT(*) AS items_count
                FROM item I
                JOIN sub_category SC
                ON I.sub_category_id = SC.sub_category_id
                JOIN category C 
                ON C.category_id = SC.category_id
                WHERE (I.location = 2 OR I.location = 3)
                AND C.category_id =' . (int)$categoryId ;
        $params = array (':category_id'=>$categoryId);
        $rnum_pages = Catalog::CalculatePages($sql,$params);
        $first_item = ($pageNum - 1) * ITEMS_PER_PAGE;
            $sql =
         "PREPARE stmt_name FROM 
        'SELECT I.item_id, I.name , I.price, I.discounted_price, I.thumbnail_photo
        FROM item I
        JOIN sub_category SC
        ON I.sub_category_id = SC.sub_category_id
        JOIN category C
        ON C.category_id = SC.category_id
        WHERE C.category_id = ?
        LIMIT ?,? ' ; 

        SET @p1 = categoryId;
        SET @p2 = firstItem;
        SET @p3 = items_per_page;

        EXECUTE stmt_name USING @p1,@p2,@p3; "
        return DatabaseConnection::GetAll($sql,$params);
        }

我实际上收到了错误:

 ERRNO: 256 TEXT: SQLSTATE[HY000]: General error

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:0)

您准备stmt_name但执行stmt - 这只是一个错字吗?

categoryIdfirstNameitems_per_page怎么样?来自哪里?

答案 1 :(得分:0)

PHP Manual的用户评论中,来自“Brian at diamondsea”:

  

SQLSTATE [HY000]:常规错误:2014在其他未缓冲的查询处于活动状态时无法执行查询。 ...

     

花了好几个小时试图找出我们在新服务器上收到此错误的原因后,在其他服务器上运行相同的代码后,我们发现问题是运行旧的MySQL 客户端库在我们的Web服务器上,以及在数据库服务器的盒子上运行的最新版本的MySQL 服务器

     

将Web服务器上的MySQL客户端升级到当前版本,问题就消失了。

答案 2 :(得分:0)

通常,PREPARE和EXECUTE语句是“客户端”操作,DBMS的“服务器端”通常不会看到这些操作。这曾经是一个严格的规则;现在,存储过程等允许动态SQL的东西变得模糊。因此,您在MySQL中尝试的可能性可能,但它看起来很可疑(至少)。

但是,鉴于您遇到问题,我建议将第二块SQL拆分为两个单独的操作 - 并省略PREPARE blurb和EXECUTE blurb。您需要将参数传递给执行拆分SQL的语句(实际上是拆分SQL的执行阶段)。