2013-05-13 2 views
4

Существует столбец url(nvarchar(200), not null)PDO-ODBC не работает йот значения связывания, NVARCHAR и текст несовместимы в равной оператору

<?php 
// 
$pdo = new PDO('odbc:mssql', 'xxx', 'yyy'); 
$pdo->setAttribute(PDO::ATTR_PERSISTENT, false); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); 

// plain sql query: WORKS FINE! 
$sth = $pdo->prepare("SELECT COUNT(*) FROM pagina WHERE url = '/webito'"); 
$sth->execute(); 

// using bindValue: ERROR! 
$sth = $pdo->prepare("SELECT COUNT(*) FROM pagina WHERE url = :unique_value"); 
$sth->execute(array('unique_value' => '/webito')); 

Возвратившись ошибка:

Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 402 [FreeTDS][SQL Server]The data types nvarchar and text are incompatible in the equal to operator. (SQLExecute[402] at /builddir/build/BUILD/php-5.4.15/ext/pdo_odbc/odbc_stmt.c:254) in /root/php/test.php on line 13 

Является ли это ошибка ?

Использование: PHP 5.4.15, 2.2.14 UnixODBC, FreeTDS 0,91, SQL-сервера 2012, CentOS-x64 6.4

Обновление:

кажется, bug. Я нашел это patch, но работает только с ODBC Driver 11 for SQL Server (я пробовал с FreeTDS, не повезло). Мне удалось установить PHP из исходного кода с применением этого патча и изменено с FreeTDS на ODBC Driver 11 для SQL Server; теперь работает.

  • PHP 5.4.15
  • UnixODBC 2.3.0
  • ODBC Driver 11 для SQL Server
  • SQL-сервера 2012
  • CentOS-x64 6,4
+0

Ну, похоже, ошибка. Теперь я пытаюсь скомпилировать PHP с патчем, который я нашел. – Luistar15

ответ

0

же здесь ошибка :

PDOStatement::execute(): SQLSTATE[22001]: String data, right truncated: 0 [Microsoft][SQL Server Native Client 11.0]Die Zeichenfolgedaten wurden rechts abgeschnitten (SQLExecute[0] at ext\pdo_odbc\odbc_stmt.c:254) 

Win7 64bit, PHP 5.4.12, SQL Server Express 2012, ODBC 11 для SQL Server

1

Проведя справедливое исследование, кажется, что pdo_odbc неисправен на 64-разрядных архитектурах: он построен с 32-разрядным SQLLEN и SQLULEN. Драйвер Microsoft был построен таким образом, и, вероятно, именно поэтому PHP следовал примеру. MS с тех пор начали правильно следовать спецификации ODBC, но, по-видимому, PHP этого не сделал.

Патч, на который ссылается вопрос, исправляет одну из таких проблем в источнике PHP, но, похоже, не все такие проблемы. Используя драйвер MS и исправленный PHP, я все еще не мог запускать подготовленные инструкции.

Я действительно нашел ту же проблему при использовании драйвера Easysoft, и, обсуждая проблемы с ними, обнаружил, что pdo_odbc является виновником. Они смогли предоставить мне 64-битный драйвер, построенный с использованием 32-разрядных размеров, и это отлично работает.

До 64-битного PHP исправлено использование 64-разрядных SQLLEN и SQLULEN размеров, это выглядит как лучшее бесплатное решение для использования 32-битных драйверов PHP и ODBC.

+0

Для справки: Еще проблема с Ubuntu 14.04 php 5.5.9. Я получаю «Недопустимое значение символа для спецификации литья». Обсуждается в http://connect.microsoft.com/SQLServer/feedback/details/737751/cannot-bind-parameters-with-php-pdo-odbc-and-sql-native-client-11-0 – Jim

+0

Просто найден с использованием odbc_connect , odbc_prepare работает с запросами и хранимыми процедурами, используя MSSQL Driver 11 – Jim