我有一个名为“data”的数组:
Array
(
[0] => Array
(
[ID] => 75538
[stock] => In Stock
[Price] => 82.6900
)
[1] => Array
(
[id] => 75536
[stock] => In Stock
[Price] => 72.0000
)
............(cont...)
我正在运行更新查询,如下所示:
$conn->beginTransaction();
$sql = "UPDATE products SET stock_status = ?,price = ? WHERE id= ?";
try {
$stmt = $conn->prepare($sql);
foreach ($data as $v){
$stmt->execute(array_values($v));
}//end foreach
$conn->commit();
} catch (PDOException $e) {
echo 'Update failed: ' . $e->getMessage();
exit;
}
echo "Database was updated successfully";
$stmt->closeCursor();
$conn = NULL;
我总是得到“数据库已成功更新”消息,数据未更新。在空表中我也得到相同的结果。没有记录错误。
mysql列stock_status是varchar,price是十进制(10,4),id也是varchar ...请忽略errorinfo部分,因为我需要更改它。
我的pdo更新查询有什么问题吗?寻求帮助..
更新
var_dump($ data)将价格表示为字符串:
array(36828) {
[0]=>
array(3) {
["ID"]=>
string(5) "75538"
["instock"]=>
string(8) "In Stock"
["Price"]=>
string(7) "82.6900"
}
示例数据库结构:
CREATE TABLE IF NOT EXISTS `products` (
`product_id` int(5) NOT NULL AUTO_INCREMENT,
`id` varchar(10) COLLATE latin1_general_cs NOT NULL,
`price` decimal(10,4) NOT NULL,
`stock_status` varchar(10) COLLATE latin1_general_cs NOT NULL DEFAULT 'In Stock',
PRIMARY KEY (`product_id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_cs AUTO_INCREMENT=1 ;
更新
我也试过这个,但仍然没有更新,没有错误。仍然获得成功的消息。
$stmt = $conn->prepare('UPDATE products SET `stock_status`=:stockstatus,`price`=:price WHERE `id`=:id');
foreach ($data as $v){
$stmt->bindParam(':stockstatus', $v['instock'], PDO::PARAM_STR);
$stmt->bindParam(':price', $v['Price'], PDO::PARAM_INT);
$stmt->bindParam(':id', $v['id'], PDO::PARAM_STR);
$stmt->execute();
更新
我已经在连接connstring文件中设置了例外:
$conn = new PDO($connStr, $user, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
仍然没有收到错误消息????
更新 问题已解决。
对不起。我的疏忽。我的代码中是$ v ['ID']而不是$ v ['id']。重要的是没有产生错误。
答案 0 :(得分:0)
这个输出很奇怪:[Price] => 72.0000
。看起来这个值是一个字符串。如果是十进制值,则应显示为72.0。然后,PDO将其作为字符串处理,这可能会与数据库中的列定义发生冲突。
同样的问题可能与id ...如果它是PHP中的整数和数据库中的varchar它将无法工作。
您可以使用var_dump()
代替print_r()
进行检查,它会提供更详细的信息。
更新
试试这个:
foreach ($data as $v){
$v['Price'] = floatval($v['Price']);
$stmt->execute(array_values($v));
}