gpt4 book ai didi

php - “PDOException”消息“SQLSTATE[22001] : String data, 右截断:0

转载 作者:IT王子 更新时间:2023-10-28 23:45:45 27 4
gpt4 key购买 nike

注意:我已将此问题缩小到具体的 PDO,因为我能够使用 odbc_* 成功地准备和执行语句。功能。

为什么我不能将此参数绑定(bind)到 PDO 准备语句?

这行得通:

$mssqldriver = 'ODBC Driver 13 for SQL Server';
$pdoDB = new PDO("odbc:Driver=$mssqldriver;Server=$hostname;Database=$dbname", $username, $password);
$pdoDB->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$sql = "SELECT 'value' AS col where 'this' = 'this'";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);
print_r($stmt->fetch());
Array ( [col] => value [0] => value )

不起作用:

$sql = "SELECT 'value' AS col where 'this' = ?";
$stmt = $pdoDB->prepare($sql);
$params = ['this'];
$stmt->execute($params);
print_r($stmt->fetch());

Web 服务器正在 Linux Ubuntu 14.04 上运行 PHP 5.5.9,并使用适用于 SQL Server 的 ODBC 驱动程序 13 并连接到 Windows Server 2012 上的 Microsoft SQL Server 2012

这是完整的错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22001]:
String data, right truncated: 0
[Microsoft][ODBC Driver 13 for SQL Server]
String data, right truncation
(SQLExecute[0] at /build/buildd/php5-5.5.9+dfsg/ext/pdo_odbc/odbc_stmt.c:254)' in /var/www/scratch.php:46
Stack trace:
#0 /var/www/scratch.php(46): PDOStatement->execute(Array)
#1 {main} thrown in /var/www/scratch.php on line 46

我也试过设置:

$pdoDB->setAttribute( PDO::ATTR_EMULATE_PREPARES, true );

并使用命名参数:

$sql = "SELECT 'value' AS col where 'this' = :myVal";
$stmt = $pdoDB->prepare($sql);
$params = ['myVal' => 'this'];
$stmt->execute($params);
print_r($stmt->fetch());

即使有明确的冒号:

$params = [':myVal' => 'this'];

我也试过只使用 bindParamthis answer 中所示:

$sql = "SELECT 'value' AS col where 'this' = ?";
$stmt = $pdoDB->prepare($sql);
$param = 'this';
$stmt->bindParam(1, $param);
$stmt->execute();
print_r($stmt->fetch());

以及命名参数:

$sql = "SELECT 'value' AS col where 'this' = :myVal";
$stmt = $pdoDB->prepare($sql);
$param = 'this';
$stmt->bindParam(':myVal', $param, PDO::PARAM_STR);
$stmt->execute();
print_r($stmt->fetch());

如果我尝试明确设置长度:

$stmt->bindParam(':myVal', $param, PDO::PARAM_STR, 4);

我得到一个额外的错误:

Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[42000]: Syntax error or access violation: 102
[Microsoft][ODBC Driver 13 for SQL Server][SQL Server]
Incorrect syntax near 'OUTPUT'.

是的,所有这些都是一个没有表格的简单示例,因此您可以轻松地复制它,但可以肯定的是,我实际上已经用一个真实的表格进行了尝试。

CREATE TABLE myTable (
id INT IDENTITY PRIMARY KEY,
val NVARCHAR(255)
);
INSERT INTO myTable (val) VALUES ('hello world');

作品:

$sql = "SELECT * FROM myTable WHERE val = 'hello world'";
$stmt = $pdoDB->prepare($sql);
$params = [];
$stmt->execute($params);
print_r($stmt->fetch());
Array ( [id] => 1 [0] => 1 [val] => hello world [1] => hello world )

不起作用:

$sql = "SELECT * FROM myTable WHERE val = ?";
$stmt = $pdoDB->prepare($sql);
$params = ['hello world'];
$stmt->execute($params);
print_r($stmt->fetch());

所有路径都会导致相同的错误:

String data, right truncated

最佳答案

很遗憾,

这是一个 PDO_ODBC 64 位不兼容问题(#61777#64824),毫无疑问,您使用的是 64 位版本,不允许您绑定(bind)参数。

幸运的是,

It has a patch首次包含在 5.6 版本中:

This bug is also referenced in #61777 and is still present in the latest stable release of the 5.5 branch. I see two tickets exist for this problem already, and I'm just submitting these changes via github as a reminder that this is a serious problem for anyone using PDO_ODBC on the x64 builds.

您的 PHP 附带的 PDO_ODBC 有什么问题?

通过查看推荐的补丁之一:

diff --git a/ext/pdo_odbc/odbc_stmt.c b/ext/pdo_odbc/odbc_stmt.c
index 8b0ccf3..1d275cd 100644
--- a/ext/pdo_odbc/odbc_stmt.c
+++ b/ext/pdo_odbc/odbc_stmt.c
@@ -551,7 +551,7 @@ static int odbc_stmt_describe(pdo_stmt_t *stmt, int colno TSRMLS_DC)
struct pdo_column_data *col = &stmt->columns[colno];
RETCODE rc;
SWORD colnamelen;
- SDWORD colsize;
+ SQLULEN colsize;
SQLLEN displaysize;

我们看到唯一改变的是 SDWORD(16 位有符号整数),它被替换为新的 ODBC 类型 SQLULEN,即 64 bits in a 64-bit ODBC application and 32 bits in a 32-bit ODBC application .

我相信提交者不知道 colsize 数据类型只是因为在下一行 SQLLEN 被正确定义。

我现在该怎么办?

  1. 升级到 PHP 版本 >= 5.6
  2. 坚持使用 odbc_* 功能作为可行的解决方案。
  3. 使用提供的补丁编译 PHP v5.5.9。
  4. 按照@GordonM 的建议构建您自己的 PDO 包装器

关于php - “PDOException”消息“SQLSTATE[22001] : String data, 右截断:0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38255659/

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