【问题标题】:Prepared PDO Statement and MS SQL准备好的 PDO 语句和 MS SQL
【发布时间】:2013-12-28 15:47:41
【问题描述】:

我终于让我的 CentOS 机器与网络上的 MS SQL 机器对话,但现在我在运行准备好的 PDO 语句时遇到了问题。如果我从末尾删除 :desc 并放入变量名或单词本身,则以下语句有效。 MS SQL 不喜欢这类语句还是我只是遗漏了什么?

$cn = "AARONS";

$result = $pdo->prepare("SELECT * from CommonNameAddress where CommonName = :desc");
$result->execute(array(':desc' => $cn));

编辑

执行一些错误检查后,返回的错误是:

Array (
 [0] => 22001
 [1] => 0
 [2] => [Microsoft][ODBC Driver 11 for SQL Server]String data, right truncation (SQLExecute[0] at /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254)
 [3] => 22001
)

【问题讨论】:

  • 查看mysql的版本是否支持该功能,我猜是不支持。
  • MS SQL 服务器是 2005 年的,但这应该没关系吧?不是 PHP 脚本完成了所有工作,然后将 SQL Select 发送出去了吗?
  • 你说得对,错了
  • 我不知道 PDO 内部是如何工作的,但是尝试用其他变量名重命名 'desc' 占位符,然后重试...
  • 我把它改成 :name 得到同样的结果

标签: php sql sql-server pdo


【解决方案1】:

也许检查您的退货,看看是否发生错误?

if( ! $result = $pdo->prepare("SELECT * from CommonNameAddress where CommonName = :desc") ) {
  print_r( $pdo->errorInfo() );
} else if( !$result->execute(array(':desc' => $cn)) ) {
  print_r( $result->errorInfo() );
} else {
  //success
}

【讨论】:

  • 嗯,返回给我这个:Array ( [0] => 22001 [1] => 0 [2] => [Microsoft][ODBC Driver 11 for SQL Server]String 数据,右截断 ( SQLExecute[0] 在 /builddir/build/BUILD/php-5.3.3/ext/pdo_odbc/odbc_stmt.c:254) [3] => 22001)
  • 很确定这意味着您的数据比字段大小长。
  • 数据怎么会太长?如果我替换 PDO 变量,它返回就好了。
  • 这也可能是一个错误,请尝试在创建 PDO 对象后立即添加$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, TRUE )
  • 无论出于何种原因,我认为这可能是我的一些奇怪的错误或错误的实现。此编码适用于我的其他页面的 MySQL PDO 内容,只是不喜欢 MS SQL Server $pdo = new PDO("odbc:NWS","username","password"); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE); $cn = "亚伦"; $result = $pdo->prepare("SELECT * from CommonNameAddress where CommonName = :name"); $result->execute(array(':name' => $cn));
【解决方案2】:

WHERE 部分之后需要like 而不是=

$result = $pdo->prepare("SELECT * from CommonNameAddress where CommonName like :name");

$result->execute(array(':name' => "%$cn%"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 2017-03-13
    • 1970-01-01
    相关资源
    最近更新 更多