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'") )
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))));
}
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.
- Abrimos la conexión para poder usar mysql_real_escape_string() y evitar posibles inyecciones de código.
- Quitamos cualquier espacio de más usando trim()
- Eliminamos posibles etiquetas y caracteres como < > con strip_tags()
- quitamos posibles barras de un string con comillas escapadas con stripslashes().
- 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

Bueno, la verdad es que lo hice sencillito para la gente, pero efectivamente me di cuenta que la seguridad era mejorable.
Saludos 


Este tema le ha gustado a 11 personas