Запуск хранимых процедур MSSQL через ODBC (и получение результатов обратно) с PHP - PullRequest
5 голосов
/ 30 сентября 2010

Моя работа находится в процессе переноса всех наших веб-приложений PHP с нашего производственного веб-сервера Windows на новую серверную среду Linux специально для приложений PHP. Важно отметить, что некоторые приложения PHP, которые мы запускаем, используют базы данных MSSQL, и, следовательно, все соединения с БД должны быть переписаны для использования unixODBC / FreeTDS, так как PHP в Linux не поддерживает mssql_connect () и это связано функции.

Я отключил соединение, и базовые запросы выполняются нормально. У меня проблема с запуском хранимых процедур и репликацией функций mssql_init () / mssql_bind () / mssql_execute () через ODBC.

Проблемная область, над которой я работаю, следующая:

$sp = mssql_init('sp_Search', $this->_link);
mssql_bind($sp, '@search', $this->_searchString, SQLVARCHAR);
$results = mssql_execute($sp);

Я много читал о различных функциях ODBC и MSSQL. Я пытался использовать функции odbc_prepare () / odbc_execute (), но безрезультатно (я всегда получаю коды ошибок HY000 с сервера SQL). Самое близкое, что я пришел, это:

$results = odbc_exec($this->_link, "EXEC sp_Search @search='@this->_searchString'");

Выполнение этого запроса ("EXEC sp_Search @ search = 'blah'") через консоль управления MSSQL работает отлично, но через PHP это работает, но если я пытаюсь извлечь строки из набора результатов, я получаю " Нет кортежей, доступных по этому индексу «ошибки». И odbc_next_result () возвращает false независимо от того, что.

Я также попытался установить курсор на соединение с SQL_CUR_USE_ODBC, но это тоже не помогло. У кого-нибудь есть опыт в этом? Возможно ли это вообще или эта функция просто недоступна без встроенного драйвера MSSQL?

Edit:

Просто чтобы уточнить, я пытался использовать odbc_prepare () и odbc_execute () следующим образом:

$results = odbc_prepare($this->_link, "{CALL sp_Search(?)}");
$params = array($this->_searchString);
odbc_execute($results, $params);

Это приводит к следующей ошибке:

Warning: odbc_execute(): SQL error: Failed to fetch error message, SQL state HY000 in SQLExecute

1 Ответ

3 голосов
/ 11 августа 2015

Вот объектно-ориентированный метод, использующий PDO, который является немного более безопасным.

Обратите внимание, что здесь используется синтаксис для SQL Server 2012. Основное различие заключается в вашем операторе SQL (вам не нужны скобкивокруг? s, и вы используете EXEC, а не CALL).

Кроме того, в этом примере объект $ dbconn предполагает, что у вас есть правильно настроенный файл odbc.ini и допустимая конфигурация ODBC (это может быть сложно в зависимости от вашего дистрибутива ... Для рабочего кода из этого примера,За всем этим я установил FreeTDS на коробке CentOS. Подробнее см. https://serverfault.com/a/622088.

$dbconn = new PDO("odbc:YOUR_DB", "YOUR_USER", "YOUR_PASS");

  // Set up some useful error reporting.
  $dbconn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    $sql = "EXEC [data_mart].[dbo].[your_stored_procedure] ?,?,?";
    $stmt = $dbconn->prepare($sql);
    $id = 1;
    $start_date = "2015-08-01"
    $end_date = "2015-08-02";
    $stmt->bindParam(1, $id);
    $stmt->bindParam(2, $start_date);
    $stmt->bindParam(3, $end_date);
    $stmt->execute();
    $results = $stmt->fetchAll();

    // Quick dump to show that it worked.
    var_dump($results);

} catch (PDOException $e) {
  echo 'An error occured: ' . $e->getMessage();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...