Нужна помощь с запросом MySQL - PullRequest
2 голосов
/ 08 мая 2011

Я пытаюсь выполнить следующую инструкцию запроса, содержащуюся в хранимой процедуре - где все 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 в виде строкиидентификаторы как 1,2,3 Когда я пытаюсь выполнить инструкцию, рассматривается только первый идентификатор.НапримерИспользуется 1,2,3, используется только 1, если используется 3,2,1, используется только 3.

Кто-нибудь может сказать, что не так с этим запросом?

Ответы [ 2 ]

2 голосов
/ 08 мая 2011

Вы не можете использовать эту часть:

and ProductId in (?)

Помните: параметры SQL не похожи на C макросы, где вы просто выполняете замену строк.Они больше, чем thar: Когда вы используете ?, один и только один параметр привязывается.Таким образом, когда вы пытаетесь связать 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 в свой код.

0 голосов
/ 08 мая 2011

Вы должны поставить это так:

and ProductID = (?)

Я надеюсь, что это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...