我正在使用面向PDO的PHP面向对象的应用程序。我几个小时都在苦苦寻找查询执行失败的原因。原来,我提供了一个String格式的参数值,以便在数组中绑定。我有一个通用循环,它将所有参数绑定到我的查询的问号占位符。那当然会考虑参数都是String格式。但是我有整数格式的列。即使我使用(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
答案 0 :(得分: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
按预期
答案 1 :(得分: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++;
}
}
我希望如果有人遇到这种问题,这可以帮助那些人。非常感谢那些帮助我的人。