【问题标题】:PHP PDO bindValue() without Explicit Data Type没有显式数据类型的 PHP PDO bindValue()
【发布时间】:2015-04-01 03:57:45
【问题描述】:

我正在开发一个使用面向 PDO 的 PHP 对象的应用程序。我一直在努力寻找查询执行失败的原因。事实证明,我提供了一个值作为字符串格式的参数,以绑定到一个数组中。我有一个通用循环,它将所有参数绑定到我的查询的问号占位符。那当然会考虑参数都是字符串格式的。但是我有整数格式的列。即使我使用(int)intval() 将变量转换为整数,它也不起作用。所以我相信我必须将显式数据类型指定为 PDO::PDO_PARAM_INT 。但我对所有查询都有这样的代码:

查询示例:

$this->db->query("INSERT INTO users (name, numberOfCar") VALUES (?,?) ,
                  array('Jake', 5));

bindValue() 部分:

$x = 1;
if( count($params) ){
    foreach($params as $param){
        $this->_query->bindValue($x, $param);
        $x++;
    }
}

我该怎么做?我的意思是知道如何修改代码来解决这个问题?不确定我是否必须修改代码的哪一部分,但我很困惑地想到解决方法。提前谢谢你。

编辑:PHP 版本 5.3.10,PDO 连接到 Sybase

【问题讨论】:

  • 我只是把它扔在这里没有测试,但这应该可以工作:$query = $this->db->prepare("INSERT INTO users (name, numberOfCar") VALUES (:values)"),然后是$query->execute(array('values' => array('Jake', 5)));
  • 我不能使用这种解决方案,因为有些列具有固定值。

标签: php oop pdo bindvalue


【解决方案1】:

看来我仍然需要提供显式数据类型。所以我想出了我自己的解决方案。这是我的做法:

$this->db->query("INSERT INTO users (name, numberOfCar") VALUES (?,?) ,
              array('Jake', 5),
              array(PDO::PARAM_STR, PDO::PARAM_INT));

对于值绑定:

$x = 1;
if( count($params) ){
    foreach($params as $param){
        $this->_query->bindValue($x, $param, $datatypes[$x-1]);
        $x++;
    }
}

如果有人遇到这种问题,我希望这可以帮助那里的人。非常感谢那些在这方面帮助过我的人。

【讨论】:

    【解决方案2】:

    我无法使用 php 5.6.3、mysql5.6、win32 重现该问题

    <?php
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');  
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    setup($pdo);
    
    $stmt = $pdo->prepare("INSERT INTO soFoo_users (name, numberOfCar) VALUES (?,?)");
    foreach( array('Jake', 5) as $i=>$v) {
        $stmt->bindValue($i+1,  $v);
    }
    $stmt->execute();
    $stmt = null;
    
    foreach($pdo->query('SELECT * FROM soFoo_users', PDO::FETCH_ASSOC) as $r ) {
        echo join(', ', $r), "\r\n";
    }
    
    function setup($pdo) {
        $pdo->exec('
            CREATE TEMPORARY TABLE soFoo_users (
                name varchar(32),
                numberOfCar int
            )
        ');
    }
    

    打印

    Jake, 5
    

    如预期的那样

    【讨论】:

    • 抱歉回复晚了。我还没有尝试您提出的解决方案。但我开始相信它与版本有关(可能吗?)。因为我记得上次我在同一台服务器上也遇到了这个问题。我的 PHP 版本是 5.3.10,我正在使用 PDO 连接到 Sybase 数据库。
    • 是的,可能是版本问题和/或驱动程序问题。默认情况下,我使用玩具 mysql 服务器进行演示,并且可以毫不费力地切换到 oci 或 sqlserver ...但是 sybase?您使用哪个 pdo 驱动程序? DBLIB、ODBC、...?
    猜你喜欢
    • 2012-11-15
    • 2013-11-12
    • 2013-03-08
    • 2014-01-26
    • 2012-07-31
    • 2023-03-28
    • 1970-01-01
    • 2013-01-03
    • 2011-02-11
    相关资源
    最近更新 更多