Ver Mensaje Individual
  #19 (permalink)  
Antiguo 25/08/2015, 10:55
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Generar archivo sql en PHP

Código PHP:
Ver original
  1. if(isset($_POST['generar_npc'])){
Eso es como minimo incorrecto, lo que estas preguntando es "Vino el campo generar_npc por por post con algún valor?" en ese if entraras por si a esa pregunta, pero nada dice eso si el request es efectivamente post, solo verifica si esta definida una variable y con el tiempo veras que hay varias formas de que ese if sea verdadero (o falso).
Código PHP:
Ver original
  1. if($_SERVER['REQUEST_METHOD'] == "POST") {
eso lo que pregunta es si el request es POST, no pregunta por los valores enviados, si es un POST entonces se esta solicitando la accion de descargar, los parametros con lo que se solicita tal accion, son otro tema aparte.

Código PHP:
Ver original
  1. $entry=$_POST['entry'];
  2.     $modelo1=$_POST['modelo1'];
  3.     $modelo2=$_POST['modelo2'];
  4.     $modelo3=$_POST['modelo3'];
  5.     $modelo4=$_POST['modelo4'];
  6.     $nombre=$_POST['nombre'];
  7.     $subnombre=$_POST['subnombre'];
  8.     $menu_id=$_POST['menu_id'];
  9.     $minlevel=$_POST['minlevel'];
  10.     $maxlevel=$_POST['maxlevel'];
  11.     $faccion=$_POST['faccion'];
  12.     $npcflag=$_POST['npcflag'];
  13.     $escala=$_POST['escala'];
  14.     $rango=$_POST['rango'];
  15.     $damage1=$_POST['damage1'];
  16.     $damage2=$_POST['damage2'];
  17.     $unit_class=$_POST['unit_class'];
  18.     $familia=$_POST['familia'];
  19.     $tipo=$_POST['tipo'];
  20.     $resistencia1=$_POST['resistencia1'];
  21.     $resistencia2=$_POST['resistencia2'];
  22.     $resistencia3=$_POST['resistencia3'];
  23.     $resistencia4=$_POST['resistencia4'];
  24.     $resistencia5=$_POST['resistencia5'];
  25.     $resistencia6=$_POST['resistencia6'];
  26.     $mingold=$_POST['mingold'];
  27.     $maxgold=$_POST['maxgold'];
  28.     $vida=$_POST['vida'];
  29.     $mana=$_POST['mana'];
  30.     $armadura=$_POST['armadura'];
  31.     $regenvida=$_POST['regenvida'];
Eso... bueno... sin palabras. Es una tacnica mas que obsoleta que viene de PHP 4, cuando $_POST se llamaba $HTTP_POST_VARS y como es muy molesto trabajar con un nombre de variable tan largo se hacia eso.
$_POST tiene una longitud aceptable y es facil de trabajar, no tiene ningun sentido hacer eso.
ademas de que hay mejores formas, por ejemplo:
Código PHP:
Ver original
  1. extract($_POST);
o
Código PHP:
Ver original
  1. $_P = &$_POST;
si lo que se busca es acortar la longitud, pero a mi criterio, ninguna tiene razon de ser salvo en casos particulares, extract por su parte es "peligrosa" si no se toman algunas precauciones.

Código PHP:
Ver original
  1. echo "<center>"."<textarea>"."INSERT INTO .... '0');"."</textarea>"."</center>";
Eso se te indico explicitamente que lo tenias que sacar, nada tiene que ver no saber un lenguaje, si alguien te dice "los <textarea> son innecesarios, pues sólo vas a imprimir texto" y te pone un ejemplo sin los textarea, y tu los sigues dejando, claramente o no estas prestando atencion, o no te interesa, o nos tomas el pelo.

Código PHP:
Ver original
  1. VALUES('".$entry."',
  2. '0',    
  3. '0',
  4. '0',
  5. '0',
  6. '0',
  7. '".$modelo1."',    
  8. '".$modelo2."',    
  9. '".$modelo3."',    
  10. '".$modelo4."',    
  11. '".$nombre."',    
  12. '".$subnombre."',
  13. NULL,
  14. '".$menu_id."',    
  15. '".$minlevel."',
  16. '".$maxlevel."',
  17. '0',
  18. '".$faccion."',    
  19. '".$npcflag."',    
  20. '0.91',
  21. '1.14286',
  22. '".$escala."',    
  23. '".$rango."',    
  24. '0',    
  25. '2000',    
  26. '2000',    
  27. '".$damage1."',    
  28. '".$damage2."',    
  29. '".$unit_class."',    
  30. '0',    
  31. '0',    
  32. '0',
  33. '".$familia."',    
  34. '0',
  35. '0',
  36. '0',
  37. '0',
  38. '".$tipo."',    
  39. '0',
  40. '0',    
  41. '0',
  42. '0',
  43. '".$resistencia1."',
  44. '".$resistencia2."',
  45. '".$resistencia3."',
  46. '".$resistencia4."',
  47. '".$resistencia5."',
  48. '".$resistencia6."',
  49. '0',
  50. '0',
  51. '0',
  52. '0',
  53. '0',
  54. '0',
  55. '0',
  56. '0',
  57. '0',    
  58. '0',    
  59. '".$mingold."',    
  60. '".$maxgold."',
  61. '',
  62. '0',
  63. '3',
  64. '1',
  65. '".$vida."',  
  66. '".$mana."',
  67. '".$armadura."',
  68. '1',
  69. '1',
  70. '0',
  71. '0',
  72. '0',
  73. '0',
  74. '0',
  75. '0',
  76. '".$regenvida."',
  77. '0',
  78. '1',
  79. '',
  80. '0',
  81. '',
Eso... bueno, siendo estrictos esta bien porque funciona, pero de las varias formas de lograr lo mismo es la mas precaria.
Yo (y cualquier otra persona) viendo esa parte del codigo sola, no tengo idea de que es lo que hace ademas de concatenar variables.
Una buena alternativa es crear una plantilla de la query:
Código PHP:
Ver original
  1. $template = "INSERT INTO `creature_template` (`entry`, `difficulty_entry_1`, `difficulty_entry_2`, `difficulty_entry_3`, `KillCredit1`, `KillCredit2`, `modelid1`, `modelid2`, `modelid3`, `modelid4`, `name`, `subname`, `IconName`, `gossip_menu_id`, `minlevel`, `maxlevel`, `exp`, `faction`, `npcflag`, `speed_walk`, `speed_run`, `scale`, `rank`, `dmgschool`, `BaseAttackTime`, `RangeAttackTime`, `BaseVariance`, `RangeVariance`, `unit_class`, `unit_flags`, `unit_flags2`, `dynamicflags`, `family`, `trainer_type`, `trainer_spell`, `trainer_class`, `trainer_race`, `type`, `type_flags`, `lootid`, `pickpocketloot`, `skinloot`, `resistance1`, `resistance2`, `resistance3`, `resistance4`, `resistance5`, `resistance6`, `spell1`, `spell2`, `spell3`, `spell4`, `spell5`, `spell6`, `spell7`, `spell8`, `PetSpellDataId`, `VehicleId`, `mingold`, `maxgold`, `AIName`, `MovementType`, `InhabitType`, `HoverHeight`, `HealthModifier`, `ManaModifier`, `ArmorModifier`, `DamageModifier`, `ExperienceModifier`, `RacialLeader`, `questItem1`, `questItem2`, `questItem3`, `questItem4`, `questItem5`, `questItem6`, `movementId`, `RegenHealth`, `mechanic_immune_mask`, `flags_extra`, `ScriptName`, `VerifiedBuild`) VALUES('[entry]', '0', '0', '0', '0', '0', '[modelo1]', '[modelo2]', '[modelo3]', '[modelo4]', '[nombre]', '[subnombre]', NULL, '[menu_id]', '[minlevel]', '[maxlevel]', '0', '[faccion]', '[npcflag]', '0.91', '1.14286', '[escala]', '[rango]', '0', '2000', '2000', '[damage1]', '[damage2]', '[unit_class]', '0', '0', '0', '[familia]', '0', '0', '0', '0', '[tipo]', '0', '0', '0', '0', '[resistencia1]', '[resistencia2]', '[resistencia3]', '[resistencia4]', '[resistencia5]', '[resistencia6]', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '[mingold]', '[maxgold]', '', '0', '3', '1', '[vida]', '[mana]', '[armadura]', '1', '1', '0', '0', '0', '0', '0', '0', '[regenvida]', '0', '1', '', '0', '', '0');";
Donde quien la ve se da cuenta que se trata de un modelo de consulta, nada se sabe de los valores puntuales, pero esa es la idea de una plantilla. Hasta podrias poner todas las plantillas en un archivo separado y cargarlas, si dos juegos diferentes soportan "creature_template" solo cargas el template que corresponda al juego y listo, el resto del codigo no se modifica.

Código PHP:
Ver original
  1. foreach($_POST as $key => $value)
  2.             $template = str_replace("[$key]", $value, $template);
Eso no necesita mucha explicacion, puedes ir al manual de str_replace si intuitivamente no lo descifras o al de foreach.
Código PHP:
Ver original
  1. ?>
  2. <?php
  3.  if( count($sql) > 0 )
  4.         {
  5.             for( $contador=0; $contador < count($sql); $contador++ )
  6.                 echo "".$sql[$contador]."<br/>";
  7.         }
  8. ?>
Esto..
1) No tiene sentido cerrar y abrir los tag de php, de hecho una buena practica es abrirlos al inicio del archivo y no cerrarlos nunca.
hacerlo asi puede (ademas de carecer de sentido) traer problemas, ya que entre el cierre y la apertura hay un salto de linea que si trabajaras con sessiones podria darte problemas. fíjate como un detalle tan tonto te puede complicar la vida.
2) Nose que es $sql, nose que es lo que hace eso ademas de lanzar warning y notices.
Código PHP:
Ver original
  1. header("Content-type: application/octet-stream");
  2.         header("Content-Disposition: attachment; filename=\"codigo.sql\"\n");
  3.         echo $template;
este es codigo que vengo repitiendo ya 3 veces desde el inicio del post. en el link de @pateketrueke los primeros 20 resultados te sirven y son similares a este.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios