2010-07-29 28 views
5

Empecé a trabajar con php y mysql hoy. Básicamente, lo que tengo es una página vacía con piezas que llevo al buscar una identificación en una base de datos. Así que en mi página de inicio tengo una url que tiene este aspecto:php y mysql, mejores prácticas

<a href="content/display.php?id=id1"> 

Y luego en mi display.php tengo esto:

<?php 
    include '../includes/header.php'; 
    $id = $_GET['id']; 
    $mysqli = new mysqli('localhost','username','password','dbname'); 
    if($result = $mysqli->query("SELECT * FROM portfolio WHERE id='".$id."'")) 
    { 
     while($row = $result->fetch_object()) 
     { 
      $head = $row->head; 
      $img1 = $row->img1; 
      $img2 = $row->img2; 
      $img_url = $row->imgurl; 
      $img_thumb = $row->imgthumb; 
      $vid = $row->vid; 
      $swf = $row->swf; 
      $url = $row->url; 
      $url_text = $row->urltext; 
      $text = $row->text; 
     } 
    } 
    else echo $mysqli->error; 
?> 

Es una mesa escasa en que no todos los campos tendrá información (muchos podrían ser nulos). Básicamente que contiene los nombres de archivo y luego en el html tengo código que se parece a esto:

if(isset($img1)) 
        { 
         echo '<img src="images/'.$img1.'" />'; 
        } 

Un par de preguntas,

  1. ¿Es esta la mejor manera de hacer esto?
  2. Cada vez que visito display.php, estoy volviendo a abrir una conexión de base de datos, ¿verdad? Eso no puede ser bueno ...
  3. Elegí poner los nombres de los archivos en la base de datos, en lugar de los nombres completos de las rutas, o incluso los archivos mismos, suponiendo que, si cambio el nombre del archivo, puede ir a la base de datos y actualizarla para el archivo que quiero cambiar. Si cambio la ruta, puedo cambiarla una vez en el html. ¿Es esa la mejor idea?

¡Gracias!

+0

(re) abrir una conexión de base de datos es una práctica común, no debería importar mucho. Sin embargo, me pregunto por qué quieres todas las propiedades del objeto en otra variable. – Wrikken

+0

Supongo que no tuve que envolver todo el sitio en ese ciclo while ... Supongo que puedo hacerlo aunque – JPC

Respuesta

6

1) No, aunque esa es la manera más fácil para comenzar. Después de que se sienta cómodo con los conceptos básicos, debe dedicar algún tiempo a considerar diferentes enfoques de la estructura de la aplicación. La regla más importante es separar preocupaciones. No mezcle el código de la base de datos con el código de lógica de negocios con el código de presentación. Pero como dije, no es algo de lo que debas preocuparte en tu primer día. Por ahora solo aprende lo básico.

2) No hay otra manera en realidad. Para una aplicación web, cada solicitud del navegador es como una aplicación individual. Existe la posibilidad de utilizar las denominadas conexiones de bases de datos persistentes, pero al igual que en el punto anterior, es algo que no debería tratar el primer día, ya que requieren una configuración específica de su servidor web. Por el momento solo usa conexiones normales.

3) Esa es una idea bastante sensata. También puede definir su ruta de imagen como una constante de PHP, de modo que en caso de que sea necesario un cambio, solo cambie esta constante.

4) Lo que dice el sAc en su respuesta es muy importante. Lea sobre las inyecciones de SQL y cómo prevenirlas.

+0

1) Estoy familiarizado con el enfoque MVC. Sin embargo, soy bastante nuevo en PHP. Utilicé Struts 2 y el marco se unió para facilitar la separación de negocios, datos y presentación. Para referencia futura, me gustaría obtener más información acerca de cómo hacer esto en php. ¿Alguna sugerencia de una buena guía para empezar? Gracias! – JPC

+0

Oh, en ese caso es completamente diferente :) Existen varios frameworks MVC para PHP que difieren enormemente en los detalles de implementación. Uno muy popular es Zend Framework, muchos dicen que en realidad es una colección de clases débilmente acopladas. Por otro lado, hay marcos como Symfony que implementan el modelo de 'configuración por convención'. Seguramente encontrará algo que se adapte a sus necesidades. – Mchl

+0

@Col. Metralla Todavía soy un poco nuevo en este sitio y estoy respondiendo el protocolo. No me di cuenta de que solo podía elegir una respuesta. – JPC

6

que son vulnerables a SQL injection, adecuadamente conversión de tipos variables:

$id = (int) $_GET['id']; 

utilizar funciones como mysql_real_escape_string o aún mejor uso:

+2

+1 para declaraciones preparadas – Wrikken

+0

He usado declaraciones preparadas para jdbc pero no para php, así que ' estoy algo familiar. Lo comprobaré. Como mi id no es una int, ¿para eso sirve mysql_real_escape_string? Gracias – JPC

+0

@JPC: Sí, puedes usar 'what mysql_real_escape_string'. – Sarfraz

1

inyección SQL & ya se mencionaron las declaraciones preparadas.Una adición a eso sería:

else echo $mysqli->error; 

cambiarlo a:

else trigger_error($mysqli->error,E_USER_ERROR); 

¿Por qué lo preguntas? Debido a que los visitantes no deberían tener idea de su base de datos y no pueden corregir el error, no deberían verla. De esta forma, puede desarrollar de manera segura con display_errors en, y en el sitio en vivo display_errors está desactivado, y usted log_errors en un registro de error.

+0

¿Dónde se registran los errores? ¿Tengo que configurar display_errors y log_errors en alguna parte? – JPC

+0

Yo diría que, de hecho, la mejor manera es transformar todos los errores a ErrorExceptions como se describe aquí http://php.net/manual/en/class.errorexception.php, pero de nuevo es un tema un poco más avanzado. – Mchl

+1

@Mchl excepciones es más un error * manejo * mientras Wrikken habla de error * tracking *. eso es mundos diferentes, que no interfieren. De hecho, puedes usar ambos en el mismo guión. –

1

Parece que tiene una buena idea de lo que quiere hacer. No sé cuánto desarrollo tienes, pero sería una buena idea comenzar a aprender sobre MVC's en php como CakePHP, Fuse o incluso Zend Framework (bleh !!!). Le ahorraré tiempo en aplicaciones más robustas al predefinir toda su interfaz básica de bases de datos, el manejo de plantillas, el manejo de sesiones y le permitirá preocuparse por problemas de mayor nivel, como lo que es para el almuerzo. :)

Cuestiones relacionadas