阅读下一条记录

时间:2009-10-04 08:07:09

标签: php mysql

我在MYSQL上的PHP中过滤空值。当读取空值时,我需要MySQL来读取下一条记录。

我该怎么做?

4 个答案:

答案 0 :(得分:2)

为什么不在源处过滤这些空值,即在SQL查询中。

在WHERE子句中添加如下内容。

WHERE ...  -- existing conditions
AND TheFieldOfInterest  IS NOT NULL

答案 1 :(得分:0)

正如 mjv 已经提到的那样,你想告诉MySQL跳过特定列中具有NULL值的行。正如你的问题所在'当读取空值时,我需要MySQL来读取下一条记录。 :当你通过指定WHERE条件告诉它不要在结果集中包含NULL时,这正是MySQL 将要做的

玩得开心:)

答案 2 :(得分:0)

在php中,您可以使用 is_null() 函数来检测变量是否为null

$result = mysql_query("SELECT foo FROM bar;");
while($values = mysql_fetch_assoc($result))
{
     if (is_null($values["foo"]))
         continue; //Skip processing of this row

     echo "Data: ".$values["foo"];
}

答案 3 :(得分:0)

我同意你不应该查询所有数据,然后在mysql-client(你的php脚本)上过滤结果集。但是:

完成了,但我“只是”想要了解另一种方式:D
好奇并没有错。而且:PDOSPL的力量更大,尤其是在这种情况下FilterIterator

class ElementIssetFilter extends FilterIterator {
  protected $index;
  public function __construct(Iterator $iter, $index) {
    parent::__construct($iter);
    $this->index = $index;
  }

  public function accept() {
    $c = $this->current();
    return isset($c[$this->index]);
  }
}

$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

// testtable and -data
$pdo->exec("CREATE TEMPORARY TABLE foo (id int auto_increment, v varchar(16), primary key(id))");
$pdo->exec("INSERT INTO foo (v) VALUES ('1'), (null), ('3'), ('4'), (null), ('6')");

$result = $pdo->query('SELECT id,v FROM foo');
$iter = new IteratorIterator($result);
$filterIter = new ElementIssetFilter($iter, 'v');

foreach( $filterIter as $e) {
  echo $e['id'], " ", $e['v'], "\n";
}

$ filterIter将像$ result一样,除了['v']中具有NULL值的行将被过滤掉。您不必更改“消耗”代码,即相同的foreach循环(或函数/方法调用或其他)可以使用$ result而不是$ filterIter。