Eu encontrei uma solução temporária. Isso é feio, mas se encaixa:
função pública selectCmd ($ q) {
$charsFrom = array("\a", "\t", "\n", "\v", "\f", "\r", "\\", "\0", "\\"", "\\'", "\b");
$charsTo = array("\a", "\t", "\n", "\v", "\f", "\r", "\", "$charsFrom = array("\a", "\t", "\n", "\v", "\f", "\r", "\\", "\0", "\\"", "\\'", "\b");
$charsTo = array("\a", "\t", "\n", "\v", "\f", "\r", "\", "%pre%", "\"", "\'", "\b");
exec('echo ' . escapeshellarg($q) . ' | mysql' .
' -h ' . escapeshellarg($this->_config['host']).
' -u ' . escapeshellarg($this->_config['username']).
' -p' . escapeshellarg($this->_config['password']).
' ' . escapeshellarg($this->_config['dbname']), $output);
$colNames = explode("\t", array_shift($output));
foreach ($colNames as &$colName){
$colName = str_replace($charsFrom, $charsTo, $colName);
}
unset($colName);
$rowSet = array();
foreach ($output as $line){
$row = array();
$rawRow = explode("\t", $line);
for ($i = 0; $i < count($rawRow); ++ $i){
$row[$colNames[$i]] = str_replace($charsFrom, $charsTo, $rawRow[$i]);
}
$rowSet[] = $row;
}
return $rowSet;
", "\"", "\'", "\b");
exec('echo ' . escapeshellarg($q) . ' | mysql' .
' -h ' . escapeshellarg($this->_config['host']).
' -u ' . escapeshellarg($this->_config['username']).
' -p' . escapeshellarg($this->_config['password']).
' ' . escapeshellarg($this->_config['dbname']), $output);
$colNames = explode("\t", array_shift($output));
foreach ($colNames as &$colName){
$colName = str_replace($charsFrom, $charsTo, $colName);
}
unset($colName);
$rowSet = array();
foreach ($output as $line){
$row = array();
$rawRow = explode("\t", $line);
for ($i = 0; $i < count($rawRow); ++ $i){
$row[$colNames[$i]] = str_replace($charsFrom, $charsTo, $rawRow[$i]);
}
$rowSet[] = $row;
}
return $rowSet;
}
Você precisará substituir $ this- > _config por um array de conexão real.
Este script executa qualquer comando SQL que retorne linhas. Por enquanto é a solução que estou tomando. Se alguém quiser me ajudar de forma proativa, ainda tenho as fontes. Eu também sou o cara que tem o PHP seg-fault usando PHPUnit com Zend (deterministicamente). Estou fazendo tudo isso no meu trabalho, não tenho recursos para testar. Obrigado pela sua compreensão.