[Ayuda] Script de PHP no funciona igual que el phpmyadmin

Iniciado por danny920825, 7 Abril 2017, 19:28 PM

0 Miembros y 1 Visitante están viendo este tema.

danny920825

Hola amigos. Ayer publique un tema relacionado con este, pero prefiero hacer uno aparte, porque la forma de hacerlo que propuse ayer, si funciona. Lo que sucede es que quiero restaurar una BD desde PHP.
Lo estaba haciendo desde la consola de mysql usando la funcion
Código (php) [Seleccionar]
exec()
pero en la noche un amigo me dijo que si el phpmyadmin está hecho en PHP entonces debe existir una forma de hacerlo. Y me di a la tarea, lo primero fue limpiar el archivo .sql para quitarle los comentarios /* y --. El efecto fue usar
Código (php) [Seleccionar]
file_get_contents() para cargar todo el contenido, limpiarlo y luego llamar a la funcion que hace la restaura. En la funcion que hace la restaura lo que hago es dividir el string obtenido de la funcion anterior y delimitarlo por ; para generar la consulta.
El resultado es que la consulta me da error si la hago desde el script, pero si le pongo un
Código (php) [Seleccionar]
echo para que me muestre el contenido y luego eso lo ejecuto desde el phpMyadmin sí se ejecuta. A continuacion ambas funciones, la de limpiar y la de restaurar:

Código (php) [Seleccionar]

function limpiar_sql($file)
{
include "bd.php";
$file_sql = $salva_dir.$_POST['salva_sql'];
$archivo = file($file_sql, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$abrir = fopen($file_sql, "w");
foreach ($archivo as $key)
{
$recorte = substr($key, 0,2);
if ($recorte != "--")
{
if ($recorte != "/*")
{
fwrite($abrir, $key);
}
}
}
fclose($abrir);
restaurar_bd($_POST['salva_sql']);
}

function restaurar_bd($file)
{
include "bd.php";
$file_sql = $salva_dir.$_POST['salva_sql'];
$contenido = file_get_contents($file_sql);
$explode  = explode(";", $contenido);

foreach ($explode as $key)
{
$newkey = $key.";";
$mysqli->query($newkey) or die (mysqli_error($mysqli));
}

}


Ayuda Por favor
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

#!drvy

¿ Qué error te tira el query a la hora de ejecutarlo en PHP ?

Saludos

danny920825

#2
Perdón. Lo iba a poner y se me olvidó. Lo unico que dice es:
Query was empty
No da más ningun dato
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

#!drvy

Podrías pegar tal cual lo que te devuelve esto:

Código (php,8) [Seleccionar]
function restaurar_bd($file)
{
include "bd.php";
$file_sql = $salva_dir.$_POST['salva_sql'];
$contenido = file_get_contents($file_sql);
$explode  = explode(";", $contenido);

                die(var_dump($explode));

foreach ($explode as $key)
{
$newkey = $key.";";
$mysqli->query($newkey) or die (mysqli_error($mysqli));
}

}


Deduzco que le estas pasando una query mal formateada a mysqli.

Saludos

danny920825

Hola y gracias por responder aun despues de tanto tiempo. Resulta que logre hacer que funcionara de esta forma:
Código (php) [Seleccionar]

function limpiar_sql($file)
{
include "bd.php";
$file_sql = $salva_dir.$_POST['salva_sql'];
$archivo = file($file_sql, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$abrir = fopen($file_sql, "w");
foreach ($archivo as $key)
{
$recorte = substr($key, 0,2);
if ($key[0].$key[1] != '--' && $key[0].$key[1] != '/*')
{
fwrite($abrir, $key);
}

}
fclose($abrir);
restaurar_bd($_POST['salva_sql']);
}

function restaurar_bd($file)
{
include "bd.php";
$file_sql = $salva_dir.$_POST['salva_sql'];
$contenido = file_get_contents($file_sql, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$explode  = explode(";", $contenido);
$cantidad = count($explode)-1;
for($i=0; $i<$cantidad;$i++)
{
$newkey = $explode[$i].";";
if ($mysqli->query($newkey))
{
echo "ejecutada consulta: ".$newkey."<br>";
}
else
{
echo "error en consulta: ".$newkey."<br>";
}

}

}


Pero me estuvo diciendo un amigo que puede llegar a ser un inconveniente cuando quitas las lineas de -- y de /* que genera el SQL porque son las vistas. Y que hacer el
explode por ; puede generar errores si en los datos de la BD existe algun ;
Habria alguna otra forma de restaurar la BD desde PHP utilizando la extension de mysqli?
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno

#!drvy

Puedes usar shell_exec() para invocar mysql-dump e importar los datos. Es una alternativa un poco sucia pero realmente usaras MySQL y por lo tanto solucionas muchos problemas como el uso de vistas, claves como USE y otras funcionalidades no soportadas por el driver.

Un ejemplo seria:

Código (php) [Seleccionar]
$user = 'root';
$password = 'toor';
$database ='mibasededatos';
$sqlFile = './archivoSql.sql';

$status = shell_exec("mysql -u{$user} -p{$password} -D {$database} < {$sqlFile}");
var_dump($status);


Claro que eso implica que tengas acceso a shell_exec lo cual en algunos casos puede ser considerado como una característica propensa a ataques.


También podrías probar con el multi_query -> http://php.net/manual/es/mysqli.multi-query.php

Pero ya te digo que no sera ni de lejos tan eficiente y completa como usar el propio mysql.

Saludos

danny920825

Ok, entonces utilizaré MySql directo con esta funcion:
Código (php) [Seleccionar]

function restaurar_bd($salva)
{
include "bd.php";
$file_sql = $salva_dir.$_POST['salva_sql'];
$mysql = "..\..\mysql\bin\mysql";
$restaura = $mysql." -u $username --password=$password $bd < $file_sql";
echo $restaura;
echo "<br>";
system($restaura, $salida);
if ($salida == 0)
{
echo "Salva Realizada";
}
else
{
echo "No se pudo salvar la BD";
}
}


Y me disculpo por mi costumbre de incluir las $variables dentro de las comillas dobles, ya que PHP las reconoce y agilizo el proceso. No se si es o no una mala practica.
"Los que reniegan de Dios es por desesperación de no encontrarlo".
   Miguel de Unamuno