2012-02-24 5 views
1

Я новичок в использовании PDO и немного застрял - есть ли способ добавить строку в возвращаемый массив fetchAll?Добавление столбца/переменной в строку 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; 
     } 
+1

Я думаю, что вы имеете в виду «добавить новый столбец * *» для возвращаемых строк. – Xeoncross

+0

Да, это эквивалентно этому! У меня был поиск, и все, что я мог найти, это вещи на обязательных столбцах, которые я не думаю, что мне нужно – penpen

ответ

1

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

$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

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

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

Это сработает! Но я действительно хочу пообщаться с тем, что будет новым ценовым значением, чем больше, чем показывает мой пример (подавать его через разные функции, сравнивать его и т. Д.) – penpen

+1

@penpen, который добавит столбец '$ row ['newprice']' как вы хотели, и вы можете делать все, что хотите. – Xeoncross

+0

Это добавит новую строку, но как я могу ею манипулировать? Я попытался сделать foreach с «$ row ['newprice'] = 'TEST", но он не был изменен: \ – penpen

2

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

... 

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; 
} 

Теперь плохие новости, то есть много из обновлений, бежать и будет серьезно ухудшить производительность. Решение состоит в том, чтобы использовать transactions, чтобы написать все из них за один раз.

[EDIT] В ответ на ваше изменение см. Обновленный код.

+0

Ничего себе, что было бы много обновлений! Это определенно способ делать то, что я просил. Впервые попробовал PDO и подумал, что это будет намного более элегантно, чем стандартное соединение PHP/MySQL. Я добавил редактирование на мой вопрос, но спасибо, что нашли время, чтобы помочь! – penpen

0

если кто-нибудь имеет такую ​​же проблему (более 600 просмотров) здесь решение:

вместо езды на велосипеде по результатам с:

foreach($D->results as $row) 

использования

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

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

Смежные вопросы