Novato en programación

SpAK

Hola, estoy liado con un proyecto de una tienda virtual, y tengo que hacer lo tipico, un registro en base de datos, un login, productos y tal.

Mi primer problema está en el formulario de registro... el profesor no quiere codigo php mezclado con html, y encima de que sé poco me lo complica más =S

He creado un fichero llamado config.php que es donde estará la conexión a la base de datos, y ahora tengo otro llamado registro.php que tengo todo esto.

<?php 
if($_POST) {
    $nombre = $_POST['nombre'];
    $usuario = $_POST['usuario'];
    $contrasena = $_POST['contrasena'];
    $email = $_POST['email'];
    if ($nombre == "" or $usuario == "" or $contrasena == "" or $email == "") { 
        $message = sprintf("Hay algún campo vacío");
    }
    else {
        include '../includes/config.php';
        $sql = sprintf("INSERT INTO usuarios VALUES (NULL,'$nombre','$usuario', md5('$contrasena'), '$email')");
        $res = mysql_query($sql);
        if (!$res) die('Invalid query: ' . mysql_error());
        $message = sprintf("Usuario registrado correctamente");
    }
} ?>
 
 
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<link rel="stylesheet" type="text/css" href="../estilos/estilo.css" />
 
</head>
<body>
<div id="registro">
    <?php if ($mensaje) { ?>
        <div class="error">
            <?php echo $mensaje ?>
        </div>
    <?php } ?>
    <form method="post" action="registro.php">
        <label>Nombre: </label><input type="text" name="nombre" value="<?php echo $nombre ?>"><br>
        <label>Nombre de usuario: </label><input type="text" name="usuario" value="<?php echo $usuario ?>"><br>
        <label>Contraseña </label><input type="password" name="contrasena"><br>
        <label>Email: </label><input type="text" name="email" value="<?php echo $email ?>"><br>
        <div class="submit">
            <input type="submit" value="Registrar">
        </div>
    </form>
</div>
 
</body>
</html>

pero este formulario de php, quiero ponerlo en el formulario de mi página ya echa... que es este

<form action="registro.php" method="post">
          <div class="ajuste_form">
            <p><span><b>Nombre:</b></span><input class="registro" type="text" name="nombre" value="" /></p>
             <p><span><b>Usuario:</b></span><input class="registro" type="text" name="usuario" value="" /></p>
             <p><span><b>Contraseña:</b></span><input class="registro" type="password" name="password" value="" /></p>
            <p><span><b>Email</b></span><input class="registro" type="text" name="email" value="" /></p>           
<p style="padding-top: 15px"><span>&nbsp;</span><input class="envio" type="submit" name="enviar" value="Registrar" /></p> </div>

como lo insertaría sin ensuciar el documento de html con codigo php?

1 comentario moderado
Merkury

#2 El boton de reportar esta peligrosamente cerca de la manita.

#1 Lo que tienes que hacer es en un archivo html poner el form , este es de contacto no de registro.

<form method="post" name="frmcontact" action="contacto.php">
	<fieldset>
		<label for="name">Nombre: <span style="color: red">*</span><br>
		<input name="name" type="text">
		<label for="email">Correo: <span style="color: red">*</span><br>
		<input name="email" type="text">
		<label for="dir">Dirección: </label>
		<label for="dir2">(Si desea que nos desplacemos a su domicilio) </label>	
		<input name="dir" type="text">
		<label for="message">Mensaje: <span style="color: red">*</span><br>
		<textarea name="message" rows="5"></textarea><br>
		<input type="button" class="btn btn-info" value="Enviar" onclick="Validar()"><br>
	<input type="text" name="checkRobots" style="visibility: hidden; height: 0px;" value="ok">
	</label></label></label></fieldset>
</form>

Si te fijas en el action llamo a contacto.php y en ese archivo tengo esto:

<?php

$checkSend = "ok";

if($_POST["checkRobots"] != $checkSend)
{
	header("Location: index.php");
}else
{
		//Importamos las variables del formulario
		$name = $_POST['name'];
		$email = $_POST['email'];
		$message = $_POST['message'];
		if(strlen($_POST['dir']) > 1)
		{
			$address = $_POST['dir'];
		}else
		{
			$address = 'no introducida';
		}
		//Preparamos el mensaje de contacto
		$cabeceras = "From: $email"."\r\n"."MIME-Version: 1.0" ."\r\n"."Content-type: text/plain; charset=UTF-8"."\r\n"; //La persona que envia el correo 
		$email_to = "[email protected]"; //cambiar por donde quieres que lleguen los emails 
		$asunto = "Has recibido un mensaje de $name";
		$contenido = "$name le ha enviado el siguiente mensaje:"."\n". "\n$message\n"."\n La dirección del remitente es: $address";
		//Enviamos el mensaje y comprobamos el resultado
		if (mail($email_to, $asunto ,$contenido ,$cabeceras )) {
		//Si el mensaje se envía muestra una confirmación
			header("Location: contact.php");
		}else{
		//Si el mensaje no se envía muestra el mensaje de error
		die("Error: Su mensaje no pudo ser enviado, intente más tarde");
		}
}
?>

1 respuesta
Merkury

Joder si editas on the fly se peta lo de code...

SpAK

#3 gracias por contestar coherentemente XDD, yo ahora mismo tengo esto en el codigo html

<form action="registro.php" method="post">
          <div class="ajuste_form">
            <p><span><b>Nombre:</b></span><input class="registro" type="text" name="nombre" value="<?php echo $nombre?>" /></p>
             <p><span><b>Usuario:</b></span><input class="registro" type="text" name="usuario" value="<?php echo $usuario?>" /></p>
             <p><span><b>Contraseña:</b></span><input class="registro" type="password" name="password" value="<?php echo $password?>" /></p>
            <p><span><b>Email</b></span><input class="registro" type="text" name="email" value="<?php echo $email?>" /></p>           
<p style="padding-top: 15px"><span>&nbsp;</span><input class="envio" type="submit" name="enviar" value="Registrar" /></p> </div>

Como puedes ver, también llamo a mi archivo php...

En el codigo php tengo lo siguiente

<?php if($_POST) {
    $nombre = $_POST['nombre'];
    $usuario = $_POST['usuario'];
    $password = $_POST['password'];
    $email = $_POST['email'];
    if ($nombre == "" or $usuario == "" or $password == "" or $email == "") { 
        $mensaje = sprintf("Hay algún campo vacío");
    }
    else {
        include 'includes/config.php';
        $sql = sprintf("INSERT INTO usuarios VALUES (NULL,'$nombre','$usuario', md5('$password'), '$email')");
        $res = mysql_query($sql);
        if (!$res) die('Invalid query: ' . mysql_error());
        $mensaje = sprintf("Usuario registrado correctamente");
    }
} 
?>

No sé si estará bien, lo que sé es que cuando inicio la página en los campos a rellenar del formulario de html, el codigo que puse de php entre los values me lo muestra todo... osea

value="<?php echo $nombre?>" />

Esto se hace realmente así? o hago algo mal?

Merkury

Espera que te busco un form y un script de registro que tengo por ahi.

¿Estás usando mySQL?

#7 Lo que no entiendo es porque en el HTML del form pasas valores de PHP, realmente el formulario han de rellenarlo sin más y tu enviarlo al servidor.

Y luego hacer algo así para insertar el usuario en la BBDD

 
$SERVER = 'localhost';
$USER = 'root';
$PASS = '';
mysql_connect($SERVER, $USER, $PASS) or die ('Error en la conexión a la base de datos');
mysql_select_db($BD) or die ('Error la base de datos no existe');

$getData = mysql_query("INSERT INTO users(username , password, email, nombre, apellidos, privilegios ) VALUES ('".$_POST["user"]."', '".$md5pass."', '".$_POST["mail"]."', '".$_POST["name"]."', '".$_POST["surname"]."', '".$standarPriv."')");
if($getData == true)
{
	if(isset($_COOKIE["ADMIN"]))
	{
		header("Location: manage.php");
	}
	else
	{					
                setcookie(ID,$_POST['user'],time()+"2592000");
		header("Location: index.php");	
	}
	}else
	{
		echo("Fallo en la introducción");
								
}
}else
{
	echo ("<br />");
	echo("Fallo desconocido");
}
}	

En este caso me conecto a la BBDD, hago la consulta asignandola en una variable porque mysql_query devuelve true o false, compruebo si se ha hecho, si se ha hecho genero la cookie y lo redirecciono al index.

Claro #7, cuenta una cosa HTML es la parte del usuario donde el debe meter la información y tu con el form la recoges y la envías al server para tratarla.

1 respuesta
SpAK

#6 si :), aunque también estoy trasteando con el navicat.

PD: #7 entonces con solo poner el action la direccion del documento php me bastaría?

1 respuesta
SpAK

#7 pero yo aparte del documento html donde tengo el form y php donde recojo la información, tengo otro documento donde tengo la conexion al servidor, osea este

<?php
	$dbhost = 'localhost';
	$dbuser = 'root';
	$dbpass = '';
	$dbname = 'tienda';
	$conn = mysql_connect($dbhost,$dbuser,$dbpass)
   		or die('Error connecting to mysql');
	mysql_select_db($dbname);

Solucionado ! ya me hace los registros, uff XDD aúnque esto es solo el principio, me queda que pelearme con MUUUCHAS más cosas :S, gracias por la ayuda ^^

1 respuesta
Merkury

#8 Si yo tambien, pero te lo extraje por si acaso jaja yo de hecho te voy a regalar una cosa que es una tontería, pero bueno en el archivo de la conexion directamente una función que se abre desde cualquier sitio donde incluyas el archivo con connect("1" ) y se cierra con connect("0" );

function connect($check)
{

  $SERVER = 'localhost';
  $USER = 'root';
  $PASS = '';
  $BD = 'testdb';
  if($check === "1")
  {
    mysql_connect($SERVER, $USER, $PASS) or die ('Error en la conexión a la base de datos');
      mysql_select_db($BD) or die ('Error la base de datos no existe');

  }
  elseif ($check === "0") {
    mysql_close();
  }

}
Wasd

#2 Por curiosidad, que le ves de malo a HTML?

1 respuesta
C

#10 Es como si le preguntas a alguien que no le gusta la coliflor qué ve de malo en la coliflor. Te dirá que no le gusta. Pues a mí me pasa algo igual con el HTML. Su sintaxis me echa "patrás". Es como el que tiene fobia a las arañas, igual. Inexplicable pero real.

1 respuesta
SpAK

bueno otra vez estoy por aqui, la verdad es que llevo un par de dias dandole vueltas al asunto, y no consigo hacerlo, ahora estoy intentando que me compruebe el registro que he hecho sin dejarme ningún campo en blanco, y si lo hago me aparezca un mensaje diciendo que rellene los campos y tal, pero nada, no me funciona, y encima puedo registrarme con el mismo email y nick y me lo coje igualmente XDD, que desastre !!

Os explico, este es mi formulario que tengo en html

<div id="registro">
        <?php if ($mensaje) { ?>
            <div class="error">
                <?php echo $mensaje ?>
            </div>
        <?php } ?>
           <form method="post" action="php/registro.php">
                <label>Nombre:</label><input type="text" name="nombre"><br>
                <label>Nombre de usuario:</label><input type="text" name="usuario"><br>
                <label>Contraseña:</label><input type="password" name="clave"><br>
                <label>Email:</label><input type="text" name="email"><br>
            <div class="submit">
                <input type="submit" value="Registrar">
            </div>
    	   </form>
	  	</div>

cuando llena los formulario se supone que me lo tiene que comprobar en otro archivo en php llamado registro que tiene lo siguiente...

<?php if($_POST) {
    $nombre = $_POST['nombre'];
    $usuario = $_POST['usuario'];
    $clave = $_POST['clave'];
    $email = $_POST['email'];
    if ($nombre == "" or $usuario == "" or $clave == "" or $email == "") { 
        $mensaje = sprintf("Debe rellenar todos los campos");
    }
    else {
        include 'includes/config.php';
        $sql = sprintf("INSERT INTO usuarios VALUES (NULL,'$nombre','$usuario', md5('$clave'), '$email')");
        $res = mysql_query($sql);
        if (!$res) die('Invalid query: ' . mysql_error());
        $mensaje = sprintf("Usuario registrado correctamente");
    }
} 
?>

los más experto haber si me decís donde está el problema por que me estoy volviendo loco con tanto codigo XDD, por otra parte, me están diciendo que porqué pongo el post en un archivo php, que no es necesario, pero he probado a quitarlo y no me funciona :S

1 respuesta
Li3cht

#12 Por qué no usas Javascript para comprobar que los campos están vacíos? Te ahorras comprobaciones en otras páginas y te puedes asegurar de no mandar el action del form si tienes algo vacío.

En el Formulario llamas a la función, en mi caso validate():

<form name="form1" onsubmit="return validate()">

Y la función hace lo siguiente:

<script language="javascript">
	function validate(){
		var f=document.form1;
		if(f.name.value==''){
			alert('Debe introducir su nombre por favor');
			f.name.focus();
			return false;
		}
		if(f.email.value==''){
			alert('Debe introducir un correo electrónico por favor');
			f.email.focus();
			return false;
		}
		if(f.phone.value==''){
			alert('Debe introducir un teléfono de contacto por favor');
			f.phone.focus();
			return false;
		}
		f.submit();
	}
</script>

name, email y phone son los nombres de los diferentes campos del formulario. Si están vacíos la función devuelve falso y no realiza el submit, en caso de que todo esté rellanado lo hace. El focus() es simplemente para que te indique donde necesitas rellenar algo (te colorea el borde del input).

1 respuesta
SpAK

#13 Hombre sería una opción, pero me llevo mejor con el php... en realidad yo queria conseguir esto ya que esteticamente es mucho mejor, pero no sé en lo que fallo, la verdad es que no me gusta mucho eso de que me aparezcan ventanas emergentes, pero si no logro hacerlo funcionar no me quedará otra :(

eXtreM3

#11 cómo leches desarrollas una web sin html? xD

1 respuesta
C

#15 es qno hago webs xD. Pero me gustaría saber hacerlas.

alterego

también puedes ponerle el atributo required a los inputs

<input type=text name=nombre required>

que error te da?

1 respuesta
SpAK

#17 no me sale ninguna clase de error, solo una página en blanco, yo quiero que cuando deje un campo vacío haga como el link que he dejado en #14

1 respuesta
catalon

#18 Si la combinacion de email+nick tiene que ser unica entonces lo mejor es que en la base de datos esos dos campos sean las claves primarias, de ese modo te devolvera un error al hacer insert con claves duplicadas que luego puedes tratar en el php con mysql_error()

En cuanto a lo de mostrar el mensaje de error en el formulario como en el link que has puesto no hay problema, hay varias formas de hacerlo pero te voy a poner el ejemplo sencillo ya que aun estas aprendiendo y sobretodo teniendo en cuenta que no puedes poner la parte logica en php junto al html.

<div id="registro">
        <?php if ($_GET['mostrar_error']) { ?>
            <div class="error">
                <?php 
if ($_GET['mostrar_error']==1)  echo "Debe rellenar todos los campos";
elseif ($_GET['mostrar_error']==1)  echo "El texto de error que quieras (no te recomiendo mostrar nunca el error tal cual de mysql_error() ya que puede contener pistas de tu estructura de DB que podria convertirse en un fallo de seguridad importante)";
?>
            </div>
        <?php } ?>
           <form method="post" action="php/registro.php">
                <label>Nombre:</label><input type="text" name="nombre"><br>
                <label>Nombre de usuario:</label><input type="text" name="usuario"><br>
                <label>Contraseña:</label><input type="password" name="clave"><br>
                <label>Email:</label><input type="text" name="email"><br>
            <div class="submit">
                <input type="submit" value="Registrar">
            </div>
           </form>
                </div>

y el php

<?php if($_POST) {
    $nombre = $_POST['nombre'];
    $usuario = $_POST['usuario'];
    $clave = $_POST['clave'];
    $email = $_POST['email'];
    if ($nombre == "" or $usuario == "" or $clave == "" or $email == "") { 
        header("Location: formulario.php?mostrar_error=1"); //************* ATENCION CAMBIA formulario.php POR LA URL DE TU FORMULARIO
    }
    else {
        include 'includes/config.php';
        $sql = sprintf("INSERT INTO usuarios VALUES (NULL,'$nombre','$usuario', md5('$clave'), '$email')");
        $res = mysql_query($sql);
        if (!$res) header("Location: formulario.php?mostrar_error=2");  //************* ATENCION CAMBIA formulario.php POR LA URL DE TU FORMULARIO
        $mensaje = sprintf("Usuario registrado correctamente");
    }
} 
?>

Lo he hecho en plan rápido así que si da problemas dimelo y intentaremos arreglarlo ;).

1 respuesta
kroSio

#19 pues lo he probado y no funciona :S, lo único que ha conseguido es ponerme las letras del formulario de color rojo... xDDD

la página html donde tengo el formulario se llama registro.html y tengo esto

      	<div id="registro">
				<?php if ($_GET['mostrar_error']) { ?>
            <div class="error">
                <?php 
                    if ($_GET['mostrar_error']==1)  echo "Debe rellenar todos los campos";
                    else
                    if ($_GET['mostrar_error']==1)  echo "Imposible conectar con el servidor";
                    ?>
       			 <?php } ?>
           <form method="post" action="php/registro.php">
                <label>Nombre:</label><input type="text" name="nombre"><br>
                <label>Nombre de usuario:</label><input type="text" name="usuario"><br>
                <label>Contraseña:</label><input type="password" name="clave"><br>
                <label>Email:</label><input type="text" name="email"><br>
            <div class="submit">
                <input type="submit" value="Registrar">
            </div>
    	   </form>
	  	</div>

y mi pagina llamada registro.php tengo esto

<?php if($_POST) {
    $nombre = $_POST['nombre'];
    $usuario = $_POST['usuario'];
    $clave = $_POST['clave'];
    $email = $_POST['email'];
    if ($nombre == "" or $usuario == "" or $clave == "" or $email == "") { 
        header("Location: registro.html?mostrar_error=1"); 
    }
    else {
        include 'includes/config.php';
        $sql = sprintf("INSERT INTO usuarios VALUES (NULL,'$nombre','$usuario', md5('$clave'), '$email')");
        $res = mysql_query($sql);
        if (!$res) header("Location: registro.html?mostrar_error=2");  
$mensaje = sprintf("Usuario registrado correctamente"); } } ?>
Merkury

Tienes que igualar el $_GET["mostrar_error"] a lo que sea, ya que lo envías por GET en la respuesta.

1 respuesta
kroSio

#21 ok, es que sé muy poco y no me entero, lo cambié a metodo post, ya que estoy usandolo todo así, y no quiero liarme, aún así no me funciona, me sale las letras del formulario en rojas como antes :S

está bien la dirección esta ?

header("Location: registro.html?mostrar_error=1"); 

o deberia poner solo el

("location: registro.html"); 

?

1 respuesta
Merkury

#22 No, estaba bien en $_GET porque tu desde el script php envias un valor via get.

Todo esto viene de que este código:

if ($_GET['mostrar_error']==1)  echo "Debe rellenar todos los campos";

Se relaciona con esta parte del codigo PHP.

  if ($nombre == "" or $usuario == "" or $clave == "" or $email == "") { 
        header("Location: registro.html?mostrar_error=1"); 
    }

Le dices que si no hay nombre O usuario O clave que envié el error 1

Luego tambien tienes esto otro en el script PHP

  if (!$res) header("Location: registro.html?mostrar_error=2"); 

que básicamente dice que si la conexión a la BBDD no se efectua devuelva el error dos, entonces en el codigo php que tienes mezclado con HTML has de poner

[code]<?php if ($_GET['mostrar_error'] == 2) { ?>

[/code]

1 respuesta
Vain92

Aprovecho este hilo para preguntar yo también, que me estoy comiendo la olla por esto...

A ver, soy TOTALMENTE NUEVO en programación C, y como primer proyecto me he propuesto hacer un .exe que, tras poner tu nombre y tus dos apellidos, te dijera tu nombre entero, pero al compilarlo y executarlo, cuando pongo todo lo necesario, en vez de ponerme eso, mi nombre, mi apellido y mi segundo apellido, me da error, ¿Alguna idea?

Dejo el código:

/*Programa de prueba para ver si he asimilado lo esencial*/
           #include <stdio.h>
           main()            
     
{ char nombre,primer_apellido,segundo_apellido; printf ("\nDime tu nombre: "); scanf ("%s",&nombre); printf ("\nDime tu primer apellido: "); scanf ("%s",&primer_apellido); printf ("\nDime tu segundo apellido: "); scanf ("%s",&segundo_apellido); printf ("\nTu nombre completo es: %s %s %s",nombre,primer_apellido,segundo_apellido); }

Gracias.

1 respuesta
Merkury

#24 Tienes que definir como string.

Porque si no solo te guardará la primera letra, ademas no me acuerdo exactamente si C permitia hacer la definición así como la tienes, yo creo que si, pero no me apostaría la mano XD

Aparte te peta porque haces

scanf("%s", &nombre);

Que me estaba liando no importes el string y quita el &

2 respuestas
Vain92

#25 ¿Y eso como se hace? ¿Podrías explicármelo un poco mejor plis? Como ya he dicho soy nuevo en programación.

Edit: Vale, lo he definido como string, quedándome así:

/*Programa de prueba para ver si he asimilado lo esencial*/
           #include <stdio.h>
           #include <string>
           main()            
     
{ char nombre,primer_apellido,segundo_apellido; printf ("\nDime tu nombre: "); scanf ("%s",&nombre); printf ("\nDime tu primer apellido: "); scanf ("%s",&primer_apellido); printf ("\nDime tu segundo apellido: "); scanf ("%s",&segundo_apellido); printf ("\nTu nombre completo es:"); printf ("%s %s %s",nombre,primer_apellido,segundo_apellido); }

Y sigue dándome error... :S

Edit 2: Veo que dices que tengo otro error. ¿Qué es exactamente lo que está mal? Se supone que para más de un carácter he de utilizar %s, ¿no?

kraneok

#28 Pero es que en C no existe String, xDDD.
El "string" de C es una array de chars XDD

Edit: he visto que usas el string.h ok xDD, de todos modos creo que solo contiene método para usar String.

Ahora lo que deberías hacer es


string nombreVariable;

3 respuestas
Vain92

#25

/*Programa de prueba para ver si he asimilado lo esencial*/
           #include <stdio.h>
           main()            
     
{ char nombre,primer_apellido,segundo_apellido; printf ("\nDime tu nombre: "); scanf ("%s",nombre); printf ("\nDime tu primer apellido: "); scanf ("%s",primer_apellido); printf ("\nDime tu segundo apellido: "); scanf ("%s",segundo_apellido); printf ("\nTu nombre completo es:"); printf ("%s %s %s",nombre,primer_apellido,segundo_apellido); }

Así está ahora, y sigue igual. :S

#27 :wtf: :wtf:

#29 Nada, abrir se abre normal, es al poner el nombre y los apellidos cuando crashea, y al pasar el depurador nasti de plasti.

2 respuestas
Merkury

#27 Ya ya que se me han mezclado los lenguajes XD, fijate que he editado y corregido.

#28 Que te dice el debugger

#30 En POST

2 respuestas
kroSio

#23 debo ser un inutil, porque sigue igual :S el method del form no tengo que ponerlo en get no? ya que tengo en el php puesta las variables que coja del html en post... pero es que no sé por donde meterle mano ya :(

PD: #30 no lo toqué, era una pregunta XDD, pero nada, que no funciona, seguro que está todo el codigo bien? debería funcionar así?

2 respuestas