0

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

4

2 回答 2

0

我无法使用 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

正如预期的那样

于 2015-02-02T08:48:55.770 回答
0

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

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

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

于 2015-02-04T02:44:34.793 回答