Su última edición dejó la pregunta muy clara, así que intentaré responder:la causa de esta diferencia es el marcador de posición.
Como se documenta aquí , los marcadores de posición solo se pueden usar en determinados lugares de la consulta. En particular:
Ahora puede que hayas notado que SELECT ? as x
se prepara bien, pero no SELECT nr.x FROM (SELECT ? AS x) AS nr
. ¿Porqué es eso? Bueno, esto lo explica mejor un autor anónimo en el documento de PHP
, déjame copiar/pegar:
En pocas palabras:porque está utilizando un marcador de posición en una subconsulta en FROM
cláusula, MySQL no puede calcular el plan de ejecución de la consulta.
En otras palabras, dado que su consulta siempre cambiará, no hay una "plantilla" que se pueda preparar para ella.
Por lo tanto, si realmente desea usar esta consulta, debe usar una consulta normal (no preparada) o volver a activar las declaraciones preparadas emuladas de PDO.
Dicho esto, considere las diversas alternativas que se ofrecen en la sección de comentarios. Hay soluciones mucho mejores para lo que está tratando de lograr.