2008-12-06 16 views
9

Tengo un archivo de volcado de SQL que necesita cargarse usando mysql_query(). Desafortunadamente, no es posible ejecutar múltiples consultas con él.PHP: múltiples consultas SQL en una declaración mysql_query

-> No se puede asumir que el cliente de línea de comandos mysql (mysql --help) está instalado - para cargar el archivo SQL directamente

-> No puede asumirse que el mysqli extensión se instala

/* contents of dump.sql, including comments */ 
DELETE FROM t3 WHERE body = 'some text; with semicolons; scattered; throughout'; 
DELETE FROM t2 WHERE name = 'hello'; 
DELETE FROM t1 WHERE id = 1; 

la explotar() a continuación no funcionará debido a que algunos de los valores del contenido volcado contienen puntos y comas.

$sql = explode(';', file_get_contents('dump.sql')); 
foreach ($sql as $key => $val) { 
    mysql_query($val); 
} 

¿Cuál es la mejor manera de cargar el SQL sin modificar el archivo de volcado?

Respuesta

12

Tiene más casos problemáticos que solo los puntos y coma dentro de las cadenas.

  • Guión builtin comandos que no pueden ser ejecutados por mysql_query(), como USE.
  • Declaraciones que no terminan con un punto y coma, como DELIMITER.
  • Declaraciones que contienen punto y coma, pero no dentro de comillas, como CREATE PROCEDURE.

No conozco una manera fácil de manejar esta tarea, sin desembolsar al cliente de línea de comandos mysql. Me doy cuenta de que dijiste que no puedes confiar en que ese cliente esté presente, pero sin ese cliente, necesitas una gran cantidad de código PHP para analizar el script y ejecutar las declaraciones de manera apropiada.

Es posible que pueda encontrar dicho código dentro del producto phpMyAdmin. Sin embargo, ese producto está licenciado bajo la GPL, por lo tanto, si utiliza alguno de los códigos, también debe otorgar la licencia de su propio proyecto bajo la GPL.


Ver también mis respuestas a estas preguntas relacionadas:

6

de Occam huelgas de afeitar de nuevo.

La función de explosión anterior() no iba a funcionar porque hay puntos y comas en los valores. Sin embargo, lo que no me di cuenta (y menciono) es que los puntos y comas siempre preceden a las líneas nuevas en el archivo de volcado de SQL. Alas,

$sql = explode(";\n", file_get_contents('dump.sql')); 
foreach ($sql as $key => $val) { 
    mysql_query($val); 
} 

Además, gracias por su ayuda, Bill.

+0

Tiene casos de punto y coma al final de una línea, pero no es el final de una declaración, p. Ej. dentro del cuerpo de un procedimiento o definición de desencadenante. Y declaraciones como DELIMITER que no terminan en punto y coma. –

3

Hay un problema más grande aquí. Es posible que tenga declaraciones que se basan en otras declaraciones. No puedes simplemente ejecutarlos linealmente a ciegas.

+0

Siempre podría decirle a mysql que ignore las comprobaciones únicas y las comprobaciones de claves foráneas antes de ejecutar su lista de consultas que resolvería muchos problemas con el orden de las consultas. – enobrev

+0

Correcto, indique a la base de datos que ignore las comprobaciones de cordura implementadas para preservar la integridad de los datos. Esa es una forma segura de tener éxito. – FlySwat

+0

@enobrev: ¿Y qué pasaría si activa la comprobación de cordura después? exactamente; mas problemas. – Kris

0
<?php 
//STATIC QUERY 
$sql1 = " 
CREATE TABLE tblTable (
strOne VARCHAR(50) NOT NULL, 
strTwo VARCHAR(50) NOT NULL, 
strThree VARCHAR(50) NOT NULL 
); 
INSERT INTO tblTable 
(strOne, strTwo, strThree) 
VALUES ('String 1', 'String 2', 'String 3'); 
UPDATE tblTable 
SET 
strOne = 'String One', 
strTwo = 'String Two' 
WHERE strThree = 'String 3'; 
"; 
//GET FROM FILE 
$sql2 = file_get_contents('dump.sql'); 
$queries = preg_split("/;+(?=([^'|^\\\']*['|\\\'][^'|^\\\']*['|\\\'])*[^'|^\\\']*[^'|^\\\']$)/", $sql); 
foreach ($queries as $query){ 
    if (strlen(trim($query)) > 0) mysql_query($query); 
} 
?> 
Cuestiones relacionadas