代码之家  ›  专栏  ›  技术社区  ›  dav

阅读下一条记录

  •  0
  • dav  · 技术社区  · 16 年前

    我在MYSQL上用php过滤空值。当读取空值时,我需要MySQL读取下一条记录。

    我该怎么做呢?

    4 回复  |  直到 16 年前
        1
  •  2
  •   mjv    16 年前

    为什么不在源代码处(即SQL查询中)过滤掉这些空值呢。

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

    WHERE ...  -- existing conditions
    AND TheFieldOfInterest  IS NOT NULL
    
        2
  •  0
  •   Peter Perháč    16 年前

    一模一样 mjv 前面已经提到,您希望告诉MySQL跳过特定列中具有空值的行。正如您的问题“当读取空值时,我需要MySQL读取下一条记录”:这正是MySQL所做的 当您通过指定WHERE条件告诉它不要在结果集中包含null时。

    享受黑客攻击的乐趣:)

        3
  •  0
  •   hultqvist    16 年前

    在php中,可以使用 is_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"];
    }
    
        4
  •  0
  •   VolkerK    16 年前

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

    我做到了,但我“只是”想知道另一种方法:D
    PDO SPL 尤其是。 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']中有空值的行将被过滤掉。您不必更改“消费”代码,也就是说,相同的foreach循环(或函数/方法调用或其他)将使用$result而不是$filterIter。

    推荐文章