mssql_bind пустая строка, преобразующая в NULL - PullRequest
1 голос
/ 08 октября 2009

В настоящее время я использую хранимые процедуры SQL Server 2000 с PHP. Следуя документации PHP, я использую mssql_bind , чтобы назначить значение параметров, а затем выполнить хранимую процедуру.

Проблема в том, что я получил эту ошибку , которая не позволяет мне привязывать пустые строки к параметрам (они преобразуются в NULL при вызове Stored Proc)

Мне не нужно преобразовывать каждый параметр внутри хранимых процедур, чтобы проверить, имеет ли его значение NULL, затем преобразовать обратно в пустую строку. Я хочу иметь возможность использовать пустые строки, а также NULL, которые оба имеют свое значение.

Кто-нибудь знает обходной путь для этого в PHP? Веб-сайт с ошибками в PHP не очень понятен, если эта ошибка исправлена ​​или когда она будет исправлена, я использую PHP 5.2.11 (последняя версия из ветки 5.2)

Ответы [ 4 ]

0 голосов
/ 16 июля 2010

У меня есть решение, которое будет работать.

Я использую ADODB (но это не имеет значения) и взломал драйвер mssql (adodb-mssql.inc.php в папке драйверов adodb5).

вот код

if($var === ''){
        //stupid hack to prevent mssql driver from converting empty strings to null. now they arent empty strings but they will get trimmed down to legth 0 ;-)
        $var = ' ';
        $type = SQLVARCHAR;
        $isNull = false;
        $maxLen = 0;
    }

просто проверьте, пытаетесь ли вы привязать пустую строку и измените ли вы ее на непустую. не имеет значения, какое значение вы используете, я просто использую пробел.

сделать тип sqlvarchar isnull должен быть ложным, и теперь хитрость заключается в том, чтобы сделать maxlen 0, чтобы драйвер mssql обрезал вашу строку до пустой строки.

эти переменные должны быть переданы в функцию mssql_bind, если это не было очевидно.

0 голосов
/ 27 октября 2009

У меня лично нет сервера MSSQL, доступного для тестирования, но вы пытались использовать PDO вместо mssql напрямую?

PDOStatement->bindValue( mixed $parameter  , mixed $value  [, int $data_type  ] )

bindValue ()

Да, я понимаю, что PDO - это только оболочка, но кто знает, может работать! :)

0 голосов
/ 28 октября 2009

Предполагая, что вы не хотите делать то, что предлагали, вам доступны следующие варианты:

  1. Загрузите снимок cvs php и установите его, если это возможно, посмотрите, исправлено ли оно.Если это невозможно сделать или исправить с помощью cvs, то ...
  2. Используйте системные вызовы () или exec () для использования хранимых процедур.Если слишком много хлопот, то ...
  3. Не используйте хранимые процедуры, выполняйте свои функции в php или другом скриптовом коде.
  4. Измените хранимую процедуру, чтобы принять другое значение для строк ''и преобразовать ТО в строку ''.
  5. Делай то, что не хотел делать.Суров: P Но я не вижу другого пути.
0 голосов
/ 09 октября 2009

Ошибка # 44325 предложила патч для решения проблемы, но это не было правильным решением, так как, похоже, проблема в ntwdblib.dll, а не в коде расширения php_mssql.

См. Комментарий от alexr на oplot dot com:

Извините. Эта ошибка не исправлена. это это ошибка ntwdblib.dll. А также после последних обновлений ошибка вернуться.

Когда я связываю пустую строку, сохраненные процедура получила chr (0) char вместо пустой строки.

Пожалуйста, откатите последние исправления. Этот баг невосстановим.

Учитывая это, я не уверен, что можно многое сделать на стороне PHP: - (

В прошлый раз, когда я работал с PHP + MSSQL в Windows, у меня было довольно много проблем, вроде некоторых, действительно похожих на эту; - (

Может быть, одним из возможных решений для вас может быть переход на более новый Драйвер SQL Server для PHP ? Обратите внимание, что это работает только на Windows, хотя ...

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