Categorías
Programacion PHP

Agregar recaptcha a formulario en php

Muchas veces nos ha sucedido que tenemos un formulario de contacto en nuestro sitio pero de repente comienzan a llegarnos un monton de correos de spam, y todo por que no tenemos un método para minimizar que los bots spams envíen formularios de forma automatizada,si bien hay formas de como saltarse estos captchas, pero por lo menos disminuiremos la cantidad de correos de spam en nuestros buzones.

Explicare con un pequeño ejemplo como agregar el recaptcha al formulario y una vez validado lso datos envie un mensaje de felicitacion,que seria en lugar de enviar el correo electrónico, o un mensaje de error si algún dato no esta bien o no se resolvió correctamente el captcha.

 

Prerequisitios.

  • una cuenta en google para poder hacer uso del recaptcha
  • un servidor de pruebas(como wampp)
  • libreria recaptcha(https://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest)

Lo primero sera crear nuestro formulario de contacto,y luego lo validamos con otro script

 

El codigo del formulario es el siguiente recpatcha.php:

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>Prueba Recatpcha</title>

<style type=”text/css”>
<!–
.formulario {
padding: 2px;
width: 400px;
margin-top: 5px;
margin-right: auto;
margin-bottom: 5px;
margin-left: auto;
}
#form1 label {
display: block;
}
–>
</style>
</head>

<body>
<form action=”validar.php” method=”post” name=”form1″ class=”formulario” id=”form1″>
<label>Nombre:</label><input name=”nombre” type=”text” />
<label>Edad:</label><input name=”edad” type=”text” />
<label>Asunto:</label><textarea name=”asunto” cols=”40″ rows=”5″></textarea>
<br />
    <!–Codigo mostrar repacatcha –>
       <?php
          require_once(‘rutalibreria/recaptchalib.php’);
          $publickey = “tupublickey”; // you got this from the signup page
          echo recaptcha_get_html($publickey);
        ?>
<input name=”enviar” type=”submit” value=”Enviar” />
</form>
</body>
</html>

El codigo es el de un formulario normal salvo donde esta el comentario en html  del codigo solo debes cambiar dos cosas, en la funcion requiere_once debes colocar la ruta donde descomprimiste la libreria de recaptcha, de preferencia en una carpeta llamada lib para mejor orden, y la clave publica la cual obtienes cuando te logueas con tu cuenta de google en este sitio

https://www.google.com/recaptcha

1

 

copiar las dos claves publica y privada

 

2

luego creamos otro archivo,llamado validar.php con el que comprobaremos  los datos introducidos antes de enviarlos

 

<?php
  require_once(‘rutalibreria/recaptchalib.php’);
  $privatekey = “tuclave”;
  $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER[“REMOTE_ADDR”],
                                $_POST[“recaptcha_challenge_field”],
                                $_POST[“recaptcha_response_field”]);
if(empty($_POST[‘nombre’])){
echo ‘No ha ingresados tu nombre’;
echo ‘<br />’;
}
if(empty($_POST[‘nombre’])){
echo ‘No ha ingresados u nombre’;
echo ‘<br />’;
}
if(empty($_POST[‘asunto’])){
echo ‘No ha ingresados el asunto’;
echo ‘<br />’;
}
 //comprobando solucion de captcha      
  if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly
    die (“The reCAPTCHA wasn’t entered correctly. Go back and try it again.” .
         “(reCAPTCHA said: ” . $resp->error . “)”);
  } else {
    // Your code here to handle a successful verification
    echo “Good job,you solve the captcha”;
  }

?>

en negrita marque la parte mas importante del codigo,lo demas es una validacion normal de los otros campos del formulario, observa que en el archivo validar es donde pegamos la clave privada ya que son valores que no estaran accesible a los usuarios y en la parte de presentacion(recaptcha.php) dejamos la clave publica, al final nuestro formulario debera verse asi

formulario recpatcha

y debera mostrar este texto,sino escribes correctamente el recpatcha

The reCAPTCHA wasn’t entered correctly. Go back and try it again.(reCAPTCHA said: incorrect-captcha-sol)

cabe aclarar que solo presento la idea general del concepto de como agregar un caprcha a un formulario, pero te puede servir de base si quieres mejorarlo.

 

Si tienen comentarios o sugerencias para este articulo pueden hacerlas aqui.

Categorías
Programacion PHP

Como paginar un Array con PHP y Jquery

Asi como hace un tiempo atras, hemos puesto una forma de hacer paginación sin usar base de datos, en esta oportunidad y gracias a que un usuario en nuestra fanpage de facebook nos pregunto como poder paginar un array (vector), me he puesto manos a la obra. Al menos sin importar que si no es lo que busca el usuario, igual a mas de uno seguro le servirá

Como en el tutorial anterior, tambien en esta ocasion estaremos usando jquery, por lo tanto el codigo completo del tutorial lo tienen a disposición.

[highlight]
<?php 
$vector = array(
=> array(
'contenido' => 'Este es el contenido del div 1',
),
=> array(
'contenido' => 'Este es el contenido del div 2',
),
=> array(
'contenido' => 'Este es el contenido del div 3',
),
=> array(
'contenido' => 'Este es el contenido del div 4',
),
);
//ordenamos el vector 
ksort($vector);
echo '
<html>
<head>
<title>Paginacion de un Vector</title>
</head>
<body>';
$i 1;
foreach($vector as $idx => $valor)
{
echo '
<div id="page_'$idx ,'"', ($i 1) ? ' style="display:none;"' '' ,'>
'$valor['contenido'] ,'
</div>';

//aumentamos nuestra bandera
$i  ;
}
$cantidadVector count($vector);

//paginacion
echo '
<p>';
for($ii 1$ii <= $cantidadVector$ii  )
{
echo '
<a href="javascript:void(0);" class=".paginacion" paginacion="'$ii ,'">'$ii ,'</a>', ($ii '&nbsp;' '') ,'';
}
echo '
</p>';

echo '
<!-- jquery -->
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function() { 
$("a").on("click",function(){
var paginacion = $(this).attr("paginacion");
var div = "#page_"   paginacion;
$("div[id!=" div "]").hide();
$(div).fadeIn("slow");
});
});
</script>
</body>
</html>';

?>
[/highlight]

Haciendo un repaso de cada parte, vemos que despues del tag body se encuentra la asignacion y creacion de variable$i = 1;” este nos servirá simplemente como bandera para decirle al codigo que solo el primer registro quede visible y el resto oculte de forma automática.

Antes de continuar vamos a presentar el ejemplo de array (vector)

[highlight]
$vector = array(
1 => array(
'contenido' => 'Este es el contenido del div 1',
),
2 => array(
'contenido' => 'Este es el contenido del div 2',
),
3 => array(
'contenido' => 'Este es el contenido del div 3',
),
4 => array(
'contenido' => 'Este es el contenido del div 4',
),
);
[/highlight]

Luego nos aseguramos que dicho vector quede ordenado de acuerdo a su indice, para eso hacemos “ksort($vector);“.

Luego de ordenar nos encargamos de hacer visible el vector con su respectivo codigo html asi como nuestro tutorial de “paginacion sin base de datos” que enlazamos al comienzo, haciendo de la siguiente manera

[highlight]
foreach($vector as $idx => $valor)
{
echo '
<div id="page_', $idx ,'"', ($i > 1) ? ' style="display:none;"' : '' ,'>
', $valor['contenido'] ,'
</div>';

//aumentamos nuestra bandera
$i  ;
}
[/highlight]

Justamente en esta parte es donde vemos como hacemos uso de nuestra bandera para saber si en que momento imprimimos el primer registro del vector sin importar o tener en cuenta su nro de indice.

Una ves que tenemos todo impreso el vector, nos preocupamos por saber la cantidad de registros que tiene nuestro vector, para eso hacemos esto “$cantidadVector = count($vector);“, cabe aclarar que si hay otra mejor manera de hacerlo, será bienvenido la ayuda, asi aprendemos todos :)

Cuando ya por fin tenemos la cantidad de registros dentro de nuestro vector, nos preocupamos en armar la paginacion para eso usaremos este simple codigo php

[highlight]
//paginacion
echo '
<p>';
for($ii = 1; $ii <= $cantidadVector; $ii  )
{
echo '
<a href="javascript:void(0);" class=".paginacion" paginacion="', $ii ,'">', $ii ,'</a>', ($ii > 1 ? '&nbsp;' : '') ,'';
}
echo '
</p>';
[/highlight]

Haciendo todo esto nos queda justamente como queremos, un “vector paginado“.

Esperamos que les sea de provecho, cualquier consulta, a las ordenes

Categorías
Programacion PHP

Paginacion sin usar Base de datos (crear paginacion en paginas estaticas)

Desde uno de los foros que visito concurrentemente en este caso ForoBeta, salto una duda, de como realizar en php la paginacion de contenido cargado a mano, en pocas palabras, es un contenido que uno escribe sin necesidad de hacer consultas a la base de datos.

En nuestro caso usaremos Jquery para ser mas facil y rapido, solo debemos crear un html de esta forma:

[highlight]
<html>
<head>
    <title>Paginacion sin BD</title>
</head>
<body>
    
    <div id="page_1">
        Contenido del div 1
    </div>    
    <div id="page_2" style="display:none">
        Contenido del div 2
    </div>    
    <div id="page_3" style="display:none">
        Contenido del div 3
    </div>    
    <div id="page_4" style="display:none">
        Contenido del div 4
    </div>
    <p>
        <a href="javascript:void(0);" paginacion="1">1</a>&nbsp;<a href="javascript:void(0);" paginacion="2">2</a>
        &nbsp;<a href="javascript:void(0);" paginacion="3">3</a>&nbsp;<a href="javascript:void(0);" paginacion="4">4</a>
    </p>
    <!-- jquery -->
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function() { 
            $('a').on("click",function(){
                var paginacion = $(this).attr('paginacion');
                var div = "#page_"   paginacion;
                $("div[id!=" div "]").hide();
                $(div).fadeIn("slow");
            });
        });
    </script>
</body>
</html>
[/highlight]

Segun mi ejemplo debemos crear tantos divs como “paginacion” quieres tener.. por ejemplo si queres que tenga 4 paginas entonces debes crear 4 div’s con la caracteristica siguiente:

[highlight]
<div id="page_1">        
Contenido del div 1
</div>  
[/highlight]

Una ves que tienes la cantidad de divs que quieres debes crear la misma cantidad pero links..

[highlight]<a href="javascript:void(0);" paginacion="1">1</a>[/highlight]

Donde el atributo "paginacion" es el que ayudará a saber cual div mostraremos y cuales ocultaremos. 

Un ejemplo de como queda esta aqui Paginacion sin BD
Categorías
Programacion PHP

Guardar una imagen en la Base de Datos (mysql)

[ads1]A continuacion mostraremos una sencilla forma de como realizar la subida de imagenes a nuestra base de datos y no a nuestro servidor.
guardar bd imagen1 - Guardar una imagen en la Base de Datos (mysql)

Inicialmente creamos nuestra bd y lo llamamos “bd_laboratorio“, luego creamos la tabla usando este sql

[highlight]
CREATE TABLE IF NOT EXISTS `subir_imagen` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nombre_imagen` text NOT NULL,
  `imagen` mediumblob NOT NULL,
  `tipo` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
[/highlight]

Archivo index.php

[highlight]
<?php
//conexion a la base de datos
$link mysql_connect('localhost''root''');
if (!$link)
   die('Error al conectarse con MySQL: ' mysql_error().' <br>Número del error: '.mysql_errno());
if (! @mysql_select_db("bd_laboratorio",$link)){
   echo "No se pudo conectar correctamente con la Base de datos";
   exit();
}
//le dimos click al boton grabar?
if (isset($_POST['guardar']))
{
$nombre $_FILES['imagen']['name'];
$imagen_temporal $_FILES['imagen']['tmp_name'];
$type $_FILES['imagen']['type'];
//archivo temporal en binario
$itmp fopen($imagen_temporal'r+b');
$imagen fread($itmpfilesize($imagen_temporal));
fclose($itmp);
//escapando los caracteres
$imagen mysql_real_escape_string($imagen);$respuesta mysql_query("insert into subir_imagen (id, nombre_imagen, imagen, tipo) 
values(0, '$nombre', '$imagen', '$type')"$link);
//redireccionamos
header("Location: index.php?".($respuesta 'ok' 'error'));
}
//guardado OK
if (isset($_GET['ok']))
{
echo '<p>Guardado Exitosamente</p>';}
//si no se guardo de manera correcta?
if (isset($_GET['error']))
{
echo '<p>Ocurrio un error a la hora de realizar la insercion...</p>';}

//formulario que nos permite subir a la BD el archivo
echo '
<form action="index.php" enctype="multipart/form-data" method="post">
<input type="file" name="imagen" id="imagen" />
<input type="submit" value="Guardar" name="guardar" />
</form>';
$sql mysql_query("select id, nombre_imagen, imagen from subir_imagen"$link);
$imagenes = array();
while($row mysql_fetch_assoc($sql))
{
$imagenes[$row['id']] = array(
'id' => (int) $row['id'],
'nombre' => $row['nombre_imagen'],
'imagen' => $row['imagen'],
);
}
//existen imagenes para mostrar?
if (!empty($imagenes))
{
echo '<span style="text-decoration:underline;">Imagenes guardadas en la BD:</span>';
foreach($imagenes as $valor)
echo '<p>'$valor['id'] ,' - ' $valor['nombre'] ,' - <a href="ver.php?i='$valor['id'] ,'">Ver Imagen</a></p>';
}
?>
[/highlight]

Dicho archivo nos permitira hacer la busqueda y posterior subida a nuestra base de datos, y finalmente poder visualizar el mismo en un listado.

El archivo ver.php nos permitirá visualizar la imagen subida a la Base de Datos.

[highlight]
<?php
//conexion a la base de datos
$link mysql_connect('localhost''root''');
if (!$link)
   die('Error al conectarse con MySQL: ' mysql_error().' <br>Número del error: '.mysql_errno());
if (! @mysql_select_db("bd_laboratorio",$link)){
   echo "No se pudo conectar correctamente con la Base de datos";
   exit();
}
//si enviamos por parametro la id
$id = (int) $_GET['i'];
//no hay id
if (empty($id))
//redireccionamos
header("Location: index.php");$sql mysql_query("select id, imagen, tipo from subir_imagen where id = $id"$link);
$imagenes = array();
while($row mysql_fetch_assoc($sql))
$imagenes[$row['id']] = array(
'id' => $row['id'],
'imagen' => $row['imagen'],
'tipo' => $row['tipo'],
);
//existen imagenes para mostrar?
if (!empty($imagenes))
{
header("Content-Type: ".$imagenes[$id]['tipo']);
echo $imagenes[$id]['imagen'];
}
?>
[/highlight]

Esta seria una forma de subir imagenes a nuestra base de datos, cabe mencionar que necesitarian de buen espacio de almacenamiento en su BD asi se evitan futuros problemas por espacio en el mismo  :)

Quedandonos la visualizacion final de la siguiente forma

guardar bd imagen2 - Guardar una imagen en la Base de Datos (mysql)