Хранимая процедура, которая не работает в моем коде PHP, но работает с клиентом SQL - PullRequest
0 голосов
/ 25 июня 2018

Я работаю над бизнес-монитором (панелью с некоторыми метриками).Чтобы получить эти данные, я делаю запрос SQL.Кстати, я использовал хранимую процедуру.Мой код:

public function execErrorWarnLogs($id){
        try {
            $sql = "exec [BUSINESS_MONITOR_LOGS] @id='".$id."'";            
            $req = $this->_bdd->prepare($sql);
            $req->execute();
            $res =  $req->fetchAll(PDO::FETCH_ASSOC);
            $req->closeCursor();

            return $res;
        } catch (Exception $e) {
            echo $e->getMessage();
        }
    }

Когда я пытаюсь получить данные, проиндексированные $ id, у меня возникают проблемы.Я получил массив с нулевыми значениями ... Однако, если я выполню эту хранимую процедуру с клиентом SQL, я получу результаты.

Это уже произошло с кем-то здесь?Может кто-нибудь объяснить мне, почему я это понимаю?

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Моя хранимая процедура: CREATE PROCEDURE BUSINESS_MONITOR @id VARCHAR (50) AS
НАЧАТЬ

SET NOCOUNT ON;
SELECT e.METRIC_NAME, e.METRIC_VALUE
FROM MONITOR_EVENTS e
WHERE e.MAIN_ID = @id

END

0 голосов
/ 25 июня 2018

Есть еще две возможные причины:

  1. Проблема кодирования

Я предполагаю, что у вас есть проблема с кодировкой.Если $ id содержит символы, которые находятся вне диапазона ascii, и у вас есть другая кодировка, это может привести к сбою запроса.Так что проверьте кодировку $ id и ваше соединение с БД

Пробелы в $ id

Возможно, у вас есть пробелы в вашем идентификаторе.

0 голосов
/ 25 июня 2018

Является ли $ id целым числом или строкой?

Попробуйте вместо этого использовать связанный параметр. Вот пример того, как это прекрасно работает в моем коде:

public function execErrorWarnLogs($id){
    try {
        $sql = "exec BUSINESS_MONITOR_LOGS @id=:id";            
        $req = $this->_bdd->prepare($sql);
        $req->execute([
             'id' => $id
        ]);
        $res =  $req->fetchAll(PDO::FETCH_ASSOC);
        $req->closeCursor();

        return $res;
    } catch (Exception $e) {
        echo $e->getMessage();
    }
}

Вы также должны использовать параметры в целях безопасности!

Две заметки на сайте:


Если вы выполняете интерполяцию строк, вам не нужно готовить оператор. Тогда вы можете просто сделать:

$req = $this->_bdd->query($sql);
$res = $req->fetchAll(PDO::FETCH_ASSOC);

Но рекомендуемый подход (для безопасности) заключается в предоставлении значений в качестве связанных параметров и подготовке запроса.


Насколько я знаю, вам не нужен $ req-> closeCursor (), если вы используете последний драйвер pdo от Microsoft для MSSQL. Необходимость в closeCursor зависит от используемого вами драйвера.

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