向PDO FetchAll行添加列/变量


Adding a column/variable to PDO FetchAll row

我刚开始使用PDO,有点卡住了——有没有办法在返回的fetchAll数组中添加一行?

我想在行中使用一个值,并从中创建一个新值。我希望我的例子足够清楚——

 class.php
--------------------
class connect
{
//all PDO database connection functions here
}
class Display
{
   function cars($colour)
   {
   $crud = new crud();
   $crud->conn();
   $sql = "SELECT * FROM cars WHERE colour=:colour";
   $stmt = $crud->db->prepare($sql);
   $stmt->bindParam(':colour', $colour);
   $stmt->execute();
   $rows =  $stmt->fetchAll(PDO::FETCH_ASSOC);
 ****WHAT I WANT TO DO (see edit)*****
   foreach ($rows as $row) 
       {
          ADD A ROW CALLED 'newprice' that equals ($row['oldprice'] + 300 / 2)
       }

       $this->results = $rows;
    }
 }

 index.php
--------------------
//other html code...
$D = new Display;
$D->cars('1');
foreach($D->results as $row)
{
?>          
<div class="car">
    <h1>Car Name:</h2>
    <?=($row['model']);?>
    Old Price:
    <?=$row['price'];?>
    New Price:
    <?=($row['newprice']);?>    <- outputting the new row I created
 </div>
}?> 

这能做到吗?或者有其他更有效的方法吗?

对不起,我想我的例子不是很清楚!我想做的不仅仅是数学上改变新列的值——我想在另一个类中预拆分/运行它等等

到目前为止,我得到的最好的解决方案是从PDO提供的数组创建一个新的多维数组,然后添加/编辑该数组,如下所示:

     $new=array();
     $key_loop = 0;
     $row_loop = 0;
      foreach ( $rows as $val )
      {
       $keys = array_keys($val);
       foreach ($keys as $key)
         {                
         $new[$row_loop][$keys[$key_loop]] = $val[$keys[$key_loop]];      
         $new[$row_loop]['new_entry'] = 'this works';
         $key_loop++;
         }       
         $row_loop++; 
      $key_loop = 0;
      }

所以,这段代码是我脑海中快速写出来的(即没有保证),但我认为这样的代码对你有用。

...
foreach ($rows as $row) 
{
   // Get old price
   $old_price = $row['oldprice'];
   // Do some stuff with old price
   $new_price = changeOldPrice($old_price);

   // Insert new price into same row, under the newprice column
   $sql = "UPDATE cars SET newprice=? WHERE id=?";
   $stmt = $crud->db->prepare($sql);
   $stmt->execute( array(':newprice' => $new_price, ':id' => $row['id']) );
}
...
public function changeOldPrice($old_price)
{ 
    // Some random regular expression split
    $new_price = preg_split("[,]+", $old_price) 
    // Pass to random class
    $myClass = new MyClass;
    $new_price = $myClass->doSomethingCool($new_price);
    // Return
    return $new_price;
}

现在坏消息是,正在运行大量的更新,这将严重降低性能。一种解决方案是使用事务一次性写入所有事务。

[EDIT]针对您的编辑,请参阅更新后的代码。

也许是这样的。

SELECT *, (oldprice +300 / 2) as newprice FROM cars WHERE colour=:colour

我最终所做的是在行中循环,并将它们与我需要的额外值粘贴在一个新的多维数组中-这可能不是最优雅的方法,但对我来说很有效:

$new  = array();
$array_loop = 0;
$sql = "select old_price, item_id from car";
...
$stmt->execute();
$rows =  $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $val)
{
    $new[$array_loop]['item_id']   = $val['item_id'];
    $new[$array_loop]['old_price'] = $val['old_price'];
    $newprice = $val['old_price'] + 300 / 2;
    $new[$array_loop]['new_price'] = $new_price;
    $array_loop++;
}

如果有人有同样的问题(超过600个视图),这里是解决方案:

而不是使用循环查看结果

foreach($D->results as $row)

使用

foreach($D->results as $key=>$row)

并使用$key引用而不是$rows 操作$results