Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/07/2011, 14:24
IEKK
 
Fecha de Ingreso: agosto-2010
Ubicación: Tenerife
Mensajes: 893
Antigüedad: 13 años, 7 meses
Puntos: 202
Ejemplo/Aporte Separar conexion y consultas + seguridad en pocas líneas

Bueno me animo a dejarles estas 3 pequeñas funciones por si pueden servir de ayuda a aquellos que comienzan con php y las consultas.

Muchas veces veo en este foro y en otros lugares que la gente copia al principio de cada página la conexión de la base de datos y después de todo el código lo acaba con varios mysql_free_result() y mysql_close() (Si es que los ponen)
También es habitual gente que pregunta donde está su error en la consulta cuando basta con añadir un mysql_error() para saberlo.

Igualmente la gente repite demasiado los mysql_query() y los mysql_fetch
Podemos hallar los datos con una sola línea ayudándonos de estas funciones que me dió por hacer.

Código PHP:
if($row get_rows("SELECT id FROM registro WHERE nick='$nick' and password='$password'") ) 
Muestro un ejemplo sencillito que hice:

connection.php
Código PHP:
class DBconnection{
    
    public 
$db_data;  
     
    function 
connect(){
    if(
$this->db_data mysql_connect("***""***""***") or die(mysql_error()) )
        return ( 
$db_name mysql_select_db("***"$this->db_data ) or die(mysql_error()) ) ? true false;
    }
}

function 
get_rows($result=''){
    
$con = new DBconnection;
    if (
$con->connect() and !empty($result)){
        
        
$result=mysql_query($result) or die(mysql_error()); 
        
$row mysql_fetch_array($result);
        
        
mysql_free_result($result);
        
mysql_close($con->db_data);
        
        return 
$row;
    }
}

//Seguridad para evitar ataques
function clean_var($var=''){
    
$con = new DBconnection;
    if (
$con->connect())
        return 
mysql_real_escape_string(trim(strip_tags(stripslashes($var))));

Y aquí un ejemplo de un login para mostrar como se usa. Así de paso puede ayudar a quienes empiezen en este mundillo.

Código PHP:
<?php
include("conexion/connection.php");

if (isset (
$_POST["iniciar"] )){

    
$nick     clean_var($_POST["nick"]);
    
$password clean_var($_POST["pass"]);
    
    if(
$row get_rows("SELECT id FROM registro WHERE nick='$nick' and password='$password'") ){
        
session_start();
        
$_SESSION["user_id"] = $row["id"];
        
$_SESSION["user_name"] = $nick;
        echo
'<script languaje="javascript">alert(\'Bienvenido '.$nick.'.\');</script>';
    }
    else
        echo
'<script languaje="javascript">alert(\'Los datos no coinciden.\');</script>';
}

if (isset (
$_POST["salir"]) and isset($_SESSION["user_id"]) ) // cerrar session
    
session_destroy();
?>

<?php if( ! isset($_SESSION["user_id"]) ) { ?>

<form action="<?php $_SERVER["PHP_SELF"?>" method="post">
<input type="text"     name="nick"   maxlength="14"  />
<input type="password" name="pass"   maxlength="14"  />
<input type="submit"   name="iniciar" value="Acceder"/>
</form>

<?php } else { ?>

<form action="<?php $_SERVER["PHP_SELF"?>" method="post">
<input type="text"   name="nick"  readonly="readonly" value="<?php echo $_SESSION["user_name"?>" />
<input type="submit" name="salir" value="Salir" />
</form>

<?php ?>

Explicaré las funciones ya que el ejemplo va para quienes comienzan:
  • connect() -> Establece la conexión a la base de datos.
    No llamaremos a esta función que está dentro de una clase y orientada a objetos, sino que sólo abriremos la conexión cuando se haga una consulta.
  • clean_var() -> Se encarga de la seguridad de las variables que enviemos por POST o GET.
    1. Abrimos la conexión para poder usar mysql_real_escape_string() y evitar posibles inyecciones de código.
    2. Quitamos cualquier espacio de más usando trim()
    3. Eliminamos posibles etiquetas y caracteres como < > con strip_tags()
    4. quitamos posibles barras de un string con comillas escapadas con stripslashes().
    5. IMPORTANTE: recuerda que es un ejemplo para un login, muchas de estas funciones pueden ser innecesarias, por ejemplo si quieres enviar un código html por post.
  • get_rows() -> Realiza la consulta, devuelve el array con los datos, libera la memoria de la consulta y cierra la conexión.

Seguramente sea mejorable en cuyo caso cualquier idea siempre es bien recibida
__________________
Pensaba que internet era una gran biblioteca de sabiduría, hasta que comprendí que un libro no puede tener mil páginas llenas de faltas de ortografía... :(