需要有关MySQL查询的帮助

时间:2011-05-08 12:05:49

标签: mysql stored-procedures

我正在尝试执行存储过程中包含的以下查询语句 - 所有P ...都是SP的参数(ex PInitialDateFrom)。

SET @stmt_text = CONCAT('SELECT AccountID, Firstname as ClientName, EmailID
                 , ProductID, InitialPurchaseDate as Purchasedate 
                 FROM client_account 
                 WHERE IsRemoved = 0 
                 AND (InitialPurchasedate between ? and ?) 
                 AND ProductId IN (?)');

PREPARE stmt FROM @stmt_text;

SET @initDt1=PInitialDateFrom, @initDt2 = PInitialDateTo, @inlist=PIDs
    , @stmt_text = null;

EXECUTE stmt USING @initDt1, @initDt2, @inlist;

DEALLOCATE PREPARE stmt;

我将PID作为一串id,如1,2,3传递 当我尝试执行语句时,只考虑第一个id。对于前者1,2,3仅使用1,如果使用3,2,1则仅采用3。

有人能说出这个查询有什么问题吗?

2 个答案:

答案 0 :(得分:2)

您无法使用此部分:

and ProductId in (?)

请记住:SQL参数与C宏不同,您只是在进行字符串替换。它们不仅仅是:当您使用?时,会绑定一个且仅有一个参数。因此,当您尝试将1,2,3绑定到该参数时,它不像您尝试绑定三个值而只是一个值。

如果您的列表大小固定,您可以使用:

and ProductId in (?,?,?)

否则,我认为你不能使用该子句的参数。也许做类似的事情:

set @initDt1=PInitialDateFrom, 
    @initDt2 = PInitialDateTo, 
    @inlist=PIDs,  
    @stmt_text = null;
set @stmt_text = 
   concat('Select AccountID, Firstname as ClientName, EmailID, ProductID
     , InitialPurchaseDate as Purchasedate from client_account 
     where IsRemoved=0 and (InitialPurchasedate between ? and ?) 
     and ProductId in (', @inlist, ')');
prepare stmt from @stmt_text;
execute stmt using @initDt1, @initDt2;
deallocate prepare stmt;

确保清理PIDs的输入,这样就不会在代码中添加SQLInjection漏洞。

答案 1 :(得分:0)

你应该这样说:

and ProductID = (?)

我希望它有效。