gpt4 book ai didi

php - pdo-odbc 不适用于绑定(bind)值,nvarchar 和文本在等于运算符中不兼容

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:48:00 25 4
gpt4 key购买 nike

有一列url(nvarchar(200), not null)

<?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、unixodbc 2.2.14、freetds 0.91、sql-server-2012、centos-x64 6.4

更新:

似乎是一个bug .我找到了这个 patch , 但仅适用于 ODBC Driver 11 for SQL Server (我尝试使用 FreeTDS,但没有成功)。我设法从源代码安装了 PHP,应用了这个补丁,并将 FreeTDS 更改为 ODBC Driver 11 for SQL Server;现在正在工作。

  • php 5.4.15
  • unixODBC 2.3.0
  • 用于 SQL Server 的 ODBC 驱动程序 11
  • sql-server-2012
  • centos-x64 6.4

最佳答案

对此做了相当多的研究,pdo_odbc 似乎在 64 位架构上有问题:它是用 32 位 SQLLEN 和 SQLULEN 大小构建的。微软的驱动程序曾经是这样构建的,这可能是 PHP 效仿的原因。 MS 已经开始正确地遵循 ODBC 规范,但显然 PHP 还没有。

问题中引用的补丁修复了 PHP 源代码中的一个这样的问题,但似乎不是所有这样的问题。使用 MS 驱动程序和打过补丁的 PHP,我仍然无法运行准备好的语句。

其实我在使用Easysoft的驱动的时候也发现了同样的问题,通过和他们的问题交谈发现pdo_odbc是罪魁祸首。他们能够为我提供使用 32 位大小构建的 64 位驱动程序,并且工作正常。

在 64 位 PHP 被修补以使用 64 位 SQLLEN 和 SQLULEN 大小之前,最好的免费解决方案似乎是使用 32 位 PHP 和 ODBC 驱动程序。

关于php - pdo-odbc 不适用于绑定(bind)值,nvarchar 和文本在等于运算符中不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16532694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com