Foros del Web » Programando para Internet » PHP »

Podria mejorar el codigo???

Estas en el tema de Podria mejorar el codigo??? en el foro de PHP en Foros del Web. Buenas amigos quiero poner esta informacion aqui, para los que esten aprendidendo a programar esto les servira. Pero mi objetivo es recibir criticas, recomendaciones, me ...
  #1 (permalink)  
Antiguo 04/04/2015, 11:15
 
Fecha de Ingreso: septiembre-2010
Mensajes: 28
Antigüedad: 13 años, 7 meses
Puntos: 1
Podria mejorar el codigo???

Buenas amigos quiero poner esta informacion aqui, para los que esten aprendidendo a programar esto les servira.

Pero mi objetivo es recibir criticas, recomendaciones, me gustaria saber si podria mejorar de alguna manera mi manera de programar en PHP OOP.

Aqui les voy a dejar un codigo muy sencillo, la mayoria de los programas que he hecho en PHP los hago asi. Tengo una capa de presentacion al usuario que se llama "Vista" y tengo un elemento que me controla toda la capa de negocio claro dependiendo de lo grande que sea el sistema podria tener varios, a esto le llamo "Controlador".

El envio de informacion hacia mi controlador no lo hago a traves del metodo POST de mi formulario siempre me ha gustado hacerlo por Jquery a traves de AJAX, en lo personal me gusta ver que todo ocurre en el mismo formulario sin necesidad de que se refresque la pagina.

--------------------Aqui les dejo el modelo de mi vista-----------------
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
<script src="../Js/jquery-2.1.3.min.js"></script>
<script src="../Js/Prueba.js"></script>

</head>

<body>
<form name="formulario" id="formulario" method="">
<input type="hidden" name="Accion" id="Accion" value="agregarNombre">
<table width="200" border="1">
<tbody>
<tr>
<td>Nombre:</td>
<td><input type="text" name="Nombre" id="Nombre"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="button" name="Guardar" id="Guardar" value="Guardar"></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>

----------------------------------------------------------------------------

Aqui les dejo mi codigo de las clases que cree para este ejemplo

---------------------Clase de base de datos.-------------------------
<?php
class BaseDatos
{
function conectar()
{
$conexion=mysqli_connect("localhost","Prueba","Pru eba")or die("ERROR, no se puede conectar a la base de datos: ".mysqli_error());
mysqli_select_db($conexion,"Prueba");

return $conexion;
}

}
?>
-----------------------------------------------------------------------------------

------------------Clase orientada a la vista que se llama Prueba-----------------------
<?php
class Prueba
{
function agregarNombre($conexion,$Nombre)
{
$json['bandera']="";

mysqli_query($conexion,"BEGIN");
$sql="INSERT into Prueba(Nombre)values('".$Nombre."')";
$query=mysqli_query($conexion,$sql)or die("ERROR, no se pudo insertar en la base de datos: ".mysqli_error());

if($query==FALSE)
{
mysqli_query($conexion,"ROLLBACK");
$json['bandera']="0";
}
else
if($query!=FALSE)
{
mysqli_query($conexion,"COMMIT");
$json['bandera']="1";
}
echo json_encode($json);
}
}

?>
-------------------------------------------------------------------------------------------------

--------------------Aqui el codigo de mi controlador-------------------------------------
<?php

$accion=$_REQUEST["Accion"];
require("Clases/BaseDatos.class.php");
$objConexion = new BaseDatos;
$conexion=$objConexion->conectar();

switch($accion)
{
case 'agregarNombre':
require("Clases/Prueba.class.php");
$objPrueba = new Prueba;
$objPrueba->agregarNombre($conexion,trim($_POST["Nombre"]));
break;

default:
'No se encuentra en este controlador la accion: '.$accion.' revize este controlador Controlador.php';
break;

}



?>
--------------------------------------------------------------------------------------------------

--------Aqui les dejo el codigo del Jquery que utilizo para envio de datos---------
$(document).ready(function()
{

$("#Guardar").click(function()
{
var nombre=$("#Nombre").val();
var accion=$("#Accion").val();

$.ajax
({
url: '../Controlador.php',
type: 'POST',
data: {Accion:accion,Nombre:nombre},
dataType: 'json',

success:function(data)
{
var bandera=data.bandera;

if(bandera=="0")
{
alert("ERROR, al insertar el nombre");
}
else
if(bandera=="1")
{
alert("Datos registrados con exito !!!");
}
}
});

});
});
-----------------------------------------------------------------------------------------------

Por supuesto todo va en archivos separados, como les dije es un ejemplo muy sencillo donde inserto un nombre a la base de datos, la idea es que quiero conocer si puede mejorar aun mas mi manera de programar.

Muchas gracias....
  #2 (permalink)  
Antiguo 04/04/2015, 14:53
Avatar de rodrypaladin
Moderador
 
Fecha de Ingreso: abril-2010
Ubicación: Madrid
Mensajes: 2.127
Antigüedad: 14 años
Puntos: 468
Respuesta: Podria mejorar el codigo???

Podrías usar Highlight para hacer el visionado más fácil y ameno.
__________________
No te olvides de dar +1 a quien te echa un cable ;)
  #3 (permalink)  
Antiguo 04/04/2015, 19:54
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Podria mejorar el codigo???

Hola !
Siempre se puede mejorar la forma de programar , seguro que dentro de un año , ves el código... y te tiras de los pelos!! Eso será una buena señal.

La poo tiene infinidad de recursos..
Patricularmente lo que veo a mejorar más que el paradigma es la forma en como tratas los datos, debes siempre limpiar todo lo que te envía un usuario , pues no escapas la query tal como llega la insertas en bd...
Luego estas usando la ext vieja de mysql y esta esta obsoleta y deprecada , en su lugar usa mysqli o pdo.
Por otro lado al usar REQUEST en el controlador estas aceptando todo lo que venga o por post o por get deberías afinarlo.

Hecho de menos alguna herencia.. y algún constructor.

Por ejemplo si la clase prueba heredara de conexión y en conexión tuvieras un constructor , en prueba podrías hacer un:
Código PHP:
parent::__construct() 
Y te ahorrarias estar instanciando la clase BaseDatos y llamando al método conectar.

Ya vas por buen camino ahora solo te falta practicar e ir innovando.
Requerda los tipos de atributos , las propiedades staticas y las herencias.
Cuando esto lo tengas mas amano ya puedes pasarte a las interfaces y las clases abstractas ( personalmente aún no me han hecho falta estas ultimas , pero siempre va bien conocerlo por si las ves en algún lado.
También te recomiendo algún fmk que te obligará a trabajar mejor el patrón MVC.
Personalmente me gusta mucho laravel.
Un saludo!
  #4 (permalink)  
Antiguo 05/04/2015, 10:05
 
Fecha de Ingreso: septiembre-2010
Mensajes: 28
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Podria mejorar el codigo???

Hola Djoaq, de verdad muchas gracias por tomarte el tiempo para responderme...

Queria hacerte unas preguntas:

Patricularmente lo que veo a mejorar más que el paradigma es la forma en como tratas los datos, debes siempre limpiar todo lo que te envía un usuario , pues no escapas la query tal como llega la insertas en bd...
RE: Cuando hablas de limpiar los datos exactamente a que te refieres?, yo siempre me preocupo de insertar los datos en limpio sin espacios para ellos uso trim(), si existe algo mejor podrias darme un ejemplo?

Luego estas usando la ext vieja de mysql y esta esta obsoleta y deprecada , en su lugar usa mysqli o pdo.
RE: A que te refieres con esto? si te das cuenta en todas partes hago uso de Mysqli ej: $conexion=mysqli_connect("localhost","Prueba","Pru eba")

Hecho de menos alguna herencia.. y algún constructor.
RE: Pudistes detallar mi codigo, ves que trabajo con jquery, podrias darme un ejemplo de como aplicaria o mejor aun como es que podria aplicar herencia de acuerdo al codigo que ya vistes?

De verdad muchas gracias...
  #5 (permalink)  
Antiguo 05/04/2015, 11:15
Avatar de Djoaq  
Fecha de Ingreso: septiembre-2012
Ubicación: Barcelona
Mensajes: 271
Antigüedad: 11 años, 6 meses
Puntos: 38
Respuesta: Podria mejorar el codigo???

Hola lo del tema de mysqli no lo ví bién .

A lo de escapara los caracteres me refiero a que uses funciones como :
Código PHP:
mysql_real_escape_string 
Piensa que los inputs siempre són los puntos más calientes para que un visitante malintencionado altere el comportamiento de tus consultas .

Vamos a hacer un ejemplo sencillo :

Código MySQL:
Ver original
  1. SELECT * FROM tbl_usuarios WHERE nombe = TU INPUT AND pass = TUINPUT2


Imagina que un usuario malintencionado tuviese un form e introdujera en el campo nombre :

Código SQL:
Ver original
  1. blabla /*

Y en el campo pass :

Código SQL:
Ver original
  1. */ OR 1=1


Y le dieras al submit .. Lo que pasaría es que tu consulta quedaría :

Código MySQL:
Ver original
  1. SELECT * FROM tbl_usuarios WHERE nombe = blabla /* AND pass =  */ OR 1=1

Como hemos desactivado la condición , hemos añadido el op lógico OR y 1=1 siempre dará true .. el resultado sera que nos mostrara todos los nombre de usuario y contraseñas de la bd.

Esto es un ejemplo sencillo para que veas el concepto de algunas inyecciones de SQL .

Luego el ejemplo de herencia básico sería algo como :

Código PHP:
<?php
class BaseDatos 
{
function 
__construct()
{
$conexion=mysqli_connect("localhost","Prueba","Pru eba")or die("ERROR, no se puede conectar a la base de datos: ".mysqli_error());
mysqli_select_db($conexion,"Prueba");

return 
$conexion;
}

}
Código PHP:
<?php
class Prueba extends BaseDatos 
{

function 
__construct(){
 
parent::__construct();
}


function 
agregarNombre($Nombre)
{
$json['bandera']="";

mysqli_query($this->conexion,"BEGIN");
$sql="INSERT into Prueba(Nombre)values('".$Nombre."')";
$query=mysqli_query($this->conexion,$sql)or die("ERROR, no se pudo insertar en la base de datos: ".mysqli_error());

if(
$query==FALSE)
{
mysqli_query($this->conexion,"ROLLBACK");
$json['bandera']="0";
}
else
if(
$query!=FALSE)
{
mysqli_query($this->conexion,"COMMIT");
$json['bandera']="1";
}
echo 
json_encode($json);
}
}

?>
No lo he probado es teórico .


De esta forma cuando haces :
$objPrueba = new Prueba;
al inicializarse el consturctor de prueba llama al constructor de la clase conexión.
$objPrueba->agregarNombre(params);

La idea es cuando heredas usas la palabra reservada extends al declarar la clase .
Se heredan todos los atributos y métodos , recuerda atributo = var y método = funcion.
Los atributos public y protected se heredan mientras que private no. ( A esto se le llama encapsulación ).

Luego las constantes se definen con cons y las propiedades estáticas con la palabra reservada static .. y se acceden a ellas mediante nombreClasse::$mivarstatic ;
Recuerda también que poner una función con el mismo nombre de la clase es lo mismo que usar __construct().
El constructor es lo primero que se ejecuta nada mas instanciar una clase.
y con el operador de resolución parent:: estamos instanciando el constructor de la clase padre en la case hija .

Un saludo!
  #6 (permalink)  
Antiguo 06/04/2015, 09:13
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Podria mejorar el codigo???

Cita:
Pero mi objetivo es recibir criticas, recomendaciones, me gustaria saber si podria mejorar de alguna manera mi manera de programar en PHP OOP
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 14/04/2015, 21:30
 
Fecha de Ingreso: septiembre-2010
Mensajes: 28
Antigüedad: 13 años, 7 meses
Puntos: 1
Respuesta: Podria mejorar el codigo???

Hola Djoaq, Muchas gracias por tus respuestas. Ayudan bastante. Gracias.
  #8 (permalink)  
Antiguo 15/04/2015, 06:47
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Podria mejorar el codigo???

Cita:
Iniciado por hhs Ver Mensaje
+1
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Etiquetas: formulario, html, mejorar, mysql, select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:35.