Php 向PDO FetchAll行添加列/变量

Php 向PDO FetchAll行添加列/变量,php,mysql,database,object,pdo,Php,Mysql,Database,Object,Pdo,我刚开始使用PDO,有点卡住了-有没有办法向返回的fetchAll数组添加一行 我想在行中使用一个值并从中创建一个新值。我希望我的例子足够清楚- class.php -------------------- class connect { //all PDO database connection functions here } class Display { function cars($colour) { $crud = new crud(); $crud-&g

我刚开始使用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>
}?> 

也许是这样的

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

也许是这样的

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

所以,这段代码是我头脑中的一个快速总结(即,没有保证),但我认为类似的东西对你来说是可行的

...

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;
}
现在坏消息是,正在运行大量更新,这将严重降低性能。一种解决方案是使用一次写入所有这些内容

[编辑]
作为对您编辑的回应,请参阅更新的代码。

因此,此代码是我头脑中的一个快速总结(即无担保),但我认为类似的内容适合您

...

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;
}
现在坏消息是,正在运行大量更新,这将严重降低性能。一种解决方案是使用一次写入所有这些内容

[编辑]
为了响应您的编辑,请参阅更新的代码。

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

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

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

$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)
使用


如果任何人有相同的问题(超过600个视图),请使用$key reference而不是$rows来操作$results。以下是解决方案:

而不是通过以下方式循环查看结果:

foreach($D->results as $row)
使用


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

我认为您的意思是在返回的行中“添加一个新列”。是的,与此等效!我做了一次搜索,我能找到的只是绑定列上的东西,我不认为这是我需要的。我想你的意思是“添加一个新列”到返回的行中。是的,相当于这个!我进行了一次搜索,我所能找到的只是绑定列上的东西,我认为这不是我所需要的,可以工作的!但是我实际上想搞乱什么是新的价格值——比我的示例显示的要多一些(通过不同的函数输入它,比较它等等)@penpen,它将添加列
$row['newprice']
,就像你想要的那样,你可以用它做任何你想做的事情。它将添加一个新行,但是我如何操作它呢?我试着用“$row['newprice']='TEST”做一个foreach,但没有改变:\@penpen,首先你问起在结果集中获取一个新列的问题。现在听起来好像你真的在问更新它。两个不同的问题。对不起,我以为它们是一样的,但它们显然不是。从一开始我就应该说得更具体些,但是谢谢你的帮助。那会有用的!但是我实际上想搞乱什么是新的价格值——比我的示例显示的要多一些(通过不同的函数输入它,比较它等等)@penpen,它将添加列
$row['newprice']
,就像你想要的那样,你可以用它做任何你想做的事情。它将添加一个新行,但是我如何操作它呢?我试着用“$row['newprice']='TEST”做一个foreach,但没有改变:\@penpen,首先你问起在结果集中获取一个新列的问题。现在听起来好像你真的在问更新它。两个不同的问题。对不起,我以为它们是一样的,但它们显然不是。从一开始我就应该说得更具体些,但是谢谢你的帮助。哇,那会有很多更新!这绝对是我要求的一种方式。第一次尝试PDO时,我觉得它比标准的PHP/MySQL connect要优雅得多。我已经为我的问题添加了一个编辑,但是谢谢你花时间来帮助我!哇,那会有很多更新!这绝对是我要求的一种方式。第一次尝试PDO时,我觉得它比标准的PHP/MySQL connect要优雅得多。我已经为我的问题添加了一个编辑,但是谢谢你花时间来帮助我!