sábado, 11 de agosto de 2012

registro de usuarios y activacion por email

Bueno acá le traigo otros códigos  lo comparto con todos ustedes, porque asi me ayudarían mejorar el código, creo que en google NO ESTA... Soy estudiante de programación, y en verdad lo que poco saben muy poco de explican, porque se creen que se van a la NASA...yo tomo de la base primero validar los formularios sin java-script.. y después lo valido con java, en este ejemplo estoy usando jquery... y voy a subir todos los códigos  desde el principio hasta el fin., Solo lo tienen que copiar y pegar..


1-) Así esta formado el WAMPSERVER

2-) Código de la Clase registro.php
Los jquery  que tienen que bajar son esto dos (jquery.validate.js, jquery.min.js) van en la carpeta js...  (-mas abajo pongo el script como validar el formulario con jquery)..

<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="cache-control" content="no-cache">
<title>Formulario Registro</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<script type="text/javascript" src="js/validarregistro.js"> </script>
</head>

<body>
<div id="page">
<form action="<?php echo htmlentities($_SERVER['PHP_SELF'])?>" method="post" id="frm_registros" onSubmit="return checkForm(this);">
  <div id="respond">
    <h3>Regístrate Es gratis (y lo seguirá siendo).</h3>
    <br/>
    <div >
      <label class="campo">Nombre de Usuario</label>
      <input name="txtusuario" type="text" autofocus class="text" id="txtusuario" 
        value="<?php if(isset($_POST['txtusuario'])){echo htmlentities($_POST['txtusuario']);} ?>" />
    </div>
    <div>
      <label class="campo">Contraseña</label>
      <input name="txtpass" type="password" class="text" id="txtpass" />
    </div>
    <div>
      <label class="campo">Confirmar Contraseña</label>
      <input name="txtpassb" type="password" class="text" id="txtpassb" />
    </div>
    <div>
      <label class="campo">E-mail:(requerido)</label>
      <input name="txtemail" type="text" class="text" id="txtemail" 
        value="<?php if(isset($_POST['txtemail'])){echo htmlentities($_POST['txtemail']);} ?>" />
    </div>
    <div>
      <input name="btningresar" type="submit" id="btningresar" value="Regístrate" />
    </div>
    <br/>
    <p>Recibirás un email de confirmación con un enlace a una página que deberás visitar en las próximas 24 horas para activar tu cuenta.</p>
    <br/>
    <div>[ <a href="reset.php">¿Perdiste tu Contraseña?</a> ] </div >
    <br/>
    <?php  
  include("includes/registrar_in_usuario.php");
  if ($error) {
  echo '<ul>';
  foreach ($error as $alerta) {
    echo "<li class='avertencia'>$alerta</li>\n";

  echo '</ul>'; }
?>
  </div>

</form>
</div>
</body>
</html>

3-)Clase que va en la carpeta includes se llama (registrar_in_usuario.php)

<?php
include("oConexion.php");
$error = array();
if(array_key_exists('btningresar', $_POST)){ 
$usuario = "";
$pass = "";
$pass2 = "";
$email = "";
  $usuario = trim(strtolower($_POST['txtusuario']));
  if($usuario == "")
  {
  $error['txtnombre']= "Debes ingresar un nombre de usuario para registrarte.";
  }
  //comprobar si existe el usuarios registrado
  if ($_POST['txtusuario']){
   $query = mysql_query("SELECT usuario FROM usuarios WHERE usuario ='".$usuario."' LIMIT 1") or die(mysql_error());
   
    $data = mysql_fetch_array($query);
    if($data['usuario'] == $usuario) {
    $error['txtusuario'] = "Ya existe ese nombre de usuario.";}else if($_POST['txtusuario']){
   $query = mysql_query("SELECT usuario FROM registros WHERE usuario ='".$usuario."' LIMIT 1") or die(mysql_error());
   
    $data = mysql_fetch_array($query);
    if($data['usuario'] == $usuario) {
    $error['txtusuario'] = "El nombre de usuarios ya se encuentra registrado, esperando por su aprobación, intente de nuevo durante 24 horas.";}
     }}//fin de comprabar el usuarios  
  $pass = trim($_POST['txtpass']);
  $digitos = strlen($pass); //con esto te da el numero de digitos
  if($pass == "")
  {
  $error['txtpass']= "Debes ingresar una contraseña para registrarte.";
  }else if($digitos < 6)
  {
  $error['txtpass']= "Ingrese una contraseña mayor a 6 digito";
  }
  $pass2 = trim($_POST['txtpassb']);  
  if ($pass2 != $pass){
   $error['txtpassb']= "Por favor confirma tu contraseña.";
  
  }
  $email= strtolower($_POST['txtemail']);
   if($email=="")
   {
    $error['txtemail']="Ingresar una dirección de E-Mail.";
    }else if(!empty($email)){
    // expresión regular para identificar caracteres ilegales en dirección email
     $comprobarEmail = '/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/ix';
    //rechazar la dirección email si no cumple la expresión regular
    if (!preg_match($comprobarEmail, $email)) {
    $error['txtemail'] = 'Por favor escribe una dirección email válida';}//fin de preg_match
    }//fin del else y el if donde comprueba si es distinto a vacio $email
    //comprobar si existe el email registrado
    if ($_POST['txtemail']) {
    $query = mysql_query("SELECT email FROM usuarios WHERE email ='".$email."' LIMIT 1") or die(mysql_error());    
    $data = mysql_fetch_array($query);
    if($data['email'] == $email) {
    $error['txtemail'] = "Dirección de E-Mail ya registrada.";}else if($_POST['txtemail']){
    $query = mysql_query("SELECT email FROM registros WHERE email ='".$email."' LIMIT 1") or die(mysql_error());
   
    $data = mysql_fetch_array($query);
    if($data['email'] == $email) {
    $error['txtemail'] = "El E-mail ya se encuentra registrado, esperando por su activación, intente de nuevo durante 24 horas.";}
     }}//fin de comprabar el email
    
  if(!$error)
  {
   try
   {
    $codigoverificacion = substr(md5(uniqid(rand())),0,50);// Conseguimos un codigo aleatorio de 50 digitos.
    
    if (!mysql_query("INSERT INTO registros(usuario,contrasena,email,codigo) values ('$usuario','$pass','$email','$codigoverificacion')"));
    //dibujar el mensaje para confirma el registro de usuarios
       
    $headers = "From: TUEMAIL@gmail.com \r\n";
    $headers .= "X-Mailer: PHP/" . phpversion();
    $subject = "Activacion de Cuenta de Usuario Nuevo.";    
    $message = "Bienvenido a Omegave!, \r\n";
    $message .= "\r\n";
    $message .= "Registraste la siguiente cuenta de E-Mail " .$email. " para abrir una cuenta en jrondon.\r\n";
    $message .= "\r\n";
                               $message .= "Para terminar el proceso de registro debes visitar el siguiente enlace dentro de las próximas 24 horas para activar tu"; 
    $message .= "cuenta de usuario, de lo contrario la información que enviaste será borrada de forma automática por el sistema y tendrás que";
    $message .= "registrarte de nuevo."; 
    $message .= "\n\n";  
     $message .= "Para confirmarlo debe hacer click en el siguiente enlace:";
    $message .= "\r\n";
    $message .= "http://TUSITIO.com/confirmar.php?codigo=".$codigoverificacion;
    $message .= "\n\n";
    $message .= "A continuación la información de usuario:";
                 $message .= "\r\n";
                 $message .= "-Nickname: ".$usuario." \r\n";    
                 $message .= "-Contraseña: ".$pass." \r\n";
                 $message .= "\r\n";
       putenv('TZ=America/Montevideo');
    $message .= "Enviado el: " .date('d/m/Y | H:i:s',time())." | " .$_SERVER['REMOTE_ADDR'];        
      $message .= "\n\n";
       $message .= "Sin otro particular, saludamos a Usted muy atentamente.\r\n TU EMPRESA";
    
     if (mail($email,utf8_decode($subject), utf8_decode($message), $headers)){ 
     echo "</br>";      
     die("<font color='Red'>No se pudo enviar el email de confirmacion.</font>");    
     header('Location: ../account.php');
       exit();   
     }else {
     echo "</br>"; 
     $error = 'El envio ha fallado, por favor contacte al administrador sobre este problema';}
    
    }catch(Exeception $ex)
    {
     echo "Problema en la base de datos al ingresar registrar " .$ex->getMessage();
    }
   }

 }
$_POST= array();
?>

4-)Mensaje después que se registra el usuario. va en la carpeta includes (account.php)


<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="cache-control" content="no-cache">
<title>Formulario Registro</title>
<link rel="stylesheet" type="text/css" href="css/style.css">

</head>
<body>

<div id="page">
  <div id="respond">
    <h2 align='center' style= 'color:#FF0000'>Activación de usuario nuevo</h2>
    <br/>
    <div align='center'>
      <h1>
        <p>Tu cuenta ha sido registrada, sin embargo, esta requiere que la confirmes desde el email que ingresaste en el registro.</p>
      </h1>
    </div>
    <br/>
    <div align="center">
      <p>Nota: Recibirás un email de confirmación con un enlace a una página que deberás visitar en las próximas 24 horas para activar tu cuenta.</p>
    </div>
    <br/>
  </div>
</div>

</body>
</html>


5-) Código de la pagina de confirmar.php 








<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="cache-control" content="no-cache">
<title>Formulario de confirmacion</title>
<link rel="stylesheet" type="text/css" href="css/style.css">

</head>
<body>
<div id="page">
  <div id="respond">
    <?php
  session_start();
  include("includes/oConexion.php");
  $codigo = $_GET['codigo'];
  if($codigo != ""){  
  $buscar = mysql_query("SELECT * FROM registros WHERE codigo='".$codigo."'"); // Buscamos el codigo
  if ($resultado = mysql_fetch_array($buscar)) // Si se encontro el codigo de verificacion seguimos
  {
   if (!mysql_query("DELETE FROM registros WHERE codigo='".$codigo."' LIMIT 1")) die (mysql_error()); // Borramos el registro para que no pueda reutilizar el codigo de verificacion.
   if (!mysql_query("INSERT INTO usuarios(usuario,contrasena,email) values ('".$resultado['usuario']."','".$resultado['contrasena']."','".$resultado['email']."')")) die (mysql_error()); // Ahora si registramos al usuario
   
  echo "<h1 align='center' style= 'color:#FF0000'>Registro de Nuevo Usuario: Paso Final</h1>";
        echo "<br/>";        
        echo "<div align='center'><strong>Has confirmado tu cuenta correctamente </strong><a href='login.php' style='color:#00F'>Ingresar.</a> </div>";
        echo "<br/>";
   
  }
  else // Si no encontro el codigo de verificacion, le damos error:
  {
  echo "<h1 align='center' style= 'color:red'>Error de activación de usuario nuevo</h1>";
        echo "<br/>";
        echo "<div align='center'>";
        echo "<h1>No existe ningún usuario en la base de datos con ésta información.</h1>";
        echo "</div>";
        echo "<br/>";
        echo "<div align='center'><strong>Puedes registrate como usuario nuevo utilizando el formulario </strong><a href='registro.php' style='color:#00F'>aquí.</a> </div>";
         echo "<br/>";
  
  }
  }else 
  {
   header("location: registro.php");
   session_destroy();
   }
  ?>
  </div>
  <!-- fin de respond--> 
</div>
</body>
</html>

6-) conexión a la base de datos(asi se llama la clase oConexion.php).
<?php
$mysql_host = "localhost";
$mysql_user = "root";
$mysql_password = "";
$mysql_database = "DB1_jrondon2013";

if(!$conexion= mysql_connect($mysql_host,$mysql_user,$mysql_password))
{
die("No se puedo ejecutar la conexion ". mysql_error());
}
if(!mysql_select_db($mysql_database, $conexion))
{
die("No se pudo seleccionar la base de datos ". mysql_error());
}
?>
7-)Validar formulario así se llama el script (jquery.registro.js)

$(document).ready(function() {
                $.validator.addMethod("regex",function(value,element,regexp){
                    var re= new RegExp(regexp)
                    return this.optional(element) || re.test(value);
                },"Solo caracteres Alfanumérico");
                $("#frm_registros").validate({
                    rules:{
                        
                        txtusuario:{
                            required:true, 
                            regex:"^[a-zA-Z0-9_]+$",
                            remote:"exiusuarios.php"
                        },
txtpass:{
required:true,
minlength:8
},
txtpassb:{
equalTo:"#txtpass"
},
txtemail:{
required:true,
remote:"exiEmail.php",
email:true}
                        
                        
                    },
//inicicio de mensaje                    
                    messages:{
                                             
                        txtusuario:{
                            required:"Ingrese su nombre de usuario",
                            remote:"El usuario ya existe"
                        },
txtpass:{
required:"Ingrese una contraseña",
minlength:"Ingrese una contraseña mayor a 8 digito"
},
txtpassb:{
equalTo:"Confirma tu contraseña"
},
txtemail:{
required:"Ingrese una dirección de E-mail para su confirmación",
email:"Por favor escribe una dirección email válida",
remote:"Ingrese una dirección de E-mail diferente"
}      
                    }//fin del los mensaje
                    
                        
                    
                    
                })
            });


8-)remote:"frm_usuarios.php"

<?php
session_start();
include("includes/oConexion.php");
$usuario = $_GET['txtusuario'];
if($usuario !=""){
 $consulta = "select usuario from usuarios WHERE usuario='$usuario'";
 $resul = mysql_query($consulta, $conexion);
 if (mysql_fetch_assoc($resul)) {
  echo "false";}
  else {
   echo "true";}
   }else {
    header("location: login.php");
    session_destroy();}

?>

9-)remote:"exiEmail.php",

<?php
session_start();
include("includes/oConexion.php");
$exiemail = $_GET['txtemail'];
if($exiemail !="")
{
$consulta = "select email from usuarios WHERE email='$exiemail'";
$resul = mysql_query($consulta, $conexion);
if (mysql_fetch_assoc($resul)) {
echo "false";} 
else {
echo "true";}
}else {
header("location: login.php");
session_destroy();
}

?>

10-)Hoja de estilo...(style.css)

@charset "utf-8";
/* Reset */
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video {
font-family: "Segoe UI", "Lucida Grande", "Lucida Sans Unicode", tahoma, Arial, Verdana, sans-serif;
font-size: 100%;
letter-spacing: 0em;
vertical-align: middle;
margin: 0px;
padding: 0px;
border: 0px;
outline: 0px;
}
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
display: block;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after, q:before, q:after {
content: "";
content: none;
}
h1, h2, h3, h4, h5, h6 {
margin: 10px 0;
font-family: inherit;
font-weight: bold;
line-height: 10px;
color: inherit;
text-rendering: optimizelegibility;
}
h1 small, h2 small, h3 small, h4 small, h5 small, h6 small {
font-weight: normal;
line-height: 1;
color: #999;
}
h1, h2, h3 {
line-height: 10px;
color: #999;
font-style: oblique;
}
h1 {
font-size: 30.5px;
}
h2 {
font-size: 28.5px;
}
h3 {
font-size: 24.5px;
}
h4 {
font-size: 17.5px;
}
h5 {
font-size: 14px;
}
h6 {
font-size: 11.9px;
}
h1 small {
font-size: 24.5px;
}
h2 small {
font-size: 17.5px;
}
h3 small {
font-size: 14px;
}
h4 small {
font-size: 14px;
}
html {
font-size: 100%;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
a {
color: #0088cc;
text-decoration: none;
font-size: 14px;
}
a:hover {
color: #005580;
text-decoration: underline;
}
a:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
a:hover, a:active {
outline: 0;
}
p {
font-size: 13px;
margin: 0 0 10px;
}
@page {
 margin: 0.5cm;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3 {
page-break-after: avoid;
}
strong {
font-weight: bold;
}
em {
font-style: italic;
}
body {
margin: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 20px;
color: #333333;
background-color: #ffffff;
}
form {
width: 60%;
margin: 0 auto;
padding: 12px;
}
#page {
width: 890px;
background-color: #FFF;
margin: auto;
border-radius: 10px;
box-shadow: 0px 5px 20px #FFF;
 *zoom: 1;
}
div#respond {
border: 1px solid #CED5D7;
border-radius: 10px;
margin-top: auto;
padding: 25px;
border: 1px solid #CED5D7;
box-shadow: 0 0 0 3px #E5E5E5;
}
label, input, button, select, textarea {
font-size: 98%;
font-weight: normal;
line-height: 20px;
}
input, button, select, textarea {
font-family: Arial, "Helvetica Neue", Helvetica, sans-serif;
}
label {
margin-bottom: 5px;
}
label.campo {
width: auto;
display: block;
margin: .2em 0 0;
}
.inputcaptcha {
font-size: 14px;
padding: 6px;
border-radius: 0 5px 5px 5px;
border: 1px solid #CCC;
width: 40px;
text-align: center;
}
.text {
width: 220px;/*para poner un tamaño a los text ya que tengo captcha y no lo puedo poner por defecto*/
}
input[type=text], input[type=password], input[type=email], input[type=url] {
padding: 6px;
border-radius: 0 5px 5px 5px;
border: 1px solid #CCC;
/*width: 200px; //problema porque se me agranda el text del captcha*/
height: 20px;
}
textarea {
padding: 6px;
border-radius: 0 5px 5px 5px;
border: 1px solid #CCC;
resize: none; /* esta propiedad es para que el textarea no sea redimensionable */
width: 350px;
height: 130px;
}
input[type=submit] {
margin-top: 20px;
min-width: 100px;
padding: 7px 20px;
text-align: center;
cursor: pointer;
}
.avertencia {
color: Red;
font-size: 13px;
}
label.error {
background-color: #BC1010;
padding: 6px 12px;
border-radius: 4px;
color: white;
font-weight: bold;
margin-left: 12px;
position: absolute;
font-family: Arial, Verdana, sans-serif;
font-size: 10px;
}
.error:before { /* Este es un truco para crear una flechita */
content: '';
border-top: 8px solid transparent;
border-bottom: 8px solid transparent;
border-right: 8px solid #BC1010;
border-left: 8px solid transparent;
left: -16px;
position: absolute;
top: 5px;
}
.mainTitle {
color: #333;
font-size: 18px;
}
#footer a, #footer p {
font-family: Arial, Helvetica, sans-serif;
font-size: 11px;
color: #454545;
font-weight: normal;
float: left;
}

11-)Bueno aca le dejo el script de la base de datos la cual estoy usando, se llama (DB1_jrondon2013), solo tiene que copiar y pegarlo en la consola de mysql y ejecutarla.

drop database IF EXISTS DB1_jrondon2013;

CREATE DATABASE DB1_jrondon2013 CHARSET=UTF8;

USE DB1_jrondon2013;

CREATE TABLE IF NOT EXISTS comment ( 
mensaje_id int PRIMARY KEY NOT NULL AUTO_INCREMENT,
nombre varchar(50) NOT NULL,
email varchar(50) NOT NULL, 
url varchar(50) DEFAULT NULL,
comentarios text NOT NULL, 
fecha timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
ENGINE=INNODB DEFAULT CHARSET=UTF8;

CREATE TABLE IF NOT EXISTS registros ( 
cod_registro int PRIMARY KEY NOT NULL AUTO_INCREMENT, 
codigo varchar(50) NOT NULL,
usuario varchar(20) NOT NULL,
contrasena varchar(20) NOT NULL,
email varchar(50) NOT NULL,
fecha_ingreso timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
activado enum('NO') NOT NULL)
ENGINE=INNODB DEFAULT CHARSET=UTF8;

CREATE TABLE IF NOT EXISTS tbchange (
cod_change int PRIMARY KEY NOT NULL AUTO_INCREMENT, 
codigo_verific varchar(50) NOT NULL,
email varchar(50) NOT NULL) 
ENGINE=INNODB DEFAULT CHARSET=UTF8;

CREATE TABLE IF NOT EXISTS usuarios (
  co_digo int PRIMARY KEY NOT NULL AUTO_INCREMENT,
  admin_priv enum('u','a') NOT NULL,
  usuario varchar(30) NOT NULL,
  contrasena varchar(30) NOT NULL,
  email varchar(50) NOT NULL,
  fecha_ingreso timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `o_usuario` (`usuario`) USING BTREE,
  UNIQUE KEY `o_email` (`email`) USING BTREE)
ENGINE=INNODB DEFAULT CHARSET=UTF8;



12-)Bueno alguna cosa dejen un comentarios que responderé cuando tenga tiempo y le envió todos en códigos por email, NO SE OLVIDEN DECIR DE QUE PAIS SON..  así llevo el registros. Y puedo seguir mejorando el codigo...


jueves, 9 de agosto de 2012

Pies de pagina con ip (footer)


Acá le dejo un script para un pies de pagina, solo tiene que copiar y pegar, se trata de sacar la ip de la pc que no visita y lo guarda en un bloc de nota.. así tenemos un registro de las ip que entraron a nuestra pagina...


yo lo tengo de esta forma en una carpeta (includes) y alli tengo esta clase llamada (footer.inc.php) allí agregue todos este código y lo llame de esta forma 

<p>
     <?php include("includes/footer.inc.php"); ?>
    </p>

<div id="footer">
<p>Copyright &copy;&copy;<?php $anInicio ?>
<?php ini_set('date.timezone', 'America/Montevideo');
$anInicio = "";
$anActual = date ('Y');
if ($anActual == $anInicio) {
  echo $anInicio;
  }
else {
 echo " {$anActual}";
 }
?>
 | Política de Privacidad |</p>
<p>Disenado por: Jhonny Rondon |
<?php
if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) != '')
   {
      $client_ip =
         ( !empty($_SERVER['REMOTE_ADDR']) ) ?
            $_SERVER['REMOTE_ADDR']
            :
            ( ( !empty($_ENV['REMOTE_ADDR']) ) ?
               $_ENV['REMOTE_ADDR']
               :
               "unknown" );

      // los proxys van añadiendo al final de esta cabecera
      // las direcciones ip que van "ocultando". Para localizar la ip real
      // del usuario se comienza a mirar por el principio hasta encontrar
      // una dirección ip que no sea del rango privado. En caso de no
      // encontrarse ninguna se toma como valor el REMOTE_ADDR

      $entries = preg_split('/[, ]/', $_SERVER['HTTP_X_FORWARDED_FOR']);

      reset($entries);
      while (list(, $entry) = each($entries))
      {
         $entry = trim($entry);
         if ( preg_match("/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/", $entry, $ip_list) )
         {
            // http://www.faqs.org/rfcs/rfc1918.html
            $private_ip = array(
                  '/^0\./',
                  '/^127\.0\.0\.1/',
                  '/^192\.168\..*/',
                  '/^172\.((1[6-9])|(2[0-9])|(3[0-1]))\..*/',
                  '/^10\..*/');

            $found_ip = preg_replace($private_ip, $client_ip, $ip_list[1]);

            if ($client_ip != $found_ip)
            {
               $client_ip = $found_ip;
               break;
            }
         }
      }
   }
   else
   {
      $client_ip =
         ( !empty($_SERVER['REMOTE_ADDR']) ) ?
            $_SERVER['REMOTE_ADDR']
            :
            ( ( !empty($_ENV['REMOTE_ADDR']) ) ?
               $_ENV['REMOTE_ADDR']
               :
               "unknown" );
   }
?>
<?php
if(!empty($client_ip))
{
echo  $client_ip;
}
else
{
echo 'Imposible obtener tu direccion Ip';
}
$archivo = "registroIPdevistante.txt"; //Esto creará el Archivo donde guarda las ips
$manejador = fopen($archivo,"a") or die("Imposible abrir el archivo\n"); //Esto abre el archivo
$fecha= date('d/m/Y H:i:s',time())."|";
$fecha.="\r\n";
fwrite($manejador,$client_ip.' '.$fecha ); //Esto muestra la ip y la fecha en el archivo
fclose($manejador);
?>
</p>
</div>

login con dos usuarios diferente y captcha..

Bueno la idea es compartir codigo, y como ven aca le traigo un login con dos usuario diferente, Uno logeo para usuario común, y el otro administrador.. mi idea es compartir codigo si mi codigo tiene algun error me encantaria que me dijeran asi acomodo dicho error... ami me funciona de lo mas bien.. (Solo tienes que copiar y pegar)

1-) Así esta en el wampserver(1-A)
2-)Formato de la pagina login.php









3-) Código html del formato login.php
Los jquery  que tienen que bajar son esto dos (jquery.validate.js, jquery.min.js) van en la carpeta js...  
(-mas abajo pongo el script como validar el formulario con jquery)..


<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="cache-control" content="no-cache">
<title>Formulario login</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<script type="text/javascript" src="js/jquery.login.js"> </script>
</head>

<body>
<div >
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']);?>" method="post" name="frm_login" id="frm_login">
  <div id="respond">
    <h1>Iniciar sesión.</h1>
    </br>
    <div>
      <label class="campo">Nombre de usuario:</label>
      <input name="txtusername" type="text" autofocus class="inputtext" id="txtusername" autocomplete="off" />
    </div>
    <div>
      <label class="campo">Contraseña:</label>
      <input name="txtpassword" type="password" class="inputtext" id="txtpassword" autocomplete="off" />
    </div>
    <div >
      <label class="campo">Por favor, introduzca el código de seguridad</label>
      <input name="tmptxt" type="text" class="inputcaptcha" id="tmptxt" maxlength="4" autocomplete="off" />
      <img src="includes/captcha.php" id="captcha"> <a href="#" onClick="document.getElementById('captcha').src='includes/captcha.php?'+Math.random(); return false"> <img src="images/reload.gif"  /></a>
      <input name="action" type="hidden" value="checkdata" />
    </div>
    <div>
      <input name="btnenviar" type="submit" id="btnenviar" value="Iniciar sesión" />
    </div>
    <br/>
    <?php
include("includes/form_in_login.php");
 if($error)
 {
 echo '<ul>';
 foreach($error as $alerta)
 {
 echo "<li class='avertencia'>$alerta</li>\n";
 }
echo '</ul>';}
         ?>
  </div>
</form>
</div>
</body>
</html>


4-)Validando el formulario con jquery con el script jquery.login.js

// JavaScript Document
$(document).ready(function() {
                $.validator.addMethod("regex",function(value,element,regexp){
                    var re= new RegExp(regexp)
                    return this.optional(element) || re.test(value);
                },"Ingrese el usuario tal cual se registro en nuestro sistema");
                $("#frm_login").validate({
                    rules:{
                        
                        txtusername:{
                            required:true, 
                            regex:"^[a-zA-Z0-9_]+$"
                            
                        },
txtpassword:{
required:true

}
                        
                        //inicicio de mensaje
                    },                    
                    messages:{
                                             
                        txtusername:{
                            required:"Ingrese su nombre de usuario"
                            
                        },
txtpassword:{
required:"Ingrese una contraseña"

}      
                       
                        
                        //fin del los mensaje  
                    }
                    
                    }    
                    
                   ) 
               
            });

5-)Ahora la clase form_in_login.php que va en la carpeta includes..

<?php
session_start();
$error = array();
if(array_key_exists('btnenviar',$_POST)){
if ($_POST['action'] == "checkdata") {
$username = "";
$password = "";
$tmptxt = "";
$sesion_login = true;
include("oConexion.php");
$conexion = conectar();
//Validar que los campos usuario y passwords no esten vacio.
$username = htmlentities(trim($_POST['txtusername']));
if($username == "")
{
$error['txtusername'] = "Ingrese un nombre de usuario";
}
$password = htmlentities(trim($_POST['txtpassword']));
if($password == "")
{
$error['txtpassword'] = "Ingrese un password";
}

//catchap
$tmptxt = trim($_POST['tmptxt']);
if($tmptxt== "")
{
$error['tmptxt']="Ingrese los dígitos de la imagen";
}else if ($_SESSION['tmptxt'] != $_POST['tmptxt']) {
$error['tmptxt'] = 'Ingrese los dígitos de la imagen';}
//si es distinto el error 
if (!$error){
//compruebo el usuario y pass para asegurarme..
if ($_POST['txtusername']) {
$query = mysql_query("SELECT usuario FROM usuarios WHERE usuario = '$username'") or die(mysql_error());
$data = mysql_fetch_array($query);
if($data['usuario'] != $username) {
$error['txtusername'] = "El usuario y/o la clave no son correcto.";
} else if ($_POST['txtpassword']){
$query = mysql_query("SELECT contrasena FROM usuarios WHERE contrasena = '$password'") or die(mysql_error());
$data = mysql_fetch_array($query);
if($data['contrasena'] != $password) {
$error['txtpassword'] = "El usuario y/o la clave no son correcto";
}else{
//y si todos se cumple bien hago la consulta
$query = mysql_query("SELECT usuario,contrasena,email,admin_priv FROM usuarios WHERE usuario ='".$username."' AND contrasena = '".$password."'");

$row = mysql_fetch_array($query);
$_SESSION["u_usuario"] = $row['admin_priv'];//para saber que tipo de usuario se logeo
$_SESSION["s_username"] = $row['usuario'];//saber el nombre del usuario
$_SESSION["s_email"] = $row['email'];//saber el email del usuario

//aca compruebo si es usuario oh administrador
if ($_SESSION["u_usuario"] =='u'){
header("location: site/index.php");//aca me voy para la carpeta usuario
}elseif($_SESSION["u_usuario"] =='a'){
header("location: admin/index.php");}//aca para la carpeta administrador

}//terminar la consulta
}

}//aca termina la comprobacion de usuarios y pass

}//fin de if de !error
}
}
$_POST = array();
?>


6-) Código que va en el index.php que se encuentra en la carpeta site, alli pegan este codigo

<?php session_start();
if($_SESSION["s_username"]!=""){ ?>
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="cache-control" content="no-cache">
<title>Welcome usuario</title>
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<div id="welcome">
  <?php //session_start();
         if ($_SESSION["u_usuario"] =='u') {?>
  <!--ACA VA TODOS EN CUERPO DE LA PAGINA-->
  
  <h1 class="usuario">
    <?php  echo("<p>Bienvenido ( " .$_SESSION['s_username']. " ) </p>");?>
  </h1>
  <br />
  <hr />
  <?php } else{
header('Location: ../login.php');
exit();}?>
</div>
</body>
</html>
<?php }else{
header('Location: ../login.php');
exit();}?>


7-) Código que va en el index.php que se encuentra en la carpeta admin, alli pegan este codigo

<?php session_start();
if($_SESSION["s_username"]!=""){ ?>
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta http-equiv="cache-control" content="no-cache">
<title>Welcome Admin</title>
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<div id="welcome">
  <?php //session_start();
         if ($_SESSION["u_usuario"] =='a') {?>
  <!--ACA VA TODOS EN CUERPO DE LA PAGINA-->
  
  <h1 class="usuario">
    <?php  echo("<p>Bienvenido ( " .$_SESSION['s_username']. " ) </p>");?>
  </h1>
  <br />
  <hr />
  <?php } else{
header('Location: ../login.php');
exit();}?>
</div>
</body>
</html>
<?php }else{
 header('Location: ../login.php');
 exit();}?>


8-)Hoja de estilo, este codigo se ve un poco largo porque estoy usando esta hoja para otra cosa... pero igual pego el código completo... 

@charset "utf-8";
/* Reset */
html, body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, abbr, address, cite, code, del, dfn, em, img, ins, kbd, q, samp, small, strong, sub, sup, var, b, i, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, figcaption, figure, footer, header, hgroup, menu, nav, section, summary, time, mark, audio, video {
font-family: "Segoe UI", "Lucida Grande", "Lucida Sans Unicode", tahoma, Arial, Verdana, sans-serif;
font-size: 100%;
letter-spacing: 0em;
vertical-align: middle;
margin: 0px;
padding: 0px;
border: 0px;
outline: 0px;
}
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
display: block;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after, q:before, q:after {
content: "";
content: none;
}
h1 {
font-size: 15px;
color: #666;
font-style: oblique;
}
form {
width: 50%;
margin: auto;
padding: 12px;
}
body, td, th {
color: #222;
}
td.label {
font-size: 13px;
padding-right: 3px;
width: 105px;
}
.label {
color: #1D2A5B;
text-align: right;
}
div label.campo {
width: auto;
margin: .4em 0;
display: block;
font-size: 13px;
}
div#respond {
border: 1px solid #CED5D7;
border-radius: 10px;
margin-top: auto;
padding: 25px;
border: 1px solid #CED5D7;
box-shadow: 0 0 0 3px #E5E5E5;
}
.inputtext, .inputpassword {
font-size: 14px;
padding: 6px;
border-radius: 4px;
border: 1px solid #CED5D7;
width: 250px;
}
.inputcaptcha {
font-size: 14px;
padding: 6px;
border-radius: 4px;
border: 1px solid #CED5D7;
width: 40px;
text-align: center;
}
textarea {
font-family: tahoma, verdana, arial, sans-serif;
font-size: 12px;
border-radius: 4px;
padding: 6px;
border: 1px solid #CED5D7;
resize: none; /* esta propiedad es para que el textarea no sea redimensionable */
width: 330px;
height: 120px;
}
input[type=submit] {
height: 30px;
overflow: hidden;
margin-top: 10px;
text-align: center;
}
.avertencia {
color: #FF0000;
font-family: "Segoe UI", Arial, Verdana, sans-serif;
font-size: 12px;
}
label.error {
background-color: #BC1010;
padding: 6px 12px;
border-radius: 4px;
color: white;
font-weight: bold;
margin-left: 16px;
position: absolute;
font-family: "Segoe UI", Arial, Verdana, sans-serif;
font-size: 10px;
}
.error:before { /* Este es un truco para crear una flechita */
content: '';
width: 0;
height: 0;
border-top: 8px solid transparent;
border-bottom: 8px solid transparent;
border-right: 8px solid #BC1010;
border-left: 8px solid transparent;
left: -16px;
position: absolute;
top: 5px;
pointer-events: none;
}
#welcome {
width: 50%;
margin: auto;
padding: 12px;
border: 1px solid #CED5D7;
border-radius: 10px;
margin-top: auto;
padding: 25px;
border: 1px solid #CED5D7;
box-shadow: 0 0 0 3px #E5E5E5;
}
.usuario {
font-size: 22px;
color: #000;
font-weight: bold;
text-align: center;
}

Hagan la estructura como le mostré en la primera imagen (1-A)

Esta imagen refres, va en la carpeta images

Esta imagen del fondo captcha va en la carpeta images

 ante de todos tienen que bajar el tipo de letra que yo use, si no le da error el captcha..  yo use tipo VeraBd.ttf  este tipo de letra va en la carpeta fonts

9-)-Ahora el famoso captcha...  crear una clase captcha.php esta clase va en la carpeta includes.

<?php
session_start();
$ancho=80;
$alto=30;
//imagen
$imagen = imagecreatefromgif("../images/bgcaptcha.gif");
//color de text
$colText = imagecolorallocate($imagen, 170,  160,  170); 
//regilla
$lineColor = imagecolorallocate($imagen, 175, 175, 175); 
imageline($imagen, 30, 5,  60, $alto,$lineColor);
imageline($imagen, 30, 5,  60, 55, $lineColor);
imageline($imagen, 40, 85,  70, 0, $lineColor);
imageline($imagen, 50, 55,  80, 55, $lineColor);
imageline($imagen, 20, 5,  60, 55, $lineColor);
imageline($imagen, 80, 35, 0, 0, $lineColor);
imageline($imagen, 20, 85,  80, 55, $lineColor);
imageline($imagen,25,0,25,$alto,$lineColor);
imageline($imagen,50,0,50,$alto,$lineColor);
imageline($imagen,75,0,75,$alto,$lineColor);
imageline($imagen,0,13,$ancho,13,$lineColor);
imageline($imagen,0,26,$ancho,26,$lineColor);
imageline($imagen,0,39,$ancho,39,$lineColor);


//Ruido
for ($i=0;$i<=700;$i++){
$randx=rand(0,100);
$randy=rand(0,55);
imagesetpixel($imagen,$randx,$randy,$lineColor);}

//TextoRandom 
$str = substr(str_replace("0","",str_replace("O","",rand(9999,99999))),0,4);
//TextFont
$font = "../fonts/VeraBd.ttf";

//session
$_SESSION['tmptxt'] = $str;
imagefttext($imagen, 14,rand(-5,0), 12, 20, $colText, $font,$str );  
//imagestring($imagen, 5, 16, 7, $_SESSION['tmptxt'], $colText);

//Salida
header("Content-type: image/gif");
imagegif($imagen);
imagedestroy($imagen);
?>


10-)conexion a la base de datos(asi se llama la clase oConexion.php).

<?php
function conectar()
{
$mysql_host = "localhost";
$mysql_user = "root";
$mysql_password = "";
$mysql_database = "ejemplousuarios2012";

if(!$conexion= mysql_connect($mysql_host,$mysql_user,$mysql_password))
{
die("No se puedo ejecutar la conexion ". mysql_error());
}
if(!mysql_select_db($mysql_database, $conexion))
{
die("No se pudo seleccionar la base de datos ". mysql_error());
}
return $conexion;
}
?>

11-)La tabla usuarios... asi fue creada la tabla..

CREATE TABLE IF NOT EXISTS `usuarios` (
  `co_digo` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `admin_priv` enum('u','a') NOT NULL,
  `usuario` varchar(30) NOT NULL,
  `contrasena` varchar(30) NOT NULL,
  `email` varchar(50) NOT NULL,
  `fecha_ingreso` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`co_digo`),
  UNIQUE KEY `o_usuario` (`usuario`) USING BTREE,
  UNIQUE KEY `o_email` (`email`) USING BTREE
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;