我在MYSQL上的PHP中过滤空值。当读取空值时,我需要MySQL来读取下一条记录。
我该怎么做?
答案 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好奇并没有错。而且: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']中具有NULL值的行将被过滤掉。您不必更改“消耗”代码,即相同的foreach循环(或函数/方法调用或其他)可以使用$ result而不是$ filterIter。