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