2016-06-28 47 views
1

工作,我写了一个存储过程的报告,它工作正常与MySQL,但是当我把它从PHP,我得到一个错误:存储过程与MySQL,但与PHP收到错误

SQLSTATE[42000]: Syntax error or access violation: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1

PHP:

$crm_reports = "CALL CRM_Report_Total_Prize_Redemption('".$CrmreportsFromDate."','".$CrmreportsToDate."',$CampaignID);"; 
$total_prize = Yii::app()->db->createCommand($crm_reports)->queryAll(); 

这里是我的存储过程

CREATE DEFINER=`esp_reward`@`%` PROCEDURE `CRM_Report_Total_Prize_Redemption`(
         IN v_StartDate DATETIME, 
         IN v_EndDate DATETIME, 
         IN v_CampaignID INT 
        ) 
BEGIN 
    DROP TEMPORARY TABLE IF EXISTS temp_prize_redemption; 
    CREATE TEMPORARY TABLE temp_prize_redemption (
      ItemID INT(10) 
      ,Qty INT(11) 
      ,BenefitName VARCHAR(500) 
    ); 
    /************************************* Item Data ****************************/ 
    SET @v_SelectPhysicalItemForPickWin = CONCAT(" SELECT cpw.ItemID AS PrizeID,cpw.Benefit AS BenefitName 
       ,COUNT(DISTINCT PickWinWinnerID) AS Qty 
       ,cpw.VoucherID,cpw.VoucherAmount,cpc.CampaignName 
       FROM crm_promotion_campaign AS cpc 
       INNER JOIN crm_receipt AS cr ON cr.CampaignID = cpc.CampaignID 
       INNER JOIN crm_pickwin_winner AS cpw ON cpw.PickWinID = cr.PickWinID 
       WHERE 1 AND cpc.CampaignID = ",v_CampaignID," AND cpw.BenefitType = '1' 
       GROUP BY PrizeID ");   

    SET @v_SelectPhysicalItemForPromotion = CONCAT(" SELECT crb.ItemID AS PrizeID,crb.BenefitName 
       ,COUNT(DISTINCT ID) AS Qty,crb.VoucherID,crb.VoucherAmount,cpc.CampaignName 
       FROM crm_promotion_campaign AS cpc 
       INNER JOIN crm_receipt AS cr ON cr.CampaignID = cpc.CampaignID AND cr.TypeID = '1' 
       INNER JOIN crm_receipt_benefit AS crb ON crb.PromotionID = cr.PromotionID 
       WHERE 1 AND cpc.CampaignID = ",v_CampaignID," AND crb.BenefitTypeID = '1' 
       GROUP BY PrizeID "); 

    SET @ItemData = CONCAT(" SELECT PrizeID,SUM(Qty) AS Total,BenefitName FROM (",@v_SelectPhysicalItemForPickWin," UNION ",@v_SelectPhysicalItem, ") AS ItemData GROUP BY PrizeID ");   

    SET @v_data = CONCAT("INSERT INTO temp_prize_redemption", @ItemData); 
    PREPARE s1 FROM @v_data; 
    EXECUTE s1; 
    DEALLOCATE PREPARE s1; 
    /************************************* e-Voucher Data ****************************/ 
    SET @v_SelecteVoucherForPickWin = CONCAT(" SELECT cpw.VoucherID AS PrizeID,cpw.Benefit AS BenefitName 
       ,COUNT(DISTINCT VoucherID) AS Qty 
       ,cpw.VoucherID,cpw.VoucherAmount,cpc.CampaignName 
       FROM crm_promotion_campaign AS cpc 
       INNER JOIN crm_receipt AS cr ON cr.CampaignID = cpc.CampaignID 
       INNER JOIN crm_pickwin_winner AS cpw ON cpw.PickWinID = cr.PickWinID 
       WHERE 1 AND cpc.CampaignID = ",v_CampaignID," AND cpw.BenefitType = '3' 
       GROUP BY PrizeID ");   

    SET @v_SelecteVoucherForPromotion = CONCAT(" SELECT crb.VoucherID AS PrizeID,crb.BenefitName 
       ,COUNT(DISTINCT VoucherID) AS Qty,crb.VoucherID,crb.VoucherAmount,cpc.CampaignName 
       FROM crm_promotion_campaign AS cpc 
       INNER JOIN crm_receipt AS cr ON cr.CampaignID = cpc.CampaignID AND cr.TypeID = '1' 
       INNER JOIN crm_receipt_benefit AS crb ON crb.PromotionID = cr.PromotionID 
       WHERE 1 AND cpc.CampaignID = ",v_CampaignID," AND crb.BenefitTypeID = '3' 
       GROUP BY PrizeID "); 

    SET @eVoucherData = CONCAT(" SELECT PrizeID,SUM(Qty) AS Total,BenefitName FROM (",@v_SelecteVoucherForPickWin," UNION ",@v_SelecteVoucherForPromotion, ") AS ItemData GROUP BY PrizeID ");   

    SET @v_data = CONCAT("INSERT INTO temp_prize_redemption", @eVoucherData); 
    PREPARE s2 FROM @v_data; 
    EXECUTE s2; 
    DEALLOCATE PREPARE s2; 
    /************************************* Physical Voucher Data ****************************/ 
    SET @v_SelectPhysicalVoucherForPickWin = CONCAT(" SELECT cpw.VoucherAmount AS PrizeID,cpw.Benefit AS BenefitName 
       ,COUNT(DISTINCT VoucherAmount) AS Qty 
       ,cpw.VoucherID,cpw.VoucherAmount,cpc.CampaignName 
       FROM crm_promotion_campaign AS cpc 
       INNER JOIN crm_receipt AS cr ON cr.CampaignID = cpc.CampaignID 
       INNER JOIN crm_pickwin_winner AS cpw ON cpw.PickWinID = cr.PickWinID 
       WHERE 1 AND cpc.CampaignID = ",v_CampaignID," AND cpw.BenefitType = '2' 
       GROUP BY PrizeID ");   

    SET @v_SelectPhysicalVoucherForPromotion = CONCAT(" SELECT crb.VoucherAmount AS PrizeID,crb.BenefitName 
       ,COUNT(DISTINCT VoucherAmount) AS Qty,crb.VoucherID,crb.VoucherAmount,cpc.CampaignName 
       FROM crm_promotion_campaign AS cpc 
       INNER JOIN crm_receipt AS cr ON cr.CampaignID = cpc.CampaignID AND cr.TypeID = '1' 
       INNER JOIN crm_receipt_benefit AS crb ON crb.PromotionID = cr.PromotionID 
       WHERE 1 AND cpc.CampaignID = ",v_CampaignID," AND crb.BenefitTypeID = '2' 
       GROUP BY PrizeID "); 

    SET @PhysicalVoucherVoucherData = CONCAT(" SELECT PrizeID,SUM(Qty) AS Total,BenefitName FROM (",@v_SelectPhysicalVoucherForPickWin," UNION ",@v_SelectPhysicalVoucherForPromotion, ") AS ItemData GROUP BY PrizeID ");   

    SET @v_data = CONCAT("INSERT INTO temp_prize_redemption", @PhysicalVoucherVoucherData); 
    PREPARE s3 FROM @v_data; 
    EXECUTE s3; 
    DEALLOCATE PREPARE s3; 
    SELECT * FROM temp_prize_redemption; 
    END$$ 

任何人都可以请看看这和Ca n给我任何提示,所以我可以解决这个问题

+0

由于您在问一个PHP问题,可能是在您实际执行查询的地方添加了包含您的PHP代码的部分? – Blizz

+0

当你从php调用它时回声呼叫声明,然后从MySQL运行相同。它会帮助你调试。 –

+0

@Dipanwita Kundu我做了同样的工作与mysql – Nikul

回答

1

这应该是一个评论,但它有点长。

当我有一两个星期的空余时间时,我会开始尝试理解你的SQL - 但是有一些用于PREPARE/EXECUTE的用例,这似乎并不是其中之一。

您的PHP代码还有(仍然)关键部分丢失。

您的插入语句没有明确指出输入应该匹配的列(并非总是致命的)。

通过随机的机会有人会发布此匹配你的问题,但在不发生的情况下,你应该减少你的SQL和PHP下来重现故障所需的最小的解决方案。

+0

谢谢@symcbean现在正在工作 – Nikul