是不是可以让php function()和sql一起运行?

时间:2010-09-09 05:47:49

标签: php mysql

假设有一个名为foo($ number)的特殊php函数,它返回其输入值的两倍。此外,假设有一个包含“数字”列的表。有没有办法让我可以运行查询并获得以下内容:

Number | Double
================
1 | 2
5 | 10

8 个答案:

答案 0 :(得分:2)

不,因为查询结果直接来自MySQL。您可以在执行查询后将该函数应用于结果集,方法是使用循环或使用array_map()函数将函数应用于结果。

答案 1 :(得分:1)

您不需要使用PHP。您可以按如下方式执行常规SQL语句。

SELECT number, number * 2 FROM tablename;

答案 2 :(得分:1)

根据您实际尝试实现的目标,可能有可能将数据源和消费者分离一点,足以在它们之间放置另一个组件。

让我们从

开始
<?php
$result = getData($pdo); // a)
doSomething($result); // b)

function getData($mysql) {
  return mysql_query('SELECT x FROM soTest', $mysql);
}

function doSomething($result) {
  while ( false!==($row=mysql_fetch_assoc($result)) ) {
    echo ' ', join(', ', $row), "\n";
  }
  echo "----\n";
}

你几乎无法改变mysql结果资源。并且doSomething()只会迭代结果集。它对mysql结果集没有什么特别之处,但是它通过使用mysql_fetch_xyz()只允许这个确切的资源类型。
让我们使用PDO(PDO_MYSQL)再次尝试这个。

$result = getData($pdo);
doSomething($result);

function getData($pdo) {
  return $pdo->query('SELECT x FROM soTest');
}

function doSomething(PDOStatement $result) {
  while ( $row=$result->fetch(PDO::FETCH_ASSOC) ) {
    echo ' ', join(', ', $row), "\n";
  }
  echo "----\n";
}

这没什么变化。一些名称,但基本上这是相同的。但PDOStatement实现了Traversable界面,因此您可以直接将其用于foreach

$result = getData($pdo);
doSomething($result);

function getData($pdo) {
  return $pdo->query('SELECT x FROM soTest', PDO::FETCH_ASSOC);
}

function doSomething($traversable) {
  foreach( $traversable as $row ) {
    echo ' ', join(', ', $row), "\n";
  }
  echo "----\n";
}

这是一个游戏规则改变者......我们可以将任何可遍历/ iterator传递给doSomething(),它仍然或多或少与以前相同。
现在我们可以在getData()和doSomething()之间放置一些东西。这个东西需要一个内部迭代器(比如getData()以PDOStatement的形式提供)并且它本身就像一个迭代器(所以DoSomething()可以使用它)返回其内部迭代器的所有元素但是修改了一些元素。
我选择在这个例子中扩展FilterIterator,没有特别的原因。你需要php 5.3+来运行这个演示,因为它使用anonymous function

<?php
$pdo = initDemo();

echo "#1: passing \$result\n";
$result = getData($pdo); // a)
doSomething($result); // b)

echo "#2: passing ModifyIterator\n";
$result = getData($pdo); // exact same as a)
$result = new ModifyIterator($result, null, function($e) {
  $e['y'] = '/' . ($e['x'] * 2) .'/';
  return $e;
});
doSomething($result);  // exact same as b)

function getData($pdo) {
  return $pdo->query('SELECT x FROM soTest', PDO::FETCH_ASSOC);
}  

function doSomething($traversable) {
  foreach($traversable as $row) {
    echo ' ', join(', ', $row), "\n";
  }
  echo "----\n";
}

class ModifyIterator extends FilterIterator {
  protected $fnAccept, $fnModify;
  public function __construct($it, $fnAccept, $fnModify) {
    // todo: test parameters!
    $this->fnAccept = $fnAccept;
    $this->fnModify = $fnModify;
    if ( !($it instanceof Iterator) ) {
      $it = new IteratorIterator($it);
    }
    parent::__construct($it);
  }

  public function accept() {
    return $this->fnAccept ? $this->fnAccept(parent::current()) : true;
  }

  public function current() {
    if ( $this->fnModify ) {
      $fn = $this->fnModify;
      return $fn(parent::current());
    }
    return parent::current();
  }
}

function initDemo() {
  $pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly');
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $pdo->exec('CREATE TEMPORARY TABLE soTest (x int auto_increment, primary key(x))');
  $pdo->exec('INSERT INTO soTest VALUES (),(),(),(),()');
  return $pdo;
}

打印

#1: passing $result
 1
 2
 3
 4
 5
----
#2: passing ModifyIterator
 1, /2/
 2, /4/
 3, /6/
 4, /8/
 5, /10/
----

重要的是,ModifyIterator强制内部迭代器上的非常少的特定行为(例如,您仍然可以使用无缓冲的查询,而无需立即将所有数据传输到php进程的内存中)并且getData()并且doSomething()保持不变。

答案 3 :(得分:1)

一种方法是将结果提取到对象中:

class NumberDoubler
{
    public $number;

    public function __construct()
    {
        $this->number *= 2;
    }
}

$pdo = new PDO('mysql:host=localhost;dbname=db_name', 'uname', 'pword');
$stmnt = $pdo->query('SELECT number FROM db_table');
$result = $stmnt->fetchAll(PDO::FETCH_CLASS, 'NumberDoubler');

print_r($result);

结果将是一个对象数组,其中'$ number'加倍。当然,迭代仍将在“幕后”完成,而manual警告说,“使用此方法获取大型结果集将导致对系统和可能的网络资源的大量需求。”

另见PDOStatement::setFetchMode()

答案 4 :(得分:0)

//Your query would prob be like so.
$query = mysql_query("SELECT (number * 2) as double,number FROM table");

echo '<table>';
while($row = mysql_fetch_assoc($query))
{
    echo sprintf('<tr><td>%d</td><td>%d</td></tr>',$row['number'],$row['double']);
}
echo '</table>';

答案 5 :(得分:0)

我想我理解你的问题。

听起来好像你想从数据库中提取数字并通过php函数加倍。

我首先要学会编写php函数... Check this out for a tutorial.

完成此操作后,从数据库中提取您的号码。 Here is a tutorial on how to do that.

这都是关于学习的。我发布代码给你只是复制不会帮助你学习,基本上是浪费我的时间。祝你好运。

答案 6 :(得分:0)

这取决于功能的作用。算术等基本内容可以直接用SQL完成。否则,您可以遍历结果数组并在特定字段中运行该函数,例如:

$rows = array();
foreach(($row = mysql_fetch_assoc($result))) {
    $row['double'] = func($row['number']);
    rows[] = $row;
}

答案 7 :(得分:0)

不,不可能一起使用php function()和sql 但是,您可以从SQL数据库获取结果并在其上应用任何PHP函数