Sé que PDO no admite la ejecución de varias consultas en una declaración. He estado buscando en Google y encontré algunas publicaciones que hablan sobre PDO_MYSQL y PDO_MYSQLND.
PDO_MySQL es una aplicación más peligrosa que cualquier otra aplicación MySQL tradicional. MySQL tradicional permite una sola consulta SQL. En PDO_MySQL no existe tal limitación, pero corre el riesgo de que le inyecten múltiples consultas.
De: Protección contra la inyección SQL usando PDO y Zend Framework (junio de 2010; por Julian)
Parece que PDO_MYSQL y PDO_MYSQLND brindan soporte para múltiples consultas, pero no puedo encontrar más información sobre ellas. ¿Se interrumpieron estos proyectos? ¿Hay alguna forma ahora de ejecutar múltiples consultas usando PDO?
Respuestas:
Como sé,
PDO_MYSQLND
reemplazadoPDO_MYSQL
en PHP 5.3. La parte confusa es que el nombre sigue siendoPDO_MYSQL
. Así que ahora ND es el controlador predeterminado para MySQL + PDO.En general, para ejecutar varias consultas a la vez, necesita:
PDO::ATTR_EMULATE_PREPARES
esté configurado en1
(predeterminado). Alternativamente, puede evitar usar declaraciones preparadas y usarlas$pdo->exec
directamente.Usando exec
Usando declaraciones
Una nota:
Cuando utilice declaraciones preparadas emuladas, asegúrese de haber configurado la codificación adecuada (que refleje la codificación de datos real) en DSN (disponible desde 5.3.6). De lo contrario, puede haber una pequeña posibilidad de inyección SQL si se usa alguna codificación extraña .
fuente
Después de medio día de jugar con esto, descubrí que PDO tenía un error donde ...
-
-
-
Ejecutaría el
"valid-stmt1;"
, se detendría"non-sense;"
y nunca arrojaría un error. No correrá el"valid-stmt3;"
, volverá verdad y mentirá que todo salió bien.Esperaría que se produjera un error,
"non-sense;"
pero no es así.Aquí es donde encontré esta información: La consulta PDO no válida no devuelve un error
Aquí está el error: https://bugs.php.net/bug.php?id=61613
Entonces, intenté hacer esto con mysqli y realmente no he encontrado una respuesta sólida sobre cómo funciona, así que pensé que lo dejaría aquí para aquellos que quieran usarlo ...
fuente
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
sin los dos ejecutivos anteriores? Puedo hacer que arroje errores en el medio, pero no cuando se ejecuta después de ejecutivos exitosos .$pdo->exec("")
son independientes entre sí. Ahora los divido para indicar que no es necesario que estén en una secuencia para que surja el problema. Esas 3 son 3 configuraciones para ejecutar varias consultas en una declaración ejecutiva.exec
en la página, pero si ejecuto varias,exec
cada una con varias declaraciones SQL, reproduzco el mismo error aquí. Pero si es el únicoexec
en la página, entonces no puedo reproducirlo.exec
de tu página tenía varias declaraciones?Un enfoque rápido y sucio:
Se divide en puntos finales razonables de la instrucción SQL. No hay comprobación de errores ni protección contra inyección. Comprenda su uso antes de usarlo. Personalmente, lo uso para sembrar archivos de migración sin procesar para pruebas de integración.
fuente
;
interrupciones si su SQL contiene definiciones de procedimiento o disparador ... Un montón de razones por las que no es bueno.Al igual que miles de personas, estoy buscando esta pregunta:
puedo ejecutar varias consultas simultáneamente, y si hubiera un error, ninguna se ejecutaría. Fui a esta página en todas partes.
Pero aunque los amigos aquí dieron buenas respuestas, estas respuestas no fueron buenas para mi problema
Así que escribí una función que funciona bien y casi no tiene ningún problema con la inyección SQL.
Puede ser útil para aquellos que buscan preguntas similares, así que las pongo aquí para usar
para uso (ejemplo):
y mi conexión:
Nota:
esta solución le ayuda a ejecutar varias sentencias juntas,
si se produce una sentencia incorrecta, no ejecuta ninguna otra sentencia
fuente
Intenté el siguiente código
Luego
Y consiguió
Si se agrega
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
después$db = ...
Luego tengo una página en blanco
Si en cambio lo
SELECT
intentóDELETE
, en ambos casos obtuvo un error comoEntonces mi conclusión de que no es posible una inyección ...
fuente
but you risk to be injected with multiple queries.
Mi respuesta es sobre la inyecciónPruebe esta función: múltiples consultas e inserción de múltiples valores.
fuente
PDO admite esto (a partir de 2020). Simplemente haga una llamada query () en un objeto PDO como de costumbre, separando las consultas por; y luego nextRowset () para pasar al siguiente resultado SELECT, si tiene varios. Los conjuntos de resultados estarán en el mismo orden que las consultas. Obviamente, piense en las implicaciones de seguridad, así que no acepte consultas proporcionadas por el usuario, use parámetros, etc. Lo uso con consultas generadas por código, por ejemplo.
fuente