Добавление столбца / переменной в строку PDO FetchAll - PullRequest
1 голос
/ 24 февраля 2012

Я новичок в использовании 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>
}?> 

Можно ли это сделать или есть другой, более эффективный способ сделать это?

Извините, наверное, я не очень ясно со своим примером! Я хочу сделать гораздо больше, чем просто математически изменить значение для нового столбца - я хочу preg_split / запустить его через другой класс и т. Д.

Лучшее решение, которое у меня есть, - это создать новый многомерный массив из предоставленного 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;
      }

Ответы [ 4 ]

2 голосов
/ 24 февраля 2012

Итак, этот код - быстрый урок написания моей головы (т.е. никаких гарантий), но я думаю, что-то вроде этого будет работать для вас.

...

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] В ответ на ваши изменения см. Обновленный код.

1 голос
/ 30 апреля 2012

Я закончил циклически перебирать строки и вставлять их в новый многомерный массив с необходимыми мне дополнительными значениями - может быть, это не самый элегантный способ, но он работает для меня:

$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++;
}
1 голос
/ 24 февраля 2012

Возможно, что-то вроде этого.

SELECT *, (oldprice +300 / 2) as newprice FROM cars WHERE colour=:colour
0 голосов
/ 14 июля 2016

, если у кого-то есть такая же проблема (более 600 просмотров), вот решение:

вместо циклического просмотра результатов с:

foreach($D->results as $row)

использовать

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

и манипулировать результатами $ с помощью ссылки $ key вместо $ row

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...