pdo mysql更新没有更新没有错误的行

时间:2014-06-19 10:58:54

标签: php mysql pdo

我有一个名为“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']。重要的是没有产生错误

1 个答案:

答案 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));
}