没有显式数据类型的PHP PDO bindValue()

没有显式数据类型的PHP PDO bindValue(),php,oop,pdo,bindvalue,Php,Oop,Pdo,Bindvalue,我正在使用PHP面向对象和PDO开发一个应用程序。我一直在苦苦寻找查询执行失败的原因。事实证明,我已经以字符串格式提供了一个值作为参数绑定到数组中。我有一个常规循环,将所有参数绑定到查询的问号占位符。当然,会考虑参数都是字符串格式的。但是,我有整数格式的列。即使我使用int或intval将变量转换为整数,它也不起作用。所以我认为我必须为PDO::PDO_PARAM_INT指定显式数据类型。但对于所有查询,我都有类似的代码: 查询示例: $this->db->query("INSERT

我正在使用PHP面向对象和PDO开发一个应用程序。我一直在苦苦寻找查询执行失败的原因。事实证明,我已经以字符串格式提供了一个值作为参数绑定到数组中。我有一个常规循环,将所有参数绑定到查询的问号占位符。当然,会考虑参数都是字符串格式的。但是,我有整数格式的列。即使我使用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

我无法使用PHP5.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
        )
    ');
}

正如预期的那样

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

$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++;
    }
}

如果有人有这种问题,我希望这可以帮助其他人。非常感谢在这方面帮助过我的人。

我只是在没有测试的情况下把它扔到这里,但这应该可以工作:$query=$this->db->prepareINSERT INTO users name,numberOfCar VALUES:VALUES,然后$query->executearray'VALUES'=>array'Jake',5;我无法使用这种解决方案,因为有些列具有固定值。很抱歉,答复太晚。我还没有尝试你提出的解决方案。但我开始相信这和它可能是什么有关?。因为我记得上次我在同一台服务器上也遇到了这个问题。我的PHP版本是5.3.10,我正在使用PDO连接到Sybase数据库。是的,可能是版本问题和/或驱动程序问题。默认情况下,我使用玩具mysql服务器进行演示,不费吹灰之力就可以切换到oci或sqlserver……但是sybase呢?您使用哪种pdo驱动程序?DBLIB,ODBC。。。?
$x = 1;
if( count($params) ){
    foreach($params as $param){
        $this->_query->bindValue($x, $param, $datatypes[$x-1]);
        $x++;
    }
}