query
ejecuta una instrucción SQL estándar y requiere que escapes adecuadamente de todos los datos para evitar inyecciones SQL y otros problemas.
execute
ejecuta una declaración preparada que le permite vincular parámetros para evitar la necesidad de escapar o citar los parámetros. execute
también funcionará mejor si repite una consulta varias veces. Ejemplo de declaraciones preparadas:
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories);
$sth->bindParam(':colour', $colour);
$sth->execute();
// $calories or $color do not need to be escaped or quoted since the
// data is separated from the query
La mejor práctica es seguir las declaraciones preparadas y execute
aumentar la seguridad .
Ver también: ¿Son suficientes las declaraciones preparadas para PDO para evitar la inyección de SQL?
: calories
es ese el equivalente demysql_real_escape_string()
detener las inyecciones o necesita algo más que$sth->bindParam(':calories', $calories);
aumentar la seguridad?query
devuelve un PDOStatement , en lugar de un bool comoexecute
?No, no son lo mismo. Además del escape en el lado del cliente que proporciona, una declaración preparada se compila en el lado del servidor una vez, y luego se pueden pasar diferentes parámetros en cada ejecución. Lo que significa que puedes hacer:
En general, le brindarán una mejora en el rendimiento, aunque no se notará a pequeña escala. Lea más sobre declaraciones preparadas (versión MySQL) .
fuente
La respuesta de Gilean es excelente, pero solo quería agregar que a veces hay raras excepciones a las mejores prácticas, y es posible que desee probar su entorno en ambos sentidos para ver qué funcionará mejor.
En un caso, descubrí que
query
funcionaba más rápido para mis propósitos porque estaba transfiriendo en masa datos confiables desde una caja de Ubuntu Linux que ejecuta PHP7 con el controlador ODBC de Microsoft mal soportado para MS SQL Server .Llegué a esta pregunta porque tenía un script de larga ejecución para un ETL que estaba tratando de exprimir para obtener velocidad. Me pareció intuitivo que
query
podría ser más rápido queprepare
&execute
porque estaba llamando solo a una función en lugar de dos. La operación de enlace de parámetros proporciona una protección excelente, pero puede ser costosa y posiblemente evitarse si no es necesario.Dadas un par de condiciones raras :
Si no puede reutilizar una declaración preparada porque no es compatible con el controlador ODBC de Microsoft .
Si no está preocupado por desinfectar la entrada y el escape simple es aceptable. Este puede ser el caso porque la vinculación de ciertos tipos de datos no es compatible con el controlador ODBC de Microsoft .
PDO::lastInsertId
no es compatible con el controlador ODBC de Microsoft.Aquí hay un método que usé para probar mi entorno, y espero que puedas replicarlo o algo mejor en el tuyo:
Para comenzar, he creado una tabla básica en Microsoft SQL Server
Y ahora una prueba cronometrada básica para las métricas de rendimiento.
He jugado con diferentes ensayo múltiple y recuentos en mi entorno específico, y recibe constantemente entre un 20-30% más rápido con resultados
query
deprepare
/execute
Tengo curiosidad por ver cómo esta prueba se compara en otros entornos, como MySQL.
fuente