Edited answer.
After having some experience with both these APIs, I would say that there are 2 blocking level features which renders mysqli unusable with native prepared statements.
They were already mentioned in 2 excellent (yet way underrated) answers:
- Binding values to arbitrary number of placeholders
- Returning data as a mere array
(both also mentioned in this answer)
For some reason mysqli failed with both.
Nowadays it got some improvement for the second one (get_result), but it works only on mysqlnd installations, means you can't rely on this function in your scripts.
Yet it doesn't have bind-by-value even to this day.
So, there is only one choice: PDO
All the other reasons, such as
- named placeholders (this syntax sugar is way overrated)
- different databases support (nobody actually ever used it)
- fetch into object (just useless syntax sugar)
- speed difference (there is none)
aren't of any significant importance.
At the same time both these APIs lacks some real important features, like
- identifier placeholder
- placeholder for the complex data types to make dynamical binding less toilsome
- shorter application code.
So, to cover the real life needs, one have to create their own abstraction library, based on one of these APIs, implementing manually parsed placeholders. In this case I'd prefer mysqli, for it has lesser level of abstraction.