Я согласен, что вам не следует запрашивать все данные, а затем фильтровать набор результатов на 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, за исключением того, что строки со значениями NULL в ['v'] будут отфильтрованы. Вам не нужно менять «потребляющий» код, т. Е. Тот же цикл foreach (или вызов функции / метода или любой другой) будет работать с $ result вместо $ filterIter.