【问题标题】:PHP PDO interface with MS SQL Server与 MS SQL Server 的 PHP PDO 接口
【发布时间】:2012-06-09 23:16:41
【问题描述】:

我在将 PHP PDO 接口与 Microsoft SQL Server 一起使用时遇到问题。问题在于将 PHP 数值转换为在 MS SQL Server 的函数中使用。我使用以下语句删除某些记录:

$sql = "DELETE FROM table WHERE SUBSTRING(attribute, 1, ?) = ?";

我用代码准备并执行这个语句(有点缩水):

$query = $pdo->prepare ($sql);
$query->execute (array (strlen ('Text'), 'Text')); 

但是查询总是失败。错误是:

SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]参数数据类型 nvarchar 对子字符串函数的参数 3 无效。

我假设 strlen 中的数字没有被解析成数字,但我不知道如何解决这个问题(除了手动添加到查询中)。

我找到了这些链接,但不是很有帮助。

http://social.msdn.microsoft.com/Forums/en-US/sqldriverforphp/thread/0f09ac5e-62cd-4ccf-b2cb-848aad23811e

http://drupal.org/node/1169202

Drupal 上的人也有同样的错误,但他们通过强制转换重新创建函数来修复它。有没有其他方法可以解决这个问题?

谢谢。

【问题讨论】:

    标签: php sql-server windows pdo


    【解决方案1】:

    不确定这是否能解决问题,但试试这样的方法

    $length = strlen('Text');
    $text = "Text";
    
    $sql = "DELETE FROM table WHERE SUBSTRING(attribute, 1, :len) = :text";
    $query = $pdo->prepare ($sql);
    $query->bindParam(':len', $length, PDO::PARAM_INT);
    $query->bindParam(':text', $text, PDO::PARAM_STR);
    $query->execute(); 
    

    【讨论】:

    • 遗憾的是这并不能解决问题。它以以下错误响应:[Microsoft][SQL Server Native Client 11.0]COUNT 字段不正确或语法错误。无论哪种方式,我都希望有一个解决方案,我不必重写太多代码。
    【解决方案2】:

    试试:

    $query = $pdo->prepare ($sql);
    $query->execute (array ((int) strlen ('Text'), 'Text')); 
    

    【讨论】:

    • 抱歉,不走运。这显示与问题中描述的问题相同的错误。我还尝试了一个原始的解决方法,将数字乘以 1 或使用函数 intval。
    • 说实话我会很惊讶,但我必须添加它以防万一。无论哪种方式,这似乎都是某种类型的转换问题,也许 PDO 本身通过引用它或其他东西来强制变量成为字符串。您是否尝试以某种方式在查询本身中将值转换为数字/整数?我对 MS SQL 的经验有限,但我想这是可能的。
    • 你能解释一下你的意思吗?我实施的当前解决方案是在准备查询之前手动操作 SUBSTRING 函数。这是问号被替换为查询本身中的数字并且事情有效。但是我仍在寻找更好的解决方案。
    • 我的意思是这样的查询:“DELETE FROM table WHERE SUBSTRING(attribute, 1, CAST(? AS INT)) = ?”;使用您现有的 pdo 代码。
    猜你喜欢
    • 2014-02-04
    • 1970-01-01
    • 2016-09-15
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 2012-09-17
    相关资源
    最近更新 更多