У вас есть ошибка в вашем синтаксисе SQL; - PullRequest
0 голосов
/ 12 декабря 2011

Пока мой код

        $limitText ="";
        if($history_length){
            $limitText = ' limit '. $history_length;
        }

        if(!$history_days){
            $history_days = '180';
        }
$db = $this->getInvokeArg('bootstrap')->getPluginResource('db')->getDbAdapter();
        //changing code to add min(currBalance) -- as sum(points) is valid only for debit. Also sort by desc instead of  (major bug)
        $history_stmt = $db->query("SELECT sum(points) as points,credit_date,min(currBalance) as currBalance,extRefId,transactedAt,pointType FROM credits where userid = '".$userid."' and credit_date >= date('now','-".$history_days." days')  group by extRefID,pointType order by creditid desc ".$limitText);
        $history_results = $history_stmt->fetchall();

        $expiry_stmt = $db->query("SELECT availablePoints,expiry_date FROM credits where userid = '".$userid."'and availablePoints > 0 and expiry_date <= date('now','+".$expiry_duration." days') order by expiry_date asc ");
        $expiry_results = $expiry_stmt->fetchall();

Я получил ошибку

<b>Message:</b> 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 ''-180 days')  group by extRefID,pointType order by creditid desc' at line 1  </p>

что я могу сделать, я не могу оштрафовать решение

1 Ответ

5 голосов
/ 12 декабря 2011

Кажется, вы используете MySQL Date функцию неправильно - вы действительно планировали использовать вместо этого функцию php date ?Например, вместо

"[...] credit_date >= date('now','-".$history_days." days')  group by [...]"

вам нужно написать:

 "[...] credit_date >= '".date('-'.$history_days.' days')."' group by [...]"

Только переменные (например, $ history_days) будут расширены на php в строке, заключенной в двойные кавычки ("), но не вызовы функций. Если вы заключили вызов функции в строку, php не сможет его распознать, и он будет передан в mysql вместо того, чтобы сначала выполняться php, но вы хотите, чтобы php его оценил, поэтомувам придется исключить ее из строковой константы и добавить к ней строку с операторами конкатенации (.).

Однако вызов функции php date также кажется неправильным; получить "текущую дату минус"определенное количество дней ", лучше всего использовать функции даты mysql, например:

 "[...] credit_date >= DATE_SUB(NOW(), INTERVAL '$history_days' DAY) group by [...]"

И только одно общее замечание о безопасности: из фрагмента сценария, который вы предоставляете, не ясно, но если значения в$history_days, $history_length, $user_id или $expiry_duration (переменные, используемые внутри оператора SQL) имеют только самый отдаленный шанс быть установленным пользователем, вы не должны вставлять их непосредственно в SQL-запрос., но сделать что-нибудь, чтобы предотвратить внедрение SQL .

...