Foros del Web » Programando para Internet » PHP »

Principiante, algunas dudas básicas

Estas en el tema de Principiante, algunas dudas básicas en el foro de PHP en Foros del Web. Hola, muchas veces intenté meterme con php pero todas abandoné. Ahora estoy obligado, así que esta vez no lo haré :) Ok, tengo algunas preguntas ...
  #1 (permalink)  
Antiguo 09/05/2006, 11:57
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Principiante, algunas dudas básicas

Hola, muchas veces intenté meterme con php pero todas abandoné.
Ahora estoy obligado, así que esta vez no lo haré :)

Ok, tengo algunas preguntas que son muy básicas:

- Veo que los strings pueden ir indistíntamente entre comillas dobles y apostrofes. ¿qué conviene? ¿"cadena" o 'cadena'?
- Operadores lógicos: ¿&& y || o and y or?
- Declaración de variables: en un PC me deja usar variables que no fueron inicializadas previamente pero en otro no (me da un error) ¿debo siempre declararlas o es preferible modificar alguna configuración para no tener que hacerlo?

Formularios...
- ¿puedo preguntar si isset($_POST/$_GET) sin tener que referirme a un parámetro en particular como en el ejemplo if(isset($_POST['submit'])){...}?
- ¿Puedo recurrir a $_POST['text'] sin pasar antes por el paso anterior (el isset)? y de ser así, ¿es recomendable?

Tenía otras dudas, pero ahora no me las acuerdo.
Gracias
__________________
...___...
  #2 (permalink)  
Antiguo 09/05/2006, 12:04
Avatar de carlosfocus  
Fecha de Ingreso: enero-2006
Ubicación: Venezuela
Mensajes: 823
Antigüedad: 18 años, 3 meses
Puntos: 0
Saludos te recomiendo visites los Faqs
__________________
Carlos Herrera
Web Developer
www.carlos.com.ve
Para descargar archivos propios a su Teléfono Mobil? www.carlosfocus.com
  #3 (permalink)  
Antiguo 09/05/2006, 12:08
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 1 mes
Puntos: 33
De acuerdo

- Para el primer punto te pido de favor que cheques este link http://www.php.net/types.string
- Para el segundo punto http://www.zend.com/manual/language....rs.logical.php
- ¿Que uso le quieres dar a esas variables?

-isset($_POST/$_GET) de esta forma unicamente se verifica si se envio información sin preguntar, en algun elemento en especial. Con respecto a "¿Puedo recurrir a $_POST['text'] sin pasar antes por el paso anterior (el isset)? y de ser así, ¿es recomendable?" seria recomendable verificar si dicha variable tiene algun dato. Puesto que puede ser un dato que va a ser almacenado en una bD.

Saludillos.
  #4 (permalink)  
Antiguo 09/05/2006, 13:26
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Hola mauled, me queda bastante claro lo de los strings y op. lógicos.
Con lo restante, creo que lo explicaría mejor con el siguiente ejemplo.
Se trata de un trabajo práctico (ya hecho y aprobado, no pido ayuda con él).

La consigna fue:
Cita:
-validar que todos los campos sean obligatorios
-las contraseñas deben conicidir y no deben ser menores de 5 ni mayores de 8
-la dirección tiene que salir con las iniciales en mayúsculas y el resto en minúsclas.
-nombre y apelido igual que elpunto anterior
-si falto llenar un campo, lo debe marcar (avisar de todos los errores)
-si está todo ok, dar un resumen de todos los datos cargados (salvo la contraseña)
-calcular la edad con la fecha de nacimiento
-mantener el estado del formulario.
La lógica que le di fue esta:

Código:
<?
//No sé por qué me obliga a definir variables!!!!
$nombre="";
$apellido="";
$dia="";
$mes="";
$anio="";
$user="";
$pass="";
$pass2="";
$direccion="";
$localidad="";
$provincia="";
$alertar_nombre = false;
$alertar_apellido = false;
$alertar_nac = false;
$alertar_user = false;
$alertar_pass = false;
$alertar_pass2 = false;
$alertar_direccion = false;
$alertar_localidad = false;
$alertar_provincia = false;
$alertar_pass_distintas = false;
$alertar_pass_largo = false;
$muestra_form = true;
?>
<!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=iso-8859-1" />
<title>TP2 NE TM Azuaga</title>
<style type="text/css">
<!--
body {
	font-family: Georgia, "Times New Roman", Times, serif;
	font-size: 12px;
	color: #333333;
	margin-top: 50px;
	margin-right: 0px;
	margin-bottom: 0px;
	margin-left: 0px;
}
#contenedor {
	margin-right: auto;
	margin-left: auto;
	width: 550px;
}
#registro {
	margin: 0px;
	padding: 0px;
}
#frmtitulo {
	font-size: 16px;
	font-weight: bold;
	background-color: #FFFFFF;
}
fieldset {
	background-color: #EBEBEB;
	display: block;
}
label {
	display: block;
	width: 450px;
	margin-right: auto;
	margin-left: auto;
	margin-top: 5px;
}
label span {
	width: 150px;
	display: block;
	float: left;
	text-align: right;
	margin-right: 10px;
}
input {
	width: 200px;
}
#enviar {
	width: auto;
}
#alertas {
	width: 550px;
	margin-right: auto;
	margin-bottom: 50px;
	margin-left: auto;
}
#tit_alertas {
	margin-top: 0px;
	margin-right: 0px;
	margin-bottom: 15px;
	margin-left: 0px;
	font-size: 14px;
	font-weight: bold;
}
#contenedor th {
	text-align: left;
}
#contenedor #thsup {
	background-color: #FFFFFF;
}
#contenedor table {
	color: #333333;
	background-color: #EBEBEB;
}
#contenedor tr {
}
.fecha_nac {
	width: auto;
}
-->
</style>
</head>
<body>
<?
if(isset($_POST['nombre'])){
	$nombre = ucwords(strtolower($_POST['nombre']));
	$apellido = ucwords(strtolower($_POST['apellido']));
	$dia = $_POST['dia'];
	$mes = $_POST['mes'];
	$anio = $_POST['anio'];
	$user = $_POST['user'];
	$pass = $_POST['pass'];
	$pass2 = $_POST['pass2'];
	$direccion = ucwords(strtolower($_POST['direccion']));
	$localidad = ucwords(strtolower($_POST['localidad']));
	$provincia = ucwords(strtolower($_POST['provincia']));
	
	if(strlen($nombre) == 0){
		$alertar_nombre = true;
	}
	if(strlen($apellido) == 0){
		$alertar_apellido = true;
	}
	if(strlen($dia) != 2 || strlen($mes) != 2 || strlen($anio) != 4){
		$alertar_nac = true;
//		echo $alertar_nac;
	}
	if(strlen($user) == 0){
		$alertar_user = true;
	}
	if(strlen($pass) == 0){
		$alertar_pass = true;
	}
	if(strlen($pass2) == 0){
		$alertar_pass2 = true;
	}
	if(strlen($direccion) == 0){
		$alertar_direccion = true;
	}
	if(strlen($localidad) == 0){
		$alertar_localidad = true;
	}
	if(strlen($provincia) == 0){
		$alertar_provincia = true;
	}
	
	if($pass != $pass2){
		$alertar_pass_distintas = true;
	}

	if(strlen($pass) < 5 || strlen($pass) > 8){
		$alertar_pass_largo = true;
	}
	//echo "se produjo al menos un submit";
	
	if($alertar_nombre ||
	   $alertar_apellido ||
	   $alertar_nac ||
	   $alertar_user ||
	   $alertar_pass ||
	   $alertar_pass2 ||
	   $alertar_direccion ||
	   $alertar_localidad ||
	   $alertar_provincia ||
	   $alertar_pass_distintas ||
	   $alertar_pass_largo){
//	   	echo "<br />ocurrio al menos un error";
	}
	else{
//		echo "<br />no ocurrieron errores";
		$muestra_form = false;
	}
	
}//isset
	else{
//		echo "se accede por primera vez al formulario";
}//isset
?>

<? if($muestra_form){ ?>
<div id="alertas">
	<p id="tit_alertas">Ocurrieron los siguientes errores:</p>
	<ul>
<?
if($alertar_nombre){
	echo "	  <li>Debe escribir su nombre</li>";
}
if($alertar_apellido){
	echo "	  <li>Debe escribir su apellido</li>";
}
if($alertar_nac){
	echo "	  <li>Debe escribir su fecha de nacimiento completa (Ej. 27/08/1975)</li>";
}
if($alertar_user){
	echo "	  <li>Debe escribir un nombre de usuario</li>";
}
if($alertar_pass){
	echo "	  <li>Debe escribir una contraseña</li>";
}
if($alertar_pass2){
	echo "	  <li>Debe reingresar la contraseña elegida</li>";
}
if($alertar_pass_distintas){
	echo "	  <li>Las contraseñas ingresadas no coinciden</li>";
}
if($alertar_pass_largo){
	echo "	  <li>El largo de las contraseñas debe ser entre 5 y 8 caracteres</li>";
}
if($alertar_direccion){
	echo "	  <li>Debe proporcionarnos su direccion</li>";
}
if($alertar_localidad){
	echo "	  <li>Debe escribir su localidad</li>";
}
if($alertar_provincia){
	echo "	  <li>Debe escribir la provincia donde vive</li>";
}
?>
	</ul>
</div>
<? }//if $muestra_form ?>
<div id="contenedor">
<? if($muestra_form){ ?>
  <form id="registro" name="registro" method="post" action="<? echo $_SERVER['PHP_SELF'] ?>">
    <fieldset>
	<legend id="frmtitulo">Formulario de registro</legend>
	<label><span>Nombre:</span>
    <input name="nombre" type="text" id="nombre" value="<? echo $nombre; ?>" />
    </label>
      <label><span>Apellido:</span>
      <input name="apellido" type="text" id="apellido" value="<? echo $apellido; ?>" />
      </label>
      <label><span>Fecha de nacimiento:</span>
      <input name="dia" type="text" id="dia" value="<? echo $dia; ?>" size="2" maxlength="2" class="fecha_nac" />
      /
      <input name="mes" type="text" id="mes" value="<? echo $mes; ?>" size="2" maxlength="2" class="fecha_nac" />
      /
      <input name="anio" type="text" id="anio" value="<? echo $anio; ?>" size="4" maxlength="4" class="fecha_nac" />
      </label>
      <label><span>Nombre de usuario:</span>
      <input name="user" type="text" id="user" value="<? echo $user; ?>" />
      </label>
      <label><span>Contrase&ntilde;a:</span>
      <input name="pass" type="text" id="pass" value="<? echo $pass; ?>" />
      </label>
      <label><span>Reingrese contrase&ntilde;a:</span>
      <input name="pass2" type="text" id="pass2" value="<? echo $pass2; ?>" />
      </label>
      <label><span>Direcci&oacute;n:</span>
      <input name="direccion" type="text" id="direccion" value="<? echo $direccion; ?>" />
      </label>
      <label><span>Localidad:</span>
      <input name="localidad" type="text" id="localidad" value="<? echo $localidad; ?>" />
      </label>
      <label><span>Provincia:</span>
      <input name="provincia" type="text" id="provincia" value="<? echo $provincia; ?>" />
      </label>
      <label><span>&nbsp;</span>
      <input name="enviar" type="submit" id="enviar" value="Enviar" />
      </label>

    </fieldset>
  </form>
<? }
	else{
?>
  <table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr>
      <th colspan="2" scope="col" id="thsup">Los datos fueron ingresados correctamente:</th>
    </tr>
    <tr>
      <th scope="row">Nombre:</th>
      <td><? echo $nombre; ?></td>
    </tr>
    <tr>
      <th scope="row">Apellido:</th>
      <td><? echo $apellido; ?></td>
    </tr>
    <tr>
      <th scope="row">Direccion</th>
      <td><? echo $direccion; ?></td>
    </tr>
    <tr>
      <th scope="row">Localidad</th>
      <td><? echo $localidad; ?></td>
    </tr>
    <tr>
      <th scope="row">Provincia</th>
      <td><? echo $provincia; ?></td>
    </tr>
    <tr>
      <th scope="row">Su edad: </th>
      <td>
<?php
$fecha1 = date('d/m/Y');
$fecha2 = $dia ."/" . $mes . "/" . $anio;
$diferencia = abs((strtotime($fecha1) - strtotime($fecha2))/(86400*365));
echo number_format($diferencia,0)." Años";
?> 	  </td>
    </tr>
  </table>
<? }//if muestra_form ?>
</div>
</body>
</html>

No sé si está correctamente planteado, pero me llamó mucho la atención (vengo de ASP) que no pueda hacer uso de variables que antes no fueron inicializadas.

Saludos

PD: perdón lo extenso de ese código :p
__________________
...___...
  #5 (permalink)  
Antiguo 09/05/2006, 13:33
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 1 mes
Puntos: 33
De acuerdo

1) ¿Qué error te esta marcando?
2)¿ Porque la validación no la haces del lado del cliente? No le veo caso que hagas la validación del lado del servidor y luego si hubo un error,que "viaje" la información al cliente de que tuvo un error. ¿Porqué decidiste realizar la validación con php?

Saludillos
  #6 (permalink)  
Antiguo 09/05/2006, 14:03
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Que tonto, olvidé ese pequeño detalle.

1) Así como está, no da ningún error. Pero si comento la tercer línea (//$nombre="";) me dice:

Cita:
Notice: Undefined variable: nombre in c:\archivos de programa\easyphp1-8\www\programacion\0419\tp2.php on line 237
Y la línea 237 es:

Código:
<input name="nombre" type="text" id="nombre" value="<? echo $nombre; ?>" />
(Eso en la PC de mi casa, pero me parece que en la que uso donde estoy estudiando no ocurre... no recuerdo, pero mañana lo corroboro que tengo esa clase)

2) La validación con PHP no la decidí yo sino que es justamente para aprender PHP. Si fuese que estoy estudiando JS, pues me la habrían haber hecho en el cliente ;)

Saludos

PD: habrían haber hecho me suena terriblemente mal jajaja
__________________
...___...
  #7 (permalink)  
Antiguo 09/05/2006, 14:14
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Cita:
Iniciado por mauled
2)¿ Porque la validación no la haces del lado del cliente? No le veo caso que hagas la validación del lado del servidor y luego si hubo un error,que "viaje" la información al cliente de que tuvo un error. ¿Porqué decidiste realizar la validación con php?
Si los datos de ese ejemplo no tienen importancia, entonces tienes razón; pero lo que mencionas es un error que se comete muy a menudo, es decir, confiar en los datos que llegan del cliente. Lo *ideal* sería hacer tanto validación en el lado del servidor como del cliente.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #8 (permalink)  
Antiguo 09/05/2006, 14:39
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
comparto la opinión de xknown.
en el cliente, para evitar un viaje innecesario ante un posible error.
y en el servidor, para no ser tan confiado.
__________________
...___...
  #9 (permalink)  
Antiguo 09/05/2006, 14:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Hola Al Zuwaga, bienvenido al lado "PHP" xDD .. (espero no recibir tu bienvendida en el foro de "ASP" )

Sobre tus preguntas iniciales:
Cita:
- Veo que los strings pueden ir indistíntamente entre comillas dobles y apostrofes. ¿qué conviene? ¿"cadena" o 'cadena'?
Hay una diferencia al respecto. Ejemplo:

Siendo:
$variable="esto es una variable";

Si usas comillas dobles .. variables que llames en la cadena serán interpretadas:
echo "algo $variable más cosas";

Resultaría:
echo "algo esto es una variable";

Pero si usas apostrofres (o comillas simples):
echo 'algo $variable más cosas';

Obtendrías:
algo $variable más cosas

(así .. textualmente).

Cita:
- Operadores lógicos: ¿&& y || o and y or?
El uso de &&, u and .. por ejemplo viene dado por el orden en que seran interpretados. La teoría al respecto puedes verla en:

http://www.php.net/string

Cita:
- Declaración de variables: en un PC me deja usar variables que no fueron inicializadas previamente pero en otro no (me da un error) ¿debo siempre declararlas o es preferible modificar alguna configuración para no tener que hacerlo?
Cuando hablas de "PC" te refieres a diferentes servidores (PHP) o bien a "clientes" sólo?

Me parece que te refieres al mensaje de error que mencionas donde haces referencia a una variable externa al script (de un campo de tu formulario). En ese caso (y en tu ejemplo) haces referencias a variable externas en forma "global" .. Eso está en "desuso" en PHP y es una "mala práctica" hacerlo así.

El hecho de que puedas recibir una variable externa en forma "global" depende de la directiva: error_reporting (php.ini). Es recomendable usarla a "OFF" y acceder por su array asociativo: $_GET, $_POST .. etc .. según el método por el que "esperas" la variable externa.

El que se te presente el "aviso" (NOTICE) o no depende de la configuración de PHP en el apartado de reportes de errores (php.ini, directiva: error_reporting .. controlable también por la función de mismo nombre: error_reporting()). Como veras a PHP se le puede "silenciar" que no muestre mensajes de "aviso" o de errores si lo deseas (se usa mucho este control en entornos de producción).

Cita:
Formularios...
- ¿puedo preguntar si isset($_POST/$_GET) sin tener que referirme a un parámetro en particular como en el ejemplo if(isset($_POST['submit'])){...}?
Si, .. como "array's" que son puedes hacer cosas tipo:

if (isset($_POST)){...}

Esto es posible por qué dicho array se "crea" si llegan datos al script por dicho método (al igual que si fuesen en GET: $_GET .. o exitan cookies $_COOKIE por ejemplo ...)

Cita:
- ¿Puedo recurrir a $_POST['text'] sin pasar antes por el paso anterior (el isset)? y de ser así, ¿es recomendable?
Casi todo el mudo accede directamente a un indice de estos arrays sin antes preguntar si existe .. Eso te origina problemas cuando tocas con configuraciones de PHP tipo "error_reporting" con un nivel de errores (mostrar) alto .. por eso lo más sano sería "preguntar" siempre si existe tu variable externa antes de pretender acceder a ella.

Puedes ver más documentación al respecto en:
http://www.php.net/manual/es/languag...s.external.php

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 09/05/2006, 14:58
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
Comparto la opinion de validar en el cliente y en el servidor.
Los notice de tu caso indican que hay que comprobar que una variable tenga valor antes de usarla, se pueden desativar colocando en php.ini, en la directiva: error_reporting esto: error_reporting = E_ALL & ~E_NOTICE
  #11 (permalink)  
Antiguo 09/05/2006, 15:02
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
Cita:
Iniciado por Cluster

El hecho de que puedas recibir una variable externa en forma "global" depende de la directiva: error_reporting (php.ini). Es recomendable usarla a "OFF" y acceder por su array asociativo: $_GET, $_POST .. etc .. según el método por el que "esperas" la variable externa.
Se que quisiste decir: register_globals.
  #12 (permalink)  
Antiguo 09/05/2006, 15:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por claudiovega
Se que quisiste decir: register_globals.
Ops! .. así es claudiovega .. andaba escribiendo de ambos temas y se me traspapeló el tema.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #13 (permalink)  
Antiguo 09/05/2006, 15:33
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 2 meses
Puntos: 535
Genial, muchas gracias.
Ya me estoy llendo para mi casa, pero mañana le sigo al tema.

Saludos

PD: Cluster, me refiero a diferenctes equipos que actuan tanto de cliente como de servidores (vamos, dos "localhost" distintos)
__________________
...___...
  #14 (permalink)  
Antiguo 10/05/2006, 06:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por Al Zuwaga
Genial, muchas gracias.
Ya me estoy llendo para mi casa, pero mañana le sigo al tema.

Saludos

PD: Cluster, me refiero a diferenctes equipos que actuan tanto de cliente como de servidores (vamos, dos "localhost" distintos)
Ok ..

En el momento que mencionas que ya tienes -dos- servidores distintos .. ahí es cuando tienes que plantearte que PHP por su alto grado de configuración y en la medida que afecta al comportamiento de ciertos temas: variables externas, sesiones, apertura/permisos de acceso a archivos .. etc .. etc .. etc. debes revisar ambas configuraciones.

En general como siempre "insisto" con PHP .. se trata de tomar en muchos casos la documentación de PHP oficial y ver que configuración controla tal o cual tema, conocer que configuración usas en concreto y en su defecto y por un mayor control: "forzar" dicha configuración (en la medida de lo posible: no todo se puede ajustar en tiempo de ejecución u otros médios al alcanze de la aplicación que desarrolles) a lo que tu aplicación necesite.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:16.