Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: danny920825 en 7 Abril 2017, 19:28 pm



Título: [Ayuda] Script de PHP no funciona igual que el phpmyadmin
Publicado por: danny920825 en 7 Abril 2017, 19:28 pm
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
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
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
  1. 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
  1. function limpiar_sql($file)
  2. {
  3. include "bd.php";
  4. $file_sql = $salva_dir.$_POST['salva_sql'];
  5. $archivo = file($file_sql, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  6. $abrir = fopen($file_sql, "w");
  7. foreach ($archivo as $key)
  8. {
  9. $recorte = substr($key, 0,2);
  10. if ($recorte != "--")
  11. {
  12. if ($recorte != "/*")
  13. {
  14. fwrite($abrir, $key);
  15. }
  16. }
  17. }
  18. fclose($abrir);
  19. restaurar_bd($_POST['salva_sql']);
  20. }
  21.  
  22. function restaurar_bd($file)
  23. {
  24. include "bd.php";
  25. $file_sql = $salva_dir.$_POST['salva_sql'];
  26. $contenido = file_get_contents($file_sql);
  27. $explode  = explode(";", $contenido);
  28.  
  29. foreach ($explode as $key)
  30. {
  31. $newkey = $key.";";
  32. $mysqli->query($newkey) or die (mysqli_error($mysqli));
  33. }
  34.  
  35. }
  36.  

Ayuda Por favor


Título: Re: [Ayuda] Script de PHP no funciona igual que el phpmyadmin
Publicado por: #!drvy en 7 Abril 2017, 20:01 pm
¿ Qué error te tira el query a la hora de ejecutarlo en PHP ?

Saludos


Título: Re: [Ayuda] Script de PHP no funciona igual que el phpmyadmin
Publicado por: danny920825 en 7 Abril 2017, 20:04 pm
Perdón. Lo iba a poner y se me olvidó. Lo unico que dice es:
Query was empty
No da más ningun dato


Título: Re: [Ayuda] Script de PHP no funciona igual que el phpmyadmin
Publicado por: #!drvy en 15 Abril 2017, 19:06 pm
Podrías pegar tal cual lo que te devuelve esto:

Código
  1. function restaurar_bd($file)
  2. {
  3. include "bd.php";
  4. $file_sql = $salva_dir.$_POST['salva_sql'];
  5. $contenido = file_get_contents($file_sql);
  6. $explode  = explode(";", $contenido);
  7.  
  8.                die(var_dump($explode));
  9.  
  10. foreach ($explode as $key)
  11. {
  12. $newkey = $key.";";
  13. $mysqli->query($newkey) or die (mysqli_error($mysqli));
  14. }
  15.  
  16. }

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

Saludos


Título: Re: [Ayuda] Script de PHP no funciona igual que el phpmyadmin
Publicado por: danny920825 en 23 Abril 2017, 01:22 am
Hola y gracias por responder aun despues de tanto tiempo. Resulta que logre hacer que funcionara de esta forma:
Código
  1. function limpiar_sql($file)
  2. {
  3. include "bd.php";
  4. $file_sql = $salva_dir.$_POST['salva_sql'];
  5. $archivo = file($file_sql, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  6. $abrir = fopen($file_sql, "w");
  7. foreach ($archivo as $key)
  8. {
  9. $recorte = substr($key, 0,2);
  10. if ($key[0].$key[1] != '--' && $key[0].$key[1] != '/*')
  11. {
  12. fwrite($abrir, $key);
  13. }
  14.  
  15. }
  16. fclose($abrir);
  17. restaurar_bd($_POST['salva_sql']);
  18. }
  19.  
  20. function restaurar_bd($file)
  21. {
  22. include "bd.php";
  23. $file_sql = $salva_dir.$_POST['salva_sql'];
  24. $contenido = file_get_contents($file_sql, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  25. $explode  = explode(";", $contenido);
  26. $cantidad = count($explode)-1;
  27. for($i=0; $i<$cantidad;$i++)
  28. {
  29. $newkey = $explode[$i].";";
  30. if ($mysqli->query($newkey))
  31. {
  32. echo "ejecutada consulta: ".$newkey."<br>";
  33. }
  34. else
  35. {
  36. echo "error en consulta: ".$newkey."<br>";
  37. }
  38.  
  39. }
  40.  
  41. }
  42.  

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
Código:
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?


Título: Re: [Ayuda] Script de PHP no funciona igual que el phpmyadmin
Publicado por: #!drvy en 23 Abril 2017, 16:56 pm
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
  1. $user = 'root';
  2. $password = 'toor';
  3. $database ='mibasededatos';
  4. $sqlFile = './archivoSql.sql';
  5.  
  6. $status = shell_exec("mysql -u{$user} -p{$password} -D {$database} < {$sqlFile}");
  7. 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


Título: Re: [Ayuda] Script de PHP no funciona igual que el phpmyadmin
Publicado por: danny920825 en 24 Abril 2017, 13:22 pm
Ok, entonces utilizaré MySql directo con esta funcion:
Código
  1. function restaurar_bd($salva)
  2. {
  3. include "bd.php";
  4. $file_sql = $salva_dir.$_POST['salva_sql'];
  5. $mysql = "..\..\mysql\bin\mysql";
  6. $restaura = $mysql." -u $username --password=$password $bd < $file_sql";
  7. echo $restaura;
  8. echo "<br>";
  9. system($restaura, $salida);
  10. if ($salida == 0)
  11. {
  12. echo "Salva Realizada";
  13. }
  14. else
  15. {
  16. echo "No se pudo salvar la BD";
  17. }
  18. }
  19.  

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.