Diferencia entre Execute y Query en MySQL

publicado por: Anonymous

Cuando ejecuto una consulta en la base de datos MySQL el comando Execute congela completamente la base de datos, mientras que si el comando es Query corre normalmente la consulta. ¿Cuál es la diferente entre estos dos comandos?

solución

Buenos dias, te responderé de manera general usando MySQLi y PDO, ya que no especificas el tipo de clase de consulta:


query()

Ejecuta una consulta estandarizada SQL a la base de datos, esto requiere escapar correctamente los datos para evitar inyecciones sql (vease: ¿Cómo evitar la inyección SQL en PHP?), generalmente se usa cuando obtendrás datos sin ninguna condición o característica, es decir sin usar WHERE.

Ejemplo:

$sql = 'SELECT nombre, color, calorias FROM frutas ORDER BY nombre';
    foreach ($conexion->query($sql) as $valor) {
        echo $valor['nombre'] . "t";
        echo $valor['color'] . "t";
        echo $valor['calorias'] . "n";
    }

Como se aprecia en el ejemplo únicamente devolvemos datos directos, es decir, no buscamos usar WHERE para condicionar los resultados, en el caso de querer hacerlo debemos asignar parámetros, para eso se usa el execute, ya que este acompaña a las sentencias preparadas(vease: http://php.net/manual/es/mysqli.quickstart.prepared-statements.php).

Otro problema del query(), es que debes declarar la sentencia de nuevo para volver a usar la consulta.

Haciendo las consultas menos eficientes.


execute()

Corre o ejecuta una sentencia preparada que permite asignar parámetros que evitan la inyección SQL ya que no debes recurrir a comillas o escapar caracteres, en el caso de que quieras ejecutar de nuevo la consulta a la base de datos, basta con ejecutar execute de nuevo para hacerlo.

Esto requiere ademas que la sentencia se prepare antes.

Ejemplo:

$consulta = $conexion->prepare('SELECT nombre, color, calorias FROM frutas
    WHERE calorias < :calorias AND color = :color');
$consulta->bindValue(':calorias', $calorias);
$consulta->bindValue('color', $color);
$consulta->execute();

Donde:

 $consulta->bindValue('calorias', $calorias) -> Asignar parametros

Le asignamos $calorias al parametro calorias , el cual corresponde al campo calorias de la tabla frutas.

Como observas en la sentencia SQL cuando igualamos calorias=:calorias, se presentan dos puntos, eso representa que :calorias es una cajita donde se metera luego el valor de la variable asignada.

Esto porque las sentencias preparadas primero mandan a MySQL la sentencia:

SELECT nombre, color, calorias FROM frutas
        WHERE calorias < :calorias AND color = :color

Y luego le mandan los valores

:color, $color

Para que al darle execute ambas se combinen algo asi:

SELECT nombre, color, calorias FROM frutas
        WHERE calorias < $calorias AND color=$color

Pero todo ocurre dentro del mismo MySQL, no en el PHP.

En conclusion:

query(): consultas simples sin condicionales (inseguro si no se sabe estructrar la consulta SQL).

execute(): consultas con parámetros pasados por asignación (mas seguras, si se emplea PDO o MySQLi permiten definir el tipo de dato que recibirán)


el comando Execute congela completamente la base de datos

Ahora, que hacemos con esto, necesitaria que publicaras la consulta para ver que error podria presentar.


Para saber mas sobre inyeccion sql y sentencias preparadas te invito a leer:

https://phpdelusions.net/sql_injection

https://phpdelusions.net/pdo

https://phpdelusions.net/safemysql

https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php

https://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work/332367#332367

¿Qué es la inyección SQL y cómo puedo evitarla?

¿Cómo evitar la inyección SQL en PHP?

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *