Notice I was specifically pointing at the functional "wrappers" of mysqli, not mysqli itself. myslqi_prepare($db, '') instead of new $db->prepare('') feels like a pointless code-wasting crutch in PHP that's in there JUST for the people who are deathly afraid of objects. (and in PHP that actually seems to be a thing, people LITERALLY afraid of objects!) I often think those wrappers make it TOO easy for people coming from the old mysql functions to just slop their existing code -- variables in the query strings and everything -- over to mysqli whilst dodging the ENTIRE reason for the change! It's not different enough to force the required change in mindset.
That said, one of your arguments?
$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
NEVER understood why that's not the default state, particularly given how the garbage emulation screws with LIMIT. I actually set it in my php.ini file because I've yet to hear one legitimate reason why it's not smart enough to go "hey you're using mysql or mariadb? Well then skip the emulate"
... and I think you meant DB engines not JS. :D (easy typo)
Being able to hit multiple DB's was the tipping point for my favoring PDO, but there are things in mysqli that just piss me off -- like how AWKWARD getting results out of a prepared query are -- let's face it ->bind_result sucks -- or that mysqli::execute and mysqli::query return an entirely different object from ::prepare so if you want to switch between them you basically have to rewrite the entire codebase. THAT'S STUPID! ... and I know some developers who are using mysqli but refuse to use prepare because of it and just vomit their variables into the query string -- AGAIN missing the entire reason for the change!
You can blame the people for not learning it, but you have to ask WHY they are not learning it. That's why I'm often pointing at the frameworks as one of the causes on the JavaScript side. People diving for it before they know enough to realize the methodology is wrong, but blindly parroting how great it is because everyone else is.
At least with PDO anything that might have a result set returns PDOStatement so if you want to add variables to the query after the fact or stop passing variables you don't end up rewriting the whole blasted thing.
That you can have labels as placeholders is also win the moment you have any significant number of variables to pass. You can only have so many question marks in the query before it becomes an impossible to follow mess... though conversely all those separarate PDOStatement::bindParam() do get tired when building a POEM (prepare once, execute mostly) statement. Praise be in PDO you can also pass an indexed array to PDOStatement::exec when you are only going to execute once.