Unfortunately MySQL Proxy was no good source of inspiration today. MySQL Proxy can do many wonderful things which you can do with C based mysqlnd plugins as well. But not with PECL/mysqlnd_uh. PECL/mysqlnd_uh lets you write “plugins” in PHP. Given my desire to demo the power of mysqlnd plugins at the upcoming webinar Succeed with Plugins using PHP examples, I had to extend PECL/mysqlnd_uh to allow result set manipulation. Five brand new lines of magic.
class __mysqlnd_result extends MysqlndUhResult { public function fetchInto($res, &$rows, $flags, $extension) { $rows = array("Your mysqlnd has been hacked!"); } } mysqlnd_uh_set_result_proxy(new __mysqlnd_result());
The new, yet undocumented and untested built-in class MysqlndUhResult
maps to mysqlnd’s internal result class. It is responsible for fetching the data of a result set. It consist of some 20 methods. To get started, I’ve exported MysqlndUhResult::fetchInto
which is supposed to read the data of all rows of a result set into the rows
variable passed to it by reference. For faking a result set, one assigns an array to the variable. Note, that only the data not the meta data is manipulated.
$mysqli = new mysqli("localhost", "root", "", "test"); $res = $mysqli->query("SELECT 'Enjoy your weekend!' FROM DUAL"); var_dump($res->fetch_assoc());
nixnutz@linux-fuxh:~/php/php-src/branches/PHP_5_4> sapi/cli/php fake.php array(1) { [0]=> string(29) "Your mysqlnd has been hacked!" }
A typical use case for injecting or manipulating a result is a cache. Please, do not start developing a cache using PECL/mysqlnd_uh. We did that already for you in C. Check out PECL/mysqlnd_qc…
Happy hacking!