PHP » Manual de PHP » Iniciación a PHP Conceptos básicos El lenguaje PHP es un lenguaje de programación de estilo clásico, con esto quiero decir que es un lenguaje de programación con variables, sentencias condicionales, bucles, funciones.... No es un lenguaje de marcas como podría ser HTML, XML o WML. Está mas cercano a JavaScript o a C, para aquellos que conocen estos lenguajes. Pero a diferencia de Java o JavaScript que se ejecutan en el navegador, PHP se ejecuta en el servidor, por eso nos permite acceder a los recursos que tenga el servidor como por ejemplo podría ser una base de datos. El programa PHP es ejecutado en el servidor y el resultado enviado al navegador. El resultado es normalmente una página HTML pero igualmente podría ser una pagina WML. Al ser PHP un lenguaje que se ejecuta en el servidor no es necesario que su navegador lo soporte, es independiente del navegador, pero sin embargo para que sus páginas PHP funcionen, el servidor donde están alojadas debe soportar PHP. Nuestro primer PHP La ventaja que tiene PHP sobre otros lenguajes de programación que se ejecutan en el servidor (como podrían ser los script CGI Perl), es que nos permite intercalar las sentencias PHP en las paginas HTML, es un concepto algo complicado de entender si no se ha visto nunca como funciona unas paginas PHP o ASP. Vamos a ver un ejemplo sencillo para comprenderlo mejor. En azul está el código HTML y en rojo el código PHP. Seguiremos este criterio durante todo el manual. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> Parte de HTML normal. <BR><BR> <?php echo "Parte de PHP<br>"; for($i=0;$i<10;$i++) { echo "Linea ".$i."<br>"; } ?> </body> </html> El código PHP ejecutado tiene dos partes: la primera imprime "Parte de PHP" y la segunda es un bucle que se ejecuta 10 veces de 0 a 9, por cada vez que se ejecuta se escribe una línea, la variable $i contiene el número de línea que se está escribiendo. No importa si no entiende muy bien el programa este ejemplo solo es para ilustrar como se intercala el código HTML y el código PHP. Variables Una variable es un contenedor de información, en el que podemos meter números enteros, números decimales, carácteres... el contenido de las variables se puede leer y se puede cambiar durante la ejecución de una página PHP. En PHP todas las variables comienzan con el símbolo del dólar $ y no es necesario definir una variable antes de usarla. Tampoco tienen tipos, es decir que una misma variable puede contener un número y luego puede contener carácteres. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php $a = 1; $b = 3.34; $c = "Hola Mundo"; echo $a,"<br>",$b,"<br>",$c; ?> </body> </html> En este ejemplo hemos definido tres variables, $a, $b y $c y con la instrucción echo hemos impreso el valor que contenían, insertando un salto de línea entre ellas. Existen 2 tipos de variables, las variables locales que solo pueden ser usadas dentro de funciones y las variables globales que tienen su ámbito de uso fuera de las funciones, podemos acceder a una variable global desde una función con la instrucción global nombre_variable; Operadores Aritméticos Los operadores de PHP son muy parecidos a los de C y JavaScript, si usted conoce estos lenguajes le resultaran familiares y fáciles de reconocer. Estos son los operadores que se pueden aplicar a las variables y constantes numéricas. Operador Nombre Ejemplo Descripción + Suma 5+6 Suma dos números - Resta 7-9 Resta dos números * Multiplicación 6*3 Multiplica dos números / División 4/8 Divide dos números % Módulo 7%2 Devuelve el resto de dividir ambos números, en este ejemplo el resultado es 1 ++ Suma 1 $a++ Suma 1 al contenido de una variable. -- Resta 1 $a-- Resta 1 al contenido de una variable. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php $a = 8; $b = 3; echo $a + $b,"<br>"; echo $a - $b,"<br>"; echo $a * $b,"<br>"; echo $a / $b,"<br>"; $a++; echo $a,"<br>"; $b--; echo $b,"<br>"; ?> </body> </html> Comparación Los operadores de comparación son usados para comparar valores y así poder tomar decisiones. Operador Nombre Ejemplo Devuelve cierto cuando: == Igual $a == $b $a es igual $b != Distinto $a != $b $a es distinto $b < Menor que $a < $b $a es menor que $b > Mayor que $a > $b $a es mayor que $b <= Menor o igual $a <= $b $a es menor o igual que $b >= Mayor o igual $a >= $b $a es mayor o igual que $b <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php $a = 8; $b = 3; $c = 3; echo $a == $b,"<br>"; echo $a != $b,"<br>"; echo $a < $b,"<br>"; echo $a > $b,"<br>"; echo $a >= $c,"<br>"; echo $b <= $c,"<br>"; ?> </body> </html> Lógicos Los operadores lógicos son usados para evaluar varias comparaciones, combinando los posibles valores de estas. Operador Nombre Ejemplo Devuelve cierto cuando: && Y (7>2) && (2<4) Devuelve verdadero cuando ambas condiciones son verdaderas. and Y (7>2) and (2<4) Devuelve verdadero cuando ambas condiciones son verdaderas. || O (7>2) || (2<4) Devuelve verdadero cuando al menos una de las dos es verdadera. or O (7>2) or (2<4) Devuelve verdadero cuando al menos una de las dos es verdadera. ! No ! (7>2) Niega el valor de la expresión. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php $a = 8; $b = 3; $c = 3; echo ($a == $b) && ($c > $b),"<br>"; echo ($a == $b) || ($b == $c),"<br>"; echo !($b <= $c),"<br>"; ?> </body> </html> Instrucciones de Programación Condicionales Las sentencias condicionales nos permiten ejecutar o no unas ciertas instrucciones dependiendo del resultado de evaluar una condición. Las más frecuentes son la instrucción if y la instrucción switch. Sentencia if ... else <?php if (condición) { Sentencias a ejecutar cuando la condición es cierta. } else { Sentecias a ejecutar cuando la condición es falsa. } ?> La sentencia if ejecuta una serie de instrucciones u otras dependiendo de la condición que le pongamos. Probablemente sea la instrucción más importante en cualquier lenguaje de programación. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php $a = 8; $b = 3; if ($a < $b) { echo "a es menor que b"; } else { echo "a no es menor que b"; } ?> </body> </html> En este ejemplo la condición no es verdadera por lo que se ejecuta la parte de código correspondiente al else. Sentencia switch ... case <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php $posicion = "arriba"; switch($posicion) { case "arriba": // Bloque 1 echo "La variable contiene"; echo " el valor arriba"; break; case "abajo": // Bloque 2 echo "La variable contiene"; echo " el valor abajo"; break; default: // Bloque 3 echo "La variable contiene otro valor"; echo " distinto de arriba y abajo"; } ?> </body> </html> Con la sentencia switch podemos ejecutar unas u otras instrucciones dependiendo del valor de una variable, en el ejemplo anterior, dependiendo del valor de la variable $posicion se ejecuta el bloque 1 cuando el valor es "arriba", el bloque 2 cuando el valor es "abajo" y el bloque 3 si no es ninguno de los valores anteriores. Bucles Los bucles nos permiten iterar conjuntos de instrucciones, es decir repetir la ejecución de un conjunto de instrucciones mientras se cumpla una condición. Sentencia while <?php while (condición) { intrucciones a ejecutar. } ?> Mientras la condición sea cierta se reiterará la ejecución de las instrucciones que están dentro del while. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> Inicio<BR> <?php $i=0; while ($i<10) { echo "El valor de i es ", $i,"<br>"; $i++; } ?> Final<BR> </body> </html> En el siguiente ejemplo, el valor de $i al comienzo es 0, durante la ejecución del bucle, se va sumando 1 al valor de $i de manera que cuando $i vale 10 ya no se cumple la condición y se termina la ejecución del bucle. Sentencia for <?php for (inicial ; condición ; ejecutar en iteración) { intrucciones a ejecutar. } ?> <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> Inicio<BR> <?php for($i=0 ; $i<10 ; $i++) { echo "El valor de i es ", $i,"<br>"; } ?> Final<BR> </body> </html> La instrucción for es la instrucción de bucles más completa. En una sola instrucción nos permite controlar todo el funcionamiento del bucle. El primer parámetro del for, es ejecutado la primera vez y sirve para inicializar la variable del bucle, el segundo parámetro indica la condición que se debe cumplir para que el bucle siga ejecutándose y el tercer parámetro es una instrucción que se ejecuta al final de cada iteración y sirve para modificar el valor de la variable de iteración. Salida Hasta ahora hemos usado la instrucción echo para realizar salida a pantalla, esta instrucción es bastante limitada ya que no nos permite formatear la salida. En esta página veremos la instrucción printf que nos da mucha más potencia. Sentencia printf <?php printf(cadena formato, variable1, variable2...); ?> La cadena de formateo indica cómo se han de representar las valores que posteriormente le indicaremos. La principal ventaja es que además de poder formatear los valores de salida, nos permite intercalar texto entre ellos. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php printf("El numero dos con diferentes formatos: %d %f %.2f",2,2,2); ?> </body> </html> La cadena de formato puede incluir una seria de carácteres especiales que indican como formatear las variables que se incluyen en la instrucción. Elemento Tipo de variable %s Cadena de carácteres. %d Número sin decimales. %f Número con decimales. %c Carácter ASCII. Aunque existen otros tipos, estos son los más importantes. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php $var="texto"; $num=3; printf("Puede fácimente intercalar <b>%s</b> con números <b>%d</b> <br>",$var,$num); printf("<TABLE BORDER=1 CELLPADDING=20>"); for ($i=0;$i<10;$i++) { printf("<tr><td>%10.d</td></tr>",$i); } printf("</table>"); ?> </body> </html> Manejo de cadenas Dado el uso del lenguaje PHP el tratamiento de cadenas es muy importante, existen bastantes funciones para el manejo de cadenas, a continuación explicaremos las más usadas. strlen(cadena). Nos devuelve el número de carácteres de una cadena. split(separador,cadena). Divide una cadena en varias usando un carácter separador. sprintf(cadena de formato, var1, var2...). Formatea una cadena de texto al igual que printf pero el resultado es devuelto como una cadena. substr(cadena, inicio, longitud). Devuelve una subcadena de otra, empezando por inicio y de longitud longitud. chop(cadena). Elimina los saltos de línea y los espacios finales de una cadena. strpos(cadena1, cadena2). Busca la cadena2 dentro de cadena1 indicándonos la posición en la que se encuentra. str_replace(cadena1, cadena2, texto). Reemplaza la cadena1 por la cadena2 en el texto. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php echo strlen("12345"),"<br>"; $palabras=split(" ","Esto es una prueba"); for($i=0;$palabras[$i];$i++) echo $palabras[$i],"<br>"; $resultado=sprintf("8x5 = %d <br>",8*5); echo $resultado,"<br>"; echo substr("Devuelve una subcadena de otra",9,3),"<br><br>"; if (chop("Cadena \n\n ") == "Cadena") echo "Iguales<br><br>"; echo strpos("Busca la palabra dentro de la frase", "palabra"),"<br><br>"; echo str_replace("verde","rojo","Un pez de color verde, como verde es la hierba."),"<br>"; ?> </body> </html> Funciones Funciones El uso de funciones nos da la capacidad de agrupar varias instrucciones bajo un solo nombre y poder llamarlas a estas varias veces desde diferentes sitios, ahorrándonos la necesidad de escribirlas de nuevo. <?php function Nombre(parametro1, parametro2...) { instrucción1; instrucción2; instrucción3; instrucción4; return valor_de_retorno; } ?> Opcionalmente podemos pasarle parámetros a las funciones que se trataran como variable locales y así mismo podemos devolver un resultado con la instrucción return valor; Esto produce la terminación de la función retornando un valor. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php function media_aritmetica($a, $b) { $media=($a+$b)/2; return $media; } echo media_aritmetica(4,6),"<br>"; echo media_aritmetica(3242,524543),"<br>"; ?> </body> </html> Librería El uso de librerías es tremendamente útil, nos permiten agrupar varias funciones y variables en un mismo fichero, de manera que luego podemos incluir esta librería en distintas páginas y disponer de esas funciones fácilmente. <!-- Manual de PHP de WebEstilo.com --> <?php function CabeceraPagina() { ?> <FONT SIZE="+1">Esta cabecera estará en todas sus páginas.</FONT><BR> <hr> <? } function PiePagina() { ?> <hr> <FONT SIZE="-1">Este es el pie de página.</FONT><BR> Autor: Joaquin Gracia <? } ?> Ahora vamos a crear 2 páginas que usan la librería definida anteriormente para conseguir que las dos paginas tengan la misma cabecera y pie de pagina. La instrucción para incluir una librería en nuestra página es include("nombre de librería") <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php include("libreria01.phtml") ?> <?php CabeceraPagina(); ?> Página 1 <BR><BR><BR><BR><BR> Contenido blalbl blalb alb<BR><BR> más cosas...<BR><BR> fin<BR><BR> <?php PiePagina(); ?> </body> </html> <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php include("libreria01.phtml") ?> <?php CabeceraPagina(); ?> Esta es otra página<BR><BR> completamente distinta<BR><BR> pero comparte el pie y la cabecera con la otra.<BR><BR> <?php PiePagina(); ?> </body> </html> Procesado de Formularios Envío y recepción de datos El lenguaje PHP nos proporciona una manera sencilla de manejar formularios, permitiéndonos de esta manera procesar la información que el usuario ha introducido. Al diseñar un formulario debemos indicar la página PHP que procesará el formulario, así como en método por el que se le pasará la información a la página. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de procesado de formularios</H1> Introduzca su nombre: <FORM ACTION="procesa.phtml" METHOD="GET"> <INPUT TYPE="text" NAME="nombre"><BR> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </body> </html> Al pulsar el botón Enviar el contenido de cuadro de texto es enviado a la página que indicamos en el atributo ACTION de la etiqueta FORM. En versiones anteriores a 4.2.0 PHP creaba una variable por cada elemento del FORM, esta variable creada tenía el mismo nombre que el cuadro de texto de la página anterior y el valor que habíamos introducido. Pero por razones de seguridad a partir de entonces para acceder a las variables del formulario hay que usar el array de parámetros $_POST[] o $_GET[] dependiendo del método usado para enviar los parámetros. En este ejemplo se ha creado una entrada en el array $_GET[] con el índice 'nombre' y con el valor que haya introducido el navegante. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de procesado de formularios</H1> El nombre que ha introducido es: <?php echo $_GET['nombre'] ?> <br> </body> </html> Method GET y POST En la página anterior hemos comentado que los datos de un formulario se envía mediante el método indicado en el atributo METHOD de la etiqueta FORM, los dos métodos posibles son GET y POST. La diferencia entre estos dos métodos radica en la forma de enviar los datos a la página, mientras que el método GET envía los datos usando la URL, el método POST los envía por la entrada estándar STDIO. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de procesado de formularios</H1> <FORM ACTION="procesa2.phtml" METHOD="GET"> Introduzca su nombre:<INPUT TYPE="text" NAME="nombre"><BR> Introduzca sus apellidos:<INPUT TYPE="text" NAME="apellidos"><BR> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </body> </html> <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de procesado de formularios</H1> <FORM ACTION="procesa2.phtml" METHOD="POST"> Introduzca su nombre:<INPUT TYPE="text" NAME="nombre"><BR> Introduzca sus apellidos:<INPUT TYPE="text" NAME="apellidos"><BR> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </body> </html> procesa2.phtml <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de procesado de formularios</H1> El nombre que ha introducido por GET es: <?php echo $_GET['nombre']," ", $_GET['apellidos'] ?><br> El nombre que ha introducido por POST es: <?php echo $_POST['nombre']," ", $_POST['apellidos'] ?> <br> </body> </html> El resultado final es el mismo, solo que con el método GET podemos ver los parámetros pasados ya que están codificados en la URL. Envio de emails PHP nos ofrece la posibilidad de enviar emails de una manera sencilla y fácil, para ello el lenguaje nos proporciona la instrucción mail( ) <?php mail(destinatario, tema, texto del mensaje); ?> En el parámetro destinatario pondremos la dirección de email a donde se enviará el mensaje, en el parámetro tema el tema o subject del mensaje y el parámetro texto del mensaje el cuerpo del mensaje en formato texto plano. Existe una sintaxis extendida de la instrucción mail( ) que nos permite añadir información adicional a la cabecera del mensaje. <?php mail(destinatario, tema, texto del mensaje, información adicional de cabecera); ?> En la información de cabecera podremos incluir parámetros adicionales al mensaje como Reply-To:, From:, Content-type:... que nos permiten tener un mayor control sobre el mensaje. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de envio de email</H1> Introduzca su direccion de email: <FORM ACTION="email.phtml" METHOD="GET"> <INPUT TYPE="text" NAME="direccion"><BR><BR> Formato: <BR> <INPUT TYPE="radio" NAME="tipo" VALUE="plano" CHECKED> Texto plano<BR> <INPUT TYPE="radio" NAME="tipo" VALUE="html"> HTML<BR><BR> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </body> </html> email.phtml <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de envio de email</H1> <? $direccion=$_GET['direccion']; $tipo=$_GET['tipo']; if ($direccion!=""){ if ($tipo=="plano"){ // Envio en formato texto plano mail($direccion,"Ejemplo de envio de email","Ejemplo de envio de email de texto plano\n\nWebEstilo.\nhttp://www.webestilo.com/\n Manuales para desarrolladores web.\n","FROM: Pruebas <[email protected]>\n"); } else { // Envio en formato HTML mail($direccion,"Ejemplo de envio de email","<html><head><title>WebEstilo. Manual de PHP</title></head><body>Ejemplo de envio de email de HTML<br><br>WebEstilo.<br>http://www.webestilo.com/<br> <u>Manuales</u> para <b>desarrolladores</b> web.</body></html>","Contenttype: text/html\n", "FROM: Pruebas <[email protected]>\n"); } echo "Se ha enviado un email a la direccion: ",$direccion," en formato <b>", $tipo,"</b>."; } ?> <br> </FORM> </body> </html> Bases de Datos Crear la base de datos Para la realización de este curso sobre PHP con acceso a base de datos hemos elegido la base de datos MySQL por ser gratuita y por ser también la mas empleada en entornos UNIX, para lo cual el servidor donde tenemos alojadas las páginas nos tiene que proporcionar herramientas para crearla o acceso al Telnet para que la creemos por nosotros mismos. El comando para crear una base de datos MySQL es el siguiente: mysqladmin -u root create base_datos Con este comando conseguimos crear la una base de datos en el servidor de bases de datos de nuestro servidor. Una vez conseguido esto debemos crear las tablas en la base de datos, la descripción de las tablas contienen la estructura de la información que almacenaremos en ellas. Para lo cual usaremos en lenguaje de consultas SQL común para todas las bases de datos relacionales. En este ejemplo creamos una tabla llamada prueba con 3 campos: un campo identificador, que nos servirá para identificar unívocamente una fila con el valor de dicho campo, otro campo con el nombre de una persona y por último un campo con el apellido de la persona. Para crear la tabla puede usar la herramienta de administración de MySQL de su servidor web o puede escribir un fichero de texto con el contenido de la sentencia SQL equivalente y luego decirle al motor de base de datos que la ejecute con la siguiente instrucción: mysql -u root base_datos <prueba.sql prueba.sql CREATE TABLE prueba ( ID_Prueba int(11) DEFAULT '0' NOT NULL auto_increment, Nombre varchar(100), Apellidos varchar(100), PRIMARY KEY (ID_Prueba), UNIQUE ID_Prueba (ID_Prueba) ); Conexión a la base de datos Una vez que tenemos creada la base de datos en nuestro servidor, el siguiente paso es conectarnos a la misma desde una página PHP. Para ello PHP nos proporciona una serie de instrucciones para acceder a bases de datos MySQL. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php function Conectarse() { if (!($link=mysql_connect("localhost","usuario","Password"))) { echo "Error conectando a la base de datos."; exit(); } if (!mysql_select_db("base_datos",$link)) { echo "Error seleccionando la base de datos."; exit(); } return $link; } $link=Conectarse(); echo "Conexión con la base de datos conseguida.<br>"; mysql_close($link); //cierra la conexion ?> </body> </html> Al ejecutar la instrucción mysql_connect creamos un vínculo entre la base de datos y la pagina PHP, este vínculo será usado posteriormente en las consultas que hagamos a la base de datos. Finalmente, una vez que hemos terminado de usar el vínculo con la base de datos, lo liberaremos con la instrucción mysql_close para que la conexión no quede ocupada. Consultas a la base de datos Una vez que nos hemos conectado con el servidor de bases de datos, ya podemos realizar consultas a las tablas de la base de datos. Para facilitar la programación hemos separado la función de conexión en una librería a parte, de tal manera que la incluiremos en todas las páginas que accedan a la base de datos. conex.phtml <!-- Manual de PHP de WebEstilo.com --> <?php function Conectarse() { if (!($link=mysql_connect("localhost","usuario","Password"))) { echo "Error conectando a la base de datos."; exit(); } if (!mysql_select_db("base_datos",$link)) { echo "Error seleccionando la base de datos."; exit(); } return $link; } ?> <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1> <?php include("conex.phtml"); $link=Conectarse(); $result=mysql_query("select * from prueba",$link); ?> <TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1> <TR><TD>&nbsp;Nombre</TD><TD>&nbsp;Apellidos&nbsp;</TD></TR> <?php while($row = mysql_fetch_array($result)) { printf("<tr><td>&nbsp;%s</td><td>&nbsp;%s&nbsp;</td></tr>", $row["Nombre"],$row["Apellidos"]); } mysql_free_result($result); mysql_close($link); ?> </table> </body> </html> En este ejemplo hemos utilizado 3 instrucciones nuevas: mysql_query, mysql_fetch_array y mysql_free_result. Con la instrucción mysql_query hemos hecho una consulta a la base de datos en el lenguaje de consultas SQL, con la instrucción mysql_fetch_array extraemos los datos de la consulta a un array y con mysql_free_result liberamos la memoria usada en la consulta. Insertar registros Hasta ahora nos hemos conectado a una base de datos y hemos hecho consultas a la misma, ahora presentaremos como introducir nuevo registros en la base de datos. Para ello usaremos un formulario y en el ACTION del FORM <FORM ACTION="programaPHP"> indicaremos que debe ser procesado una pagina PHP, esta página lo que hará será introducir los datos del formulario en la base de datos. ejem07d.phtml <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1> <FORM ACTION="procesar.phtml"> <TABLE> <TR> <TD>Nombre:</TD> <TD><INPUT TYPE="text" NAME="nombre" SIZE="20" MAXLENGTH="30"></TD> </TR> <TR> <TD>Apellidos:</TD> <TD><INPUT TYPE="text" NAME="apellidos" SIZE="20" MAXLENGTH="30"></TD> </TR> </TABLE> <INPUT TYPE="submit" NAME="accion" VALUE="Grabar"> </FORM> <hr> <?php include("conex.phtml"); $link=Conectarse(); $result=mysql_query("select * from prueba",$link); ?> <TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1> <TR><TD>&nbsp;<B>Nombre</B></TD> <TD>&nbsp;<B>Apellidos</B>&nbsp;</TD></TR> <?php while($row = mysql_fetch_array($result)) { printf("<tr><td>&nbsp;%s</td> <td>&nbsp;%s&nbsp;</td></tr>", $row["Nombre"], $row["Apellidos"]); } mysql_free_result($result); mysql_close($link); ?> </table> </body> </html> procesar.phtml <?php include("conex.phtml"); $link=Conectarse(); $nombre=$_GET['nombre']; $apellidos=$_GET['apellidos']; mysql_query("insert into prueba (Nombre,Apellidos) values ('$nombre','$apellidos')",$link); header("Location: ejem07d.phtml"); ?> La primera página PHP ejem07d.phtml es un formulario que nos permite introducir nombre y apellido para añadirlo a la base de datos, seguido de una consulta que nos muestra el contenido de la tabla prueba. El formulario llama a la pagina procesar.phtml que añadirá los datos a la tabla. La segunda página procesar.phtml se conecta a la base de datos y añade un nuevo registro con la instrucción insert del lenguaje de base de datos SQL. Una vez el registro se ha añadido se vuelve a cargar la página ejem07d.phtml Borrar registros Y finalmente, para cerrar el ciclo, nos queda el borrado de registros. El borrado de registros el uno de los procesos más sencillos. Para indicar que elemento vamos a borrar hemos usado un enlace a la página borra.phtml pasándole el ID_Prueba de cada registro, de esta manera la página borra.phtml sabe que elemento de la tabla ha de borrar. ejem07e.phtml <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de uso de bases de datos con PHP y MySQL</H1> <?php include("conex.phtml"); $link=Conectarse(); $result=mysql_query("select * from prueba",$link); ?> <TABLE BORDER=1 CELLSPACING=1 CELLPADDING=1> <TR><TD>&nbsp;<B>Nombre</B></TD> <TD>&nbsp;<B>Apellidos</B>&nbsp;</TD> <TD>&nbsp;<B>Borrar</B>&nbsp;</TD></TR> <?php while($row = mysql_fetch_array($result)) { printf("<tr><td>&nbsp;%s</td><td>&nbsp;%s&nbsp;</td><td><a href=\"borra.phtml?id=%d\">Borra</a></td></tr>", $row["Nombre"], $row["Apellidos"],$row["ID_Prueba"]); } mysql_free_result($result); mysql_close($link); ?> </table> </body> </html> borra.phtml <?php include("conex.phtml"); $link=Conectarse(); $id=$_GET['id']; mysql_query("delete from prueba where ID_Prueba = $id",$link); header("Location: ejem07e.phtml"); ?> La página borra.phtml se conecta a la base de datos y borra el registro indicado en la variable $id que ha sido pasado desde la página ejem07e.phtml. Una vez el registro se ha borrado se vuelve a cargar la página ejem07e.phtml Seguridad Restringir el acceso En esta sección vamos a explicar cómo podemos restringir el acceso a según qué páginas, para que solo las personas autorizadas puedan acceder a ciertas partes del nuestro sitio web. Atención: El acceso restringido a páginas usando las variables globales $PHP_AUTH_USER, $PHP_AUTH_PW y $PHP_AUTH_TYPE solo funciona si PHP ha sido instalado como un módulo de Apache, si ha sido instalado como un CGI los ejemplos de ésta sección no funcionarán. Para conseguir la autentificación en las páginas usaremos el sistema de autentificación del protocolo HTTP, este sistema se basa en las variables globales $PHP_AUTH_USER y $PHP_AUTH_PW. $PHP_AUTH_USER. Nombre de usuario introducido. $PHP_AUTH_PW. Contraseña introducida. Para que el navegador nos muestre la ventana de petición de nombre de usuario y contraseña basta con enviar la siguiente cabecera: <?php // Manual de PHP de WebEstilo.com if (!isset($PHP_AUTH_USER)) { header('WWW-Authenticate: Basic realm="Acceso restringido"'); header('HTTP/1.0 401 Unauthorized'); echo 'Authorization Required.'; exit; } else { echo "Ha introducido el nombre de usuario: $PHP_AUTH_USER<br>"; echo "Ha introducido la contraseña: $PHP_AUTH_PW<br>"; } ?> Esto provoca que se muestre la ventana de nombre de usuario y contraseña y los datos introducidos se asignen a las variables $PHP_AUTH_USER y $PHP_AUTH_PW. A partir de aquí realizaremos las comprobaciones necesarias para asegurarnos que los datos introducidos son los correctos. En el siguiente ejemplo pediremos autorización y comprobaremos si el nombre de usuario es Joe y la contraseña 123, si es así tendremos acceso al resto de la página. <?php // Manual de PHP de WebEstilo.com if (($PHP_AUTH_USER!="Joe") || ($PHP_AUTH_PW!="123")) { header('WWW-Authenticate: Basic realm="Acceso restringido"'); header('HTTP/1.0 401 Unauthorized'); echo 'Authorization Required.'; exit; } ?> <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> Ha conseguido el acceso a la <B>zona restringida</B>. </body> </html> Distinción de usuarios En la anterior página todo el mundo que tenía acceso a la parte restringida entraba con el mismo nombre de usuario y contraseña, esto evidentemente no es una buena solución, es mejor que cada persona tenga un nombre de usuario y contraseña, ya que de esta forma podemos inhabilitar a un usuario sin ver comprometida la seguridad de nuestro sitio. En esta página veremos la forma de realizar esto, teniendo un fichero separado con los nombres de usuario y las contraseñas válidas. Dicho fichero podría tener el siguiente formato: nombre_de_usuario|contraseña. Por ejemplo: passwords.txt Joe|1235 Pedro|qwer Noe|Gty45e kermit|rwe4v En este ejemplo se pide la autorización al comienzo de la página si no se ha establecido con anterioridad y se comprueba con el fichero de contraseñas que hemos llamado passwords.txt, si el nombre de usuario y contraseña coincide con alguna entrada del fichero se nos permite ver el resto de la página. <?php // Manual de PHP de WebEstilo.com if (!isset($PHP_AUTH_USER)) { header('WWW-Authenticate: Basic realm="Acceso restringido"'); header('HTTP/1.0 401 Unauthorized'); echo 'Authorization Required.'; exit; } $fich = file("passwords.txt"); $i=0; $validado=false; while ($fich[$i] && !$validado) { $campo = explode("|",$fich[$i]); if (($PHP_AUTH_USER==$campo[0]) && ($PHP_AUTH_PW==chop($campo[1]))) $validado=true; $i++; } if (!$validado) { header('WWW-Authenticate: Basic realm="Acceso restringido"'); header('HTTP/1.0 401 Unauthorized'); echo 'Authorization Required.'; exit; } ?> <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> Ha conseguido el acceso a la <B>zona restringida</B> con el usuario <?php echo $PHP_AUTH_USER?>. </body> </html> Sesiones ¿Qué son las sesiones? Por: Jose Valle Si existe una consulta repetida en las listas de PHP, es la relativa al uso de las sesiones. El uso de sesiones es un método ampliamente extendido en cualquier aplicación de cierta entidad. Básicamente una sesión es la secuencia de páginas que un usuario visita en un sitio web. Desde que entra en nuestro sitio, hasta que lo abandona. El término sesión en PHP, session en inglés, se aplica a esta secuencia de navegación, para ello crearemos un identificador único que asignamos a cada una de estas sesiones de navegación. A este identificador de sesión se le denomina, comúnmente, como la sesión. El proceso en cualquier lenguaje de programación podría ser algo así: Existe una sesión? Si existe la retomamos Si no existe creamos una nueva Generar un identificador único Y para que no perdamos el hilo de la navegación del usuario deberemos asociar esta sesión a todas las URLs y acciones de formulario. Podemos también crear un cookie que incluya el identificador de sesión, pero es conveniente recordar que la disponibilidad o no de las cookies depende del usuario, y no es conveniente fiarse de lo que un usuario pueda o no tener habilitado. Lo contado hasta ahora es teoría pura y es aplicable a cualquier lenguaje de programación C, Perl, etc. Los que programamos en PHP4 tenemos la suerte de que toda la gestión de sesiones la hace el mismo PHP. Por lo tanto lo comentado a partir de aquí es solo aplicable a PHP4. Si aún desarrollas PHP3, tendrás que crear tus propias librerías de gestión de sesiones o recurrir a alguna de las existentes, como la de PHPLIB . Inicialización de la sesión Por: Jose Valle Para utilizar sesiones en PHP lo primero es inicializarlas. Podemos hacerlo explícitamente, mediante la función session_start(), o al registrar una variable en una sesión mediante session_register('miVariable'). En ambos casos se crea una nueva sesión, si no existe, o se retoma la sesión actual. Veamos un sencillo ejemplo: <?php // Manual de PHP de WebEstilo.com session_start(); echo "He inicializado la sesión"; ?> Esta es la forma más básica, si el usuario tiene los cookies activados, PHP habrá insertado de forma automática la sesión y ésta será pasada de una página a otra sin hacer nada más. Desde un punto de vista práctico la sesión es operativa, pero no vemos nada. Podemos obtener la sesión en cualquier momento mediante la función session_id(). Inserta en las sucesivas páginas la siguiente línea para ver si la sesión está disponible: <?php // Manual de PHP de WebEstilo.com session_start(); echo 'La sesión actual es: '.session_id(); ?> En este caso session_start() comprueba en los cookies que existe una sesión y continua con ella, session_id() devuelve el identificador actual. Ejemplo práctico Por: Jose Valle Veamos otro ejemplo que, tal vez, te lo aclare un poco más: <?php // Manual de PHP de WebEstilo.com session_register('contador'); echo '<a href="'.$PHP_SELF.'?'.$SID.'">Contador vale: '.++ $_SESSION['contador']. '</a>'; ?> Como dije anteriormente la sesión se crea o recoge mediante session_start(), o también cuando se registra una variable de sesión mediante session_register(). Si no has utilizado nunca las sesiones, el concepto de variable de sesión, puede resultar un poco abstracto. Básicamente es una variable, como cualquiera de las que gestiona PHP4, pero que reside en un espacio específico en el servidor, junto con el identificador de sesión, y que pertenece únicamente a un usuario. En nuestro ejemplo anterior, registramos la variable $contador en la primera línea del script. En la segunda línea, entre otras cosas, cada vez que recarguemos la página o hagamos click sobre el enlace, el valor de $contador se incrementará en 1. En esta línea hacemos uso de la variable reservada $PHP_SELF, que hace referencia al propio script en ejecución y una constante propia de PHP4, $SID, que contiene el nombre de la sesión y el identificador de la misma. Podemos averiguar también el nombre de la sesión, o modificarlo, mediante la función session_name(). Veamos una prueba práctica: <?php // Manual de PHP de WebEstilo.com session_name('misesion'); session_register('contador'); echo '<a href="'.$PHP_SELF.'?'.SID.'">Contador vale: '.++ $_SESSION['contador'].'</a><br>'; echo 'Ahora el nombre es '.session_name().' y la sesión '.$misesion.'<br>'; ?> La asignación del nombre de sesión debe realizarse antes que ninguna otra función con sesiones, antes que session_start() o session_register(). Error común Por: Jose Valle Uno de los errores más comunes cuando se utilizan sesiones es dejar líneas en blanco antes de la inicialización de PHP o enviar alguna salida a la pantalla. Para probarlo crea una línea en blanco o con cualquier cosa antes de <?php. Si tienes los cookies activados, te encontrarás un error de este tipo: Warning: Cannot send session cookie - headers already sent by (output started at /home/session.php:2) in /home/session.php on line 4 PHP está informando de que no puede activar los cookies en el navegador del usuario, porque las cabeceras ya han sido enviadas. Simplemente por la existencia de una línea en blanco. Como medida práctica, no dejes espacios ni antes del inicio del script, ni después de la finalización. Te ahorrará muchos disgustos. Si después de todo lo comentado aún no entiendes para que sirven las sesiones, veamos un ejemplo práctico. Imagina que quisieras crear un sistema de cesta de la compra... Carrito de compra Por: Jose Valle Si después de todo lo comentado aún no entiendes para que sirven las sesiones, veamos un ejemplo práctico. Imagina que quisieras crear un sistema de cesta de la compra, en su forma básica podría ser algo así: <?php // Manual de PHP de WebEstilo.com session_start(); session_register('itemsEnCesta'); $item=$_POST['item']; $cantidad=$_POST['cantidad']; $itemsEnCesta=$_SESSION['itemsEnCesta']; if ($item){ if (!isset($itemsEnCesta)){ $itemsEnCesta[$item]=$cantidad; }else{ foreach($itemsEnCesta as $k => $v){ if ($item==$k){ $itemsEnCesta[$k]+=$cantidad; $encontrado=1; } } if (!$encontrado) $itemsEnCesta[$item]=$cantidad; } } $_SESSION['itemsEnCesta']=$itemsEnCesta; ?> <html> <body> <tt> <form action="<?=$PHP_SELF."?".$SID?>" method="post"> Dime el producto <input type="text" name="item" size="20"><br> Cuantas unidades <input type="text" name="cantidad" size="20"><br> <input type="submit" value="Añadir a la cesta"><br> </form> <? if (isset($itemsEnCesta)){ echo'El contenido de la cesta de la compra es:<br>'; foreach($itemsEnCesta as $k => $v){ echo 'Artículo: '.$k.' ud: '.$v.'<br>'; } } ?> </tt> </body> </html> Una breve explicación. En la línea 4 comprobamos si el usuario ha pasado algún artículo, desde el formulario. En la 5 si el array itemsEnCesta no existe, lo creamos con el nuevo producto y la cantidad indicada. Si el array existe recorremos su contenido, entre las líneas 8 y 13, y si encontramos un artículo igual, añadimos la cantidad en la línea 10. Si no lo encontramos, es un nuevo artículo, por lo tanto, añadimos el nuevo producto con la correspondiente cantidad a itemsEnCesta en la línea 14. Y a continuación imprimimos el formulario y los resultados, si los hubiera, a partir de la línea 18, donde empieza el HTML. ¿Te imaginas las posibilidades de un sistema de almacenamiento de información de estas características?. No necesitas ficheros, ni bases de datos, ni tienes que andar pasando valores de una página a otra. PHP va gestionando estos datos por nosotros, hasta el momento en que decidamos almacenar la información donde más nos interese. Estas son las funcionalidades básicas de las sesiones, espero que te haya resultado ilustrativo y no olvides consultar el resto de funciones asociadas al uso de sesiones en el manual de PHP. Cookies ¿Qué son las cookies? Por: Carlos Gallús Lahoz y Joaquin Gracia. La principal utilidad de las cookies (galletas) es la de solventar el problema de la falta de estado en la navegación a través de las paginas web. Con las cookies, pequeñas porciones de información se quedan registradas en el navegador permitiendo identificar a este a través de diferentes páginas de un mismo sitio e incluso durante visitas entre distintos días. Realmente las cookies no son mas que cadenas de texto que son enviadas desde el servidor al cliente (navegador) y almacenadas en este, luego el navegador envía estas cookies al servidor permitiendo así la identificación del cliente en el servidor. Funcionamiento La cookie es enviada al navegador desde el servidor y si este la acepta permanece en él. Las páginas piden la cookie al navegador... El navegador las envía, permitiendo la identificación del usuario por parte del servidor. A continuación vamos a ver como usar las cookies para nuestro beneficio. Cómo usar las cookies Por: Carlos Gallús Lahoz y Joaquin Gracia. El manejo de cookies en PHP se realiza mediante el uso de la función setcookie, esta función esta disponible a partir de la versión 3 de PHP. int setcookie (string Nombre [, string Valor [, int Expire [, string Path [, string Dominio [, int Secure]]]]]) Setcookie() define una cookie que es enviada junto con el resto de la información de la cabecera(header). Las cookies deben ser enviadas antes de cualquier tag de html, por lo tanto deberemos realizar la llamada a estas funciones antes de cualquier tag <HTML> o <HEAD>. Esta es una restricción de las cookies no de PHP. Todos los argumentos excepto el nombre son opcionales. Nombre. Nombre de la cookie. Si creamos una cookie solamente con el nombre, en el cliente se eliminara la cookie que exista con ese nombre. También podemos reemplazar cualquier argumento con una cadena vacía (""). Value. Valor que almacenará la cookie en el cliente. Expire. El argumento expire es un argumento entero que indica la hora en que se eliminara la cookie en el formato de hora que devuelven las funciones UNIX time() y mktime(). Normalmente se usa time() + N. segundos de duración, para especificar la duración de una cookie. Path. Subdirectorio en donde tiene valor la cookie. Dominio. Dominio en donde tiene valor la cookie. Si ponemos como dominio www.domain.com la cookie no se transmite para domain.com, mientras que si ponemos domain.com la cookie se transmite tanto para domain.com como para www.domain.com Secure. El argumento secure indica que la cookie solo se transmitirá a través de una conexión segura HTTPS. Ejemplo setcookie("usuario", "Luis", time()+3600,"/","webestilo.com"); En este ejemplo establecemos una cookie de nombre usuario que contiene el valor Luis, que dura 1 hora (3600 segundos) válida para todo el dominio webestilo.com Ejemplo de uso de cookies Por: Carlos Gallús Lahoz y Joaquin Gracia. En este ejemplo vamos a ver como establecer una cookie y cómo se recupera el valor establecido. Para ello pediremos al usuario que introduzca su nombre, que guardaremos en una cookie. Primero pedimos al usuario que introduzca el valor de su nombre, usamos un formulario que procesará la página procesar_cookie.phtml. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de uso de cookie</H1> Introduzca su nombre: <FORM ACTION="procesar_cookie.phtml" METHOD="GET"> <INPUT TYPE="text" NAME="nombre"><BR> <INPUT TYPE="submit" VALUE="Enviar"> </FORM> </body> </html> Se establece la cookie ejemusuario con el valor introducido anteriormente, y cuya duración es una hora. <?php // Manual de PHP de WebEstilo.com setcookie("ejemusuario", $_GET['nombre'], time()+3600,"/",""); ?> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de uso de cookie</H1> Se ha establecido una cookie de nombre <b>ejemusuario</b> con el valor: <b><? print $_GET['nombre']; ?></b> que será válida durante 1 hora. </body> </html> En este ejemplo vemos lo fácil que es recuperar el valor de la cookie establecida anteriormente. <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <H1>Ejemplo de uso de cookie</H1> Se ha establecido la cookie de nombre <b>ejemusuario</b> vale: <b><? print $_COOKIE['ejemusuario']; ?></b> </body> </html> PHP » Instalación PHP MySQL » Instalación y Configuración Instalación de Apache + PHP + MySQL 1/3 Por: Carlos Gallús Lahoz. C.E.S. Fundación San Valero. Instalación del servidor Apache A continuación vamos a explicar la instalación de un servidor Apache en un sistema operativo Windows 98. Debemos tener en cuenta que esta versión es una versión beta de calidad. Esto significa que no ofrece la estabilidad y seguridad que la versión de unix, de hecho existen numerosos errores e inconsistencias, aun así es suficiente para realizar pruebas en nuestro ordenador. Comencemos con la instalación: El archivo de instalación para Windows está en http://www.apache.org/dist/httpd/binaries/win32/ , una vez que lo tengamos lo podemos copiar en nuestro escritorio y lo ejecutamos haciendo doble click sobre él. Entraremos en un programa de instalación standard de aplicaciones win32, así que nos limitaremos a elegir las opciones que nos muestre el programa de instalación, es muy sencillo ya que solo pide rutas de instalación de los archivos y se pueden dejar las que vienen por defecto. Si no elegimos un directorio distinto Apache se instalará en: C:\Archivos de programa\Apache Group\Apache Una vez terminada la instalación vamos al directorio donde tenemos instalado el servidor, en el directorio "\conf\" es donde se alojan los archivos de configuración del servidor. Dentro de este directorio se encuentra el archivo "httpd.conf" este es el archivo de configuración que Apache utiliza al ejecutarse. Para que Apache funcione correctamente deberemos modificar el archivo anterior, para realizar esto deberemos abrirlo con un editor de texto (por ejemplo WordPad), y guardarlo como archivo de texto plano. Una vez abierto el archivo deberemos buscar la línea que ponga "ServerName". Lo más probable es que encontremos la siguiente línea: #ServerName "nombre de servidor por defecto" La debemos sustituir por la siguiente: ServerName http:// Para poner en marcha el servidor deberemos ir al escritorio de Windows, el servidor se encontrará en la siguiente ubicación del menú de inicio "Inicio| Apache Web Server|star Apache", o por el contrario en la ubicación que hayamos indicado durante la instalación. Al ejecutarlo se nos quedará abierta una ventana MS-DOS en la cual estará corriendo el servidor. Con el servidor en funcionamiento, comprobaremos si funciona correctamente, para ello abriremos un explorador como puede ser Netscape Communicator o Internet Explorer y en la barra de direcciones teclearemos: http://127.0.0.1 o http://localhost o http://"nombre de nuestro PC" Si tenemos instalado correctamente Apache deberíamos ver la página que aparece en la fotografía inferior. Esta es la página de chequeo que por defecto incluye Apache. En caso de no verla es que no hemos realizado correctamente algún paso anterior. Por defecto las páginas estarán alojadas en la siguiente dirección de nuestra máquina: C:\Directorio de instalación de Apache\htdocs\ Por defecto tenemos configurado Apache para que abra el archivo index.html que se encuentre en el directorio que indiquemos. Por lo tanto cuando en el navegador pongamos la dirección "http://127.0.0.1" el explorador cargará la página index.html del directorio C:\Directorio de instalación de Apache\htdocs\. Si tenéis alguna duda sobre todo lo dicho o queréis saber algo más sobre Apache, en el directorio htdocs\manual existe información mucho más extensa sobre el funcionamiento, configuración e instalación de Apache Instalación de Apache + PHP + MySQL 2/3 Por: Carlos Gallús Lahoz. C.E.S. Fundación San Valero. Instalación de PHP4 Descargamos y descomprimimos el archivo de PHP. Podemos descomprimirlo por ejemplo en el directorio "C:\PHP4\". Una vez descomprimido, vamos a ese directorio y editamos el archivo php.ini-dist. Dentro de él buscamos la sección Rutas y Directorios. Comprobamos que el apartado "extension_dir" tenga el valor "./" esto indica el directorio actual de PHP y donde se encontrarán las extensiones de PHP. En la siguiente sección tenemos las extensiones de PHP, que nos proporcionan funciones extra a nuestro interprete de PHP (muchas de estas extensiones no funcionarán correctamente bajo Windows98). Seleccionamos las que necesitemos, esto lo hacemos quitando el ";" al principio de la línea. Debemos comprobar que el archivo al que se hace referencia esta en nuestro directorio de PHP ("C:\PHP4\"). En este archivo podemos configurar muchas más opciones, como por ejemplo opciones para el soporte de distintos sistemas gestores de bases de datos, pero por el momento no modificaremos nada, solamente en caso de necesitarlo. Una vez que tengamos modificado lo anterior, guardamos el archivo con el siguiente nombre "php.ini". A continuación vamos al directorio donde teníamos instalado Apache y en el directorio "/config/" editamos el archivo "httpd.conf" donde deberemos introducir las siguientes directivas de configuración. Vamos a la sección "ScriptAlias". En esta sección indicamos el alias que tendrá la ruta donde se encuentra nuestro intérprete de PHP. Debemos tener la siguiente línea. ScriptAlias /cgi-bin/ "C:/Archivos de programa/Apache Group/Apache/cgi-bin/" La línea anterior es un directorio que Apache tiene por defecto para ejecutar scripts. Debajo de esta línea debemos introducir: ScriptAlias /PHP4/ "C:\PHP4\" En la sección Addtype, se encuentra la configuración que indica al intérprete que archivos debe procesar. Añadimos: Addtype application/x-httpd-php .php4 Addtype application/x-httpd-php .phtml En la sección Action, indicamos cual es el archivo que sirve de intérprete de PHP. Añadiremos: Action application/x-httpd-php "/PHP4/php.exe" Una vez echo esto guardamos el archivo y creamos una página de prueba. Guardaremos el archivo en formato de texto plano. Abrimos un archivo nuevo y escribimos el código inferior: <?php echo "Hola, mi primera página PHP"; phpinfo(); ?> Una vez escrito el código anterior lo guardamos en el directorio "/htdocs/" del directorio Apache con el nombre "info.php4". Ejecutamos de nuevo un explorador web e introducimos la siguiente dirección: "http://127.0.0.1/info.php4". El resultado es una pantalla con información sobre la versión de PHP que utilizamos, además de información sobre el valor de las variables que PHP maneja. Si no vemos esa pantalla deberemos comprobar los pasos anteriores y comprobar que hemos hecho todo correctamente. No obstante, podemos encontrar más información en el manual de referencia de PHP . Instalación de Apache + PHP + MySQL 3/3 Por: Carlos Gallús Lahoz. C.E.S. Fundación San Valero. Instalación de MySQL MySQL es un sistema gestor de bases de datos, este nos permite guardar información y poder realizar páginas más dinámicas, por ejemplo, podemos guardar contraseñas, direcciones de correo, realizar foros de discusión, contadores, aparte de guardar cualquier tipo de información que nos sea de interés. Para poder manejarnos con él deberemos tener unos conocimientos mínimos del lenguaje SQL. Una vez que tengamos el archivo de instalación mysql-shareware_3_22_34win.zip debemos descomprimirlo, por ejemplo, podemos ubicarlo en el directorio "C:\mysqlinst\". Una vez descomprimido vamos a ese directorio y ejecutamos el programa de instalación "Setup.exe" donde indicaremos las rutas que queremos para su instalación. Una vez terminada la instalación los archivos ejecutables se encuentra en el directorio "\bin\". MySQL se comporta como un servidor, por tanto para poder tener acceso al SGBD (sistema gestor de bases de datos) deberemos tenerlo en funcionamiento, para hacer esto deberemos ejecutar el archivo "\bin\mysqldshareware.exe". Para acceder al sistema debemos hacerlo con el programa cliente, que es "/bin/mysql.exe". Para comprobar que funciona correctamente, abrimos una ventana MS-DOS y vamos al directorio donde esté instalado MySQL (por defecto "C:\mysql\" y dentro del directorio "\bin\" ejecutamos "mysql.exe". Si todo va bien habremos entrado en el SGBD. Nos aparecerá el siguiente mensaje: Welcome to the MySQL monitor. Commands en with; or \g. Your MySQL connection id is 2 to server version: 3.22.34-shareware-debug Type 'help for help' mysql> Podemos ver las bases de datos que tenemos en el sistema escribiendo lo siguiente: show databases; Para salir de la sesión deberemos escribir "exit;". No voy ha explicar en este artículo el funcionamiento de MySQL, porque no es su cometido, para ello existen otras secciones donde se explican estos temas. Pero si queremos más información sobre la configuración y manejo de MySQL en el directorio "/Docs/" esta el archivo "manual.html", es un tutorial bastante extenso y bueno. Con todo esto ya tenemos instalado en nuestro equipo todo lo necesario para poder empezar a desarrollar un pequeño web-site. Debo insistir que todos estos programas están pensados inicialmente para funcionar bajo S.O. UNIX y que las versiones Windows, tienen muchas limitaciones, así que no podremos sacar toda la potencia que tienen estos programas. Pero para un comienzo es suficiente. Instalación de PHP sobre PWS4.0 Por: Fernando Arias. Estos sencillos pasos nos explican cómo instalar felizmente el PHP4 sobre una máquina basada en Windows 95 o 98. Es relativamente sencillo, y no debería dar muchos problemas, si se siguen cuidadosamente. La documentación que viene con el programa es bastante buena, aunque a veces parece que está aún pensada para las versiones 3 del PHP, por lo que deberíamos consultarla si nos atascamos. Si de todos modos, lo tuyo no es el inglés, mándame un mail y veré qué puedo hacer. 1. Descomprimir el archivo php-4.0.2-Win32.zip (o más reciente) desde es.php.net 2. Meter todos los archivos en una carpeta, como por ejemplo "c:\php" 3. Copiar las .dlls necesarias (básicamente msvcrt.dll y php4ts.dll) en la carpeta c:\Windows\System (dejar, sobretodo php4isapi.dll en la carpeta c:\php4) 4. Abrir el archivo PWS-php4.reg (no hacer doble clic, sino con el botón derecho seleccionar "Edición") y modificar el Path. Por defecto, pone algo como: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ w3svc\parameters\Script Map] ".php"="[PUT PATH HERE]\\php4isapi.dll" Y hay que sustituirlo por: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ w3svc\parameters\Script Map] ".php"="c:\\php\\php4isapi.dll" Ojo a las barras, fijarse que hay dos para separar los directorios en el path. 5. Ejecutar el archivo PWS-php4.reg . Esto lo que hace es insertarlo en el registro de Windows) 6. Desde la consola de PWS, seleccionar un directorio donde vamos a publicar las páginas, y darle privilegios de Ejecución. Explico esto: Hacer doble clic en el icono del PWS en la esquina inferior derecha de vuestra pantalla, aparece la consola de PWS, ir a la pestaña "Avanzada" (es la última). Agregar un directorio virtual (o editar uno existente), y en sus propiedades, marcar la casilla de "Ejecución" (la del centro). 7. Coger el archivo php-dist.ini, renombrarlo a php.ini y ponerlo en la carpeta c:\Windows (o en c:\ , directamente) 8. Hacer una página de prueba y acceder a ella. Por ejemplo, abrimos un archivo nuevo con el Notepad y escribimos en él lo siguiente: <HTML> <HEAD> <TITLE>Página de prueba de instalación de PHP</TITLE> </HEAD> <BODY> <? phpinfo(); ?> </BODY> </HTML> Guardarlo como prueba.php en la carpeta de publicación. Para probarla abrimos un navegador y en la barra de URL escribimos (suponiendo que nuestro directorio virtual se llama phphome : http://localhost/phphome/prueba.php 9. Maldecirme si no funciona. Nota: Una vez instalé el PHP y tuve un problema: a pesar de seguir todos los pasos de instalación cuidadosamente, a pesar de que todo debería funcionar, a pesar de los pesares... no funcionaba. Sin embargo, si utilizaba cualquier otra extensión (por ejemplo, .phtml) y la registraba en HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \w3svc\parameters\Script Map esa extensión sí me funcionaba, pero no la extensión .php, a pesar de que en todo el registro de Windows no se hacía mención a ella. El problema estaba en el PWS, y no tuve más remedio que desinstalarlo y volverlo a instalar, entonces todo funcionó perfectamente. Instalación de PHP sobre IIS Por: Fernando Arias. La instalación sobre NT y 2000 puede variar ligeramente entre diferentes versiones, pero siguiendo estas líneas seguramente conseguiremos hacer funcionar el PHP. Este documento está basado en el archivo ReadMe que se incluye con el PHP, pero que con frecuencia nos olvidamos de que existe o nos parece demasiado complicado, o sencillamente, ¡qué diablos!... si está en castellano... 1. Descomprimir el archivo php-4.0.2-Win32.zip (o más reciente) desde es.php.net 2. Meter todos los archivos en una carpeta, como por ejemplo "c:php" 3. Copiar las .dlls necesarias (básicamente msvcrt.dll y php4ts.dll) en la carpeta c:\Windows\System (dejar, sobretodo php4isapi.dll en la carpeta c:\php) 4. Ir al Administrador de Servicios de Internet. Puede estar en alguno de estos sitios Inicio -> Configuración -> Paneles de control Inicio -> Programas -> Windows NT 4.0 Option Pack -> Personal Web Server 5. 6. 7. 8. 9. Inicio -> Configuración -> Paneles de control -> Herramientas Administrativas (en Windows 2000) Buscamos el item de nuestro servidor Web (suele aparecer como "Sitio Web Predeterminado") Con el botón derecho, seleccionar en el menú emergente Propiedades Ir a la pestaña "ISAPI filters", y Añadir un nuevo filtro. Como nombre le pondremos "PHP" y como ejecutable, "C:\php\php4isapi.dll" (o dondequiera que hayamos instalado dicha dll. Ir a la pestaña "Home Directory". En la sección de "Application Settings", pulsar el botón "Configuration...". Añadir un nuevo "Application Mapping": el ejecutable es el mismo de antes: "C:\php\php4isapi.dll". La extensión es ".php" (ojo, con un punto delante). Marcar "All verbs" (esto creo que puede variar según la versión del IIS, pero si no es esto, dejarlo como está). Verificar que esté marcado "Script Engine". Aceptar los cambios y reinciar el servidor Web. Puede que no sea suficiente con hacerlo desde la consola, poniendo Detener y luego Iniciar. Lo mejor es ir directamente al panel de configuración "Servicios" y desde allí detener completamente el servicio de publicación en Internet, y luego reiniciarlo. Una forma de hacer este último paso es desde la consola de Windows, escribiendo: C:\>net stop iisadmin para detener el servicio C:\>net start w3svc para volverlo a iniciar 10. Hacer una página de prueba y acceder a ella. Por ejemplo, abrimos un archivo nuevo con el Notepad y escribimos en él lo siguiente: <HTML> <HEAD> <TITLE>Página de prueba de instalación de PHP</TITLE> </HEAD> <BODY> <? phpinfo(); ?> </BODY> </HTML> Guardarlo como prueba.php en la carpeta de publicación. Para probarla abrimos un navegador y en la barra de URL escribimos (suponiendo que nuestro directorio virtual se llama phphome : http://localhost/phphome/prueba.php 11. Maldecirme si no funciona Nota: Si no queremos utilizar autentificación de usuarios HTTP (HTTP-Auth) deberíamos saltarnos el paso 7 (instalación de filtros ISAPI) PHP » Artículos sobre PHP » PHP Perfect Form Items v1.0 (Formularios sin errores) PHP Perfect Form Items v1.0 (Formularios sin errores) Por Jose Carlos García ¿Cuántas veces que hemos necesitado integrar código PHP con elementos de formularios, Artículos publicados: 1 hemos conseguido una mezcla de HTML y Valoración media: 3.6/5 etiquetas <?php ?> disminuyendo la legibilidad del Usuario desde: 11/12/2004 código o haciendo que tengamos que escribir más lineas de la cuenta? Con estas sencillas pero útiles funciones podremos sin problemas emplazar campos a los formularios que diseñemos sin tantos quebraderos de cabeza. Las funciones que se explican en este artículo se encuentran en la siguiente dirección http://www.distintiva.com/jose/_perf_form/perf_form.zip. El código puede ser cambiado, mejorado y distribuido libremente. Ha sido programado totalmente por Jose Carlos García de Distintiva Solutions (www.distintiva.com). Empecemos con el ejemplo más difícil y el causante de que tuviera que programar estas funciones. <SELECT> Crear elementos de selección <select></select> Con php es muy habitual trabajar con arrays, ya sea con datos que nos proporcione una consulta SQL o simples valores. Veamos un ejemplo en el que queremos mostrar un <select> para que el usuario seleccione su rango de edad: <select name="edad"> <option value=0>Seleccione</option> <option value=1>Entre 0-18</option> <option value=2>Entre 19-30</option> <option value=3>Entre 31-50</option> <option value=4>Más de 50</option> <select/> Esto se complica cuando hay que hacerlo de forma dinámica ya que esta lista puede variar, para evitar tener que cambiar el HTML “a pelo” ya que necesitamos construir este fragmento de HTML con un bucle, etc. Se complica aún más cuando una opción debe estar preseleccionada. La función que nos salvará la vida es: frm_select($name, $arr_txt, $arr_vals, $default='', $extra_tag='') $name = Nombre del elemento del formulario $arr_txt = Array con los textos a mostrar $arr_vals = Array con los valores asociados a cada texto $default= [opcional] si se indica el valor aparecerá preseleccionado dicha opción $extra_tag= [opcional] por si necesitamos incluir información adicional al select, como por ejemplo $extra_tag=” class=cssazul ” o $extra_tag=” onChange=alert()” Ejemplo: $arr_txt=array(‘españa’, ‘portugal’, ‘francia’); $arr_vals=array(‘ES’, ‘PT’, FR’); <?=frm_select (‘paises’, $arr_txt, $arr_vals) ?> De esta forma cualquier modificación sólo hay que hacerla en los arrays sin alterar la parte visual. A veces es conveniente conservar el valor de un campo del formulario entre llamadas o posts del mismo por ejemplo cuando estamos validando entradas y hay que volver al formulario para que rellene algún campo requerido. Para hacer esto de forma sencilla tan solo tenemos que usar el parámetro $default de la siguiente forma: <?=frm_select (‘paises’, $arr_txt, $arr_vals, $_POST[‘paises’]) ?> (o $_GET dependiendo el método que usemos en nuestro formulario) <SELECT> (tipo lista con varios elementos visibles) Funciona exactamente igual que el anterior pero en este caso tenemos la típica lista de selección con scroll mostrando X elementos. La función es: frm_list($name,$size, $arr_txt, $arr_vals, $default='', $extra_tag='') En este caso el nuevo parámetro es $size que indica cuántos elementos serán mostrados visiblemente en la lista. <SELECT> (tipo lista con varios elementos visibles y con multiselección) Igual que el ejemplo anterior pero permitimos que el usuario seleccione uno o varios elementos de la lista con el CTRL+Click o SHIFT+Click La función es: frm_list_multi($name, $size, $arr_txt, $arr_vals, $default='', $extra_tag='') ... Y también tenemos funciones correspondientes para los demás elementos de formulario aprovechando la capacidad de mantener el valor entre posts. <CHECKBOX> No hace falta decir para que sirven estos elementos. La función es: frm_check($name, $ck_val, $var_in='', $extra_tag='') $name= Nombre del campo $ck_val= Valor que se enviará cuando esté seleccionado $var_in=[opcional] Funciona como el $default y permitirá que se muestre checkeado Ejemplo: Se muestra un checkbox que se mantiene seleccionado entre posts del formulario <?= frm_check(‘fumador’, ‘SI’, $_POST[‘fumador’])?> <RADIO> En este caso para mostrar radiobuttons se hace exactamente como el caso anterior pero con la siguiente función: frm_radio($name, $val, $var_in='', $extra_tag='') <INPUT> Permite mostrar cuadros de texto con las ventajas que voy ofreciendo en todas las funciones y para ello hay que usar: frm_text($name, $val, $size, $max_length, $extra_tag='') $name = Nombre del campo $val = Valor o texto que se mostrará (funciona como el $default de las otras funciones) $size = Tamaño del campo de texto $max_length = Longitud máxima permitida <PASSWORD> El caso es exactamente como el anterior pero esta vez oculta el texto con asteriscos. frm_password($name, $val, $size, $max_length, $extra_tag='') La directiva register_globals en PHP Por Joaquin Gracia 4.2.0 A partir de la versión de PHP 4.2.0 el valor por defecto de la directiva register_globals es off. El por qué de este cambio viene motivado por un aumento del nivel de seguridad en la configuración Artículos publicados: 7 del PHP por defecto. Pero esto puede provocar Valoración media: 3.72/5 que nuestras páginas dejen de funcionar. Usuario desde: 20/06/1998 La directiva register_globals cuando esta activada (estado que estaba por defecto antes de la versión 4.2.0 de PHP), provoca que automáticamente se generen variables globales para cookies y valores enviados por get y post entre otros. Por ejemplo: Si llamábamos a una página con http://www.internet.com/prueba.php?var1=4, esto provocaba que en la página prueba.php automáticamente se generase la variable $var1 con el valor 4. Por razones de seguridad este comportamiento automático se ha cambiado, estableciendo el valor por defecto de register_globals a off. Este cambio puede producir que nuestras antiguas páginas dejen de funcionar, ante esto tenemos dos opciones: Activar el register_globals a on. Dejar register_globals a off y cambiar nuestras páginas por las referencias adecuadas a cada caso. Esta es la opción más recomendable. ¿Cómo debemos hacer este cambio? Debemos buscar todas aquellas variables que son definidas automáticamente, variables del servidor, que provienen de get o post, cookies, files, variables de entorno o sesión. Reemplazar esas variables por las referencias adecuadas en cada caso, en PHP se han definido unos arrays diferentes con valores, dependiendo del lugar de procedencia. Así tenemos los arrays $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV, $REQUEST y $_SESSION. Si por ejemplo teníamos el siguiente script: print "Su edad: ".$edad; //cookie print "Navegador: ".$HTTP_USER_AGENT; print "Variable: ".$var; //variable de get Deberíamos reemplazarlas por: print "Su edad: ".$_COOKIE['edad']; //cookie print "Navegador: ".$_SERVER['HTTP_USER_AGENT']; print "Variable: ".$_GET['var']; //variable de get PHP orientado a objetos. Parte I Por Carlos Gallús Artículos publicados: 3 La mayoría de los lenguajes de programación Valoración media: 3.72/5 modernos son orientados a objetos ( abreviado Usuario desde: 01/08/2002 OO ) o en su defecto se aproximan mucho a éstos permitiendo algunas de sus características como es el caso de PHP. La programación OO principalmente hace uso de clases, objetos, relaciones, instancias, propiedades y métodos. Objetos y clases Cuando hablamos de software OO los objetos casi siempre son elementos físicos, como puede ser un cliente, proveedor, etc. o elementos conceptuales que existen en el entorno software, por ejemplo un objeto encargado del mantenimiento de archivos. El objetivo es representar a éstos elementos de la vida real y a los conceptuales como unidades de software. La programación OO esta pensada para construir objetos que contienen atributos y operaciones de manera que cubran nuestras necesidades. Los atributos son variables que contienen información del estado de un objeto. Y las operaciones también conocidas como métodos, funciones y acciones realizan modificaciones del propio objeto o realizan alguna acción externa a éste. Una de las principales ventajas de la programación OO es el concepto de encapsulación, conocido también como protección de datos, mediante el cual solo se pueden modificar los datos de un objeto accediendo a través de sus métodos u operaciones (interfaz del objeto). Nunca se pueden modificar directamente desde la aplicación principal. La funcionalidad de un objeto esta sujeta a los datos que este maneja, una ventaja de usar objetos es que podemos modificar la funcionalidad de éste, añadir mejoras o corregir errores sin necesidad de cambiar su interfaz. Ya que en caso contrario un proyecto estaría sujeto a un mayor número de fallos y los cambios serían más costosos. En algunas áreas de la programación de aplicaciones Web el uso de la programación OO está desestimada, usándose una metodología estructurada basada en funciones, esto es debido a que determinados proyectos no son lo suficientemente extensos como para aplicarles una metodología OO. En la programación OO los objetos son únicos y son instancias a una clase determinada. En principio se define la clase con los atributos y métodos correspondientes y luego se crea el objeto que esta basado en una determinada clase (esto se conoce como instancia). Se puede comparar a un objeto con una variable y la clase sería un tipo de dato definido por nosotros. Cómo crear clases, atributos y operaciones en PHP Hasta ahora hemos hablado de las clases de una forma conceptual, a continuación veremos como se crean, para crear una clase en PHP usaremos la palabra reservada class. La estructura mínima de una clase es la siguiente: class NombreClase { } Para que una clase sea útil, necesita atributos y operaciones. Podemos crear atributos como si de variables se trataran, con la palabra reservada var class NombreClase { var $atributo1; var $atributo2; } Podemos crear métodos declarando funciones dentro de la definición de la clase, el siguiente código crea una clase llamada NombreClase con dos operaciones que no hacen nada. A metodo1 no le pasamos ningún parámetro y a metodo2 le pasamos dos parámetros. class NombreClase { function metodo1() { } function metodo2($param1, $param2) { } } PHP orientado a objetos. Parte II Qué es el constructor de una clase Por Carlos Gallús Artículos publicados: 3 Valoración media: 3.72/5 Usuario desde: 01/08/2002 Las clases soportan un tipo de función especial que se conoce como constructor. El constructor es llamado cuando se crea el objeto. Normalmente utiliza para inicializar tareas como: asignación de valores a determinados atributos, crear nuevos objetos necesarios para el correcto funcionamiento de el objeto, etc. El constructor se declara de la misma forma que los métodos, lo único que debemos tener en cuenta es que debe tener el mismo nombre que la clase. A pesar de que nosotros podemos llamar a el constructor, su principal propósito es ser llamado automáticamente cuando un objeto es creado. A continuación veremos como se declara el constructor de una clase: class NombreClase { function NombreClase($param) { echo "Constructor llamado con el parámetro $param"; } } Cómo usar objetos, instanciar una clase Después de haber declarado una clase, ya podemos usarla creando un objeto que es una instancia a esa clase como ya se ha mencionado anteriormente. Es muy importante que esto quede claro, los objetos son instancias a una clase, por lo tanto cada objeto es único. En php creamos un objeto usando la palabra reservada new. También debemos indicar a que clase va a instanciar el objeto que creemos y pasarle los parámetros (si los requiere) al constructor, en el siguiente código vamos a ver un ejemplo de esto, para ello tomamos como referencia la clase anterior NombreClase: $a = new NombreClase("Primero"); $b = new NombreClase("Segundo"); $c = new NombreClase(); Como resultado de este código vemos que el constructor es llamado cada vez que se crea el objeto, y vemos que los objetos son únicos aunque sean instancias de la misma clase, el resultado es el siguiente: Constructor llamado con el parámetro Primero Constructor llamado con el parámetro Segundo Constructor llamado con el parámetro Cómo usar los atributos de una clase Una clase, tiene un puntero especial al que podemos referenciar como $this. Si nuestra clase tiene un atributo llamado $atributo, podemos hacer referencia a este desde nuestra clase (métodos) de la siguiente forma $this->atributo, a continuación podemos ver el código de ejemplo del acceso a un atributo de clase desde un método de la propia clase. class NombreClase { var $atributo; function metodo($param) { $this->atributo = $param; echo $this->atributo; } } Algunos lenguajes permiten limitar el acceso desde fuera a los atributos de una clase declarándolos como privados o protegidos ("private", "protected"). PHP no soporta esta característica y todos atributos y métodos pueden ser vistos desde fuera de la clase, lo que quiere decir que siempre son públicos. Podemos realizar la misma acción que anteriormente desde fuera de la clase, usando esta sintaxis. NombreClase { var $atributo; } $a = new NombreClase(); $a->atributo = "valor"; echo $a->atributo; Las sentencias anteriores están permitidas en PHP, pero no es una práctica recomendable acceder directamente a los atributos de una clase desde fuera de ésta. Como se ha comentado anteriormente una de las ventajas de la POO es que permite realizar encapsulación por esta razón aunque PHP no permita ocultar los atributos o métodos de una clase, nosotros deberíamos no acceder directamente a ellos, para diferenciarlos de los públicos es conveniente también poner "m_" (de miembro lo cual significa que solo serán usados dentro de la clase) delante de los nombres de métodos y atributos a los cuales no se quiera acceder directamente desde fuera de la clase. Para los atributos que queramos acceder directamente desde fuera de la clase, deberíamos escribir funciones de acceso, tanto para establecer como para coger valores. Deberíamos tener un código como el siguiente: class NombreClase { var $atributo; function get_atributo() { //devuelve el valor de atributo return $this->atributo; } function set_atributo($valor_nuevo) { //establece el valor de atributo $this->atributo = $valor_nuevo; } } La finalidad de hacer esto, es clarificar el código y tener una sección de código encargada de acceder a los atributos para mantener la encapsulación, y que no sean accedidos directamente. Además si seguimos estas prácticas aumentará la calidad de nuestro software ya que podremos introducir comprobaciones de datos, como rangos, valores permitidos, etc. Veamos un ejemplo de validación de datos a la hora de asignar un valor a atributo mediante el método set_atributo: function set_atributo($valor_nuevo) { if ($valor_nuevo > 100) { $this->atributo = $valor_nuevo; } } En el código superior vemos que cuando queremos asignar a atributo valores inferiores a 100 no nos deja, y atributo seguirá manteniendo su valor. Cómo usar los métodos de una clase Los métodos de una clase se pueden llamar de la misma forma que se llaman a los atributos, supongamos que tenemos la siguiente clase: class nombreClase { function metodoa() { return "Has llamado al método A"; } function metodob($parametro1) { return "Método B llamado con parámetro: ".$paramtro1; } } Creamos un objeto de la case nombreClase con el nombre $obj de la siguiente forma: $obj = new nombreClase(); Los métodos de un objeto, son llamados de la misma forma que se llaman a funciones normales, pasándoles como es el caso de metodob el parámetro que necesiten. Como los métodos son funciones que pertenecen a un objeto, deberemos indicar en la llamada el objeto que los incluye, la forma de llamar a un método es idéntica a como llamamos a los atributos de un objeto. $obj->metodoa(); $obj->metodob("parámetro que pasamos"); Si nuestras operaciones, devuelven algún valor, lo capturamos asignándoselo a una variable, podemos ver el siguiente ejemplo $txt_retorno = $obj->metodob("Hola"); $txt_retorno contendrá la cadena de texto: "Metodo B llamado con parámetro: Hola" PHP orientado a objetos. Parte y III Qué es la Herencia en PHP y como implementarla Por Carlos Gallús Artículos publicados: 3 Valoración media: 3.72/5 Usuario desde: 01/08/2002 Como su nombre indica el concepto de herencia se aplica cuando creamos una clase, que va a heredar los métodos y atributos de una ya definida, entonces la clase que hemos creado es una subclase. Para que una clase sea subclase de otra ya creada deberemos usar la palabra reservada extends en el siguiente código podremos ver como creamos una clase llamada SubClaseA que heredará los métodos y atributos de una clase definida con anterioridad llamada ClaseA. class SubClaseA extends ClaseA { var $atributo2; function operacion2() { } } Tenemos la clase ClaseA que es definida de la siguiente forma: Class ClaseA { var $atributo1; function operacion1(){ } } Si creamos un objeto de la clase SubClaseA este heredará todos los métodos de la clase ClaseA, por lo tanto el siguiente código es válido: $x = new SubClaseA(); $x->operacion1(); $x->atributo1 = 100; $x->operacion2(); $x->atributo2 = 200; Como podemos observar aunque declaremos un objeto de la clase SubClaseA, al ser una clase extendida de ClaseA podemos hacer uso de todos los métodos y atributos definidos en ClaseA como si estuvieran contenidos en SubClaseA. Debemos tener en cuenta que la herencia solo trabaja en una dirección, la subclase o clase hija hereda las características de su clase padre o superclase, pero la clase padre no posee las características de la hija. Para el caso anterior ClaseA no tendría atributo2 ni metodo2(); Como sobrescribir métodos y atributos Como hemos visto anteriormente, una subclase declara atributos nuevos y operaciones sobre una superclase. Es posible y en muchos casos útil sobrescribir las mismas operaciones o atributos declarados en la superclase. Esto se hace para dar a un atributo un valor diferente en la subclase que el que tiene en la superclase o en el caso de las operaciones para cambiar la funcionalidad de estas. Veamos un ejemplo, por ejemplo si tenemos la clase A: class A { var $atributo = 'valor inicial' function operación() { echo 'Clase A:<br>'; echo 'El valor de \$atributo es $this->atributo<br>'; } } Queremos crear una subclase B y alterar el valor de atributo y la funcionalidad de operación de la clase A, entonces escribimos: Class B extends A { var $atributo = 'valor cambiado'; function operación() { echo 'Clase B:<br>'; echo 'El valor de \$atributo ahora es $this->atributo<br>'; } } Como podemos observar hemos definido una variable y una operación en B con el mismo nombre que tenían en A. Como se ha comentado anteriormente aunque declaremos B no afecta a la definición de A, y si creamos un objeto de la superclase A esté mantendrá sus valores originales. Solo sobrescribiremos los valores y funcionalidad de A cuando creemos un objeto de la clase B. A diferencia de otros lenguajes OO, PHP no nos permitirá sobrescribir una función o atributo y poder llamar a los valores de la clase padre. La herencia puede tener muchas capas de profundidad, por ejemplo podemos tener una clase C que es subclase de B y está última ser subclase de A, la subclase C heredará y sobrescribirá aquellos atributos y métodos de sus clases padres, en este caso A y B. ¿Soporta PHP la herencia múltiple? Algunos lenguajes OO soportan herencia múltiple, esto significa que una subclase puede heredar de varias clases padres. PHP no permite esto y una subclase solo puede heredar de una clase padre, sin embargo en PHP no hay ningún tipo de restricción en cuanto a el número de subclases que pueden heredar de una misma clase padre o superclase. Qué es el polimorfismo y como implementarlo Cualquier lenguaje de programación orientado a objetos debe soportar el polimorfismo, esto significa que clases diferentes tendrán un comportamiento distinto para la misma operación. Esto lo veremos más claro con el siguiente ejemplo. Supongamos que tenemos dos clases distintas coche y ciclomotor. Ambas tienen sus propios métodos de movimiento, éstos tienen diferentes comportamientos, pero su nombre es el mismo class coche { function avanza() { } function para() { } function girar_derecha() { } } class ciclomotor { function avanza() { } function para() { } function girar_derecha() { } } Como podemos observar, ambas clases tienen los mismos métodos, supongamos ahora que tenemos otra clase que controla el movimiento de todos los vehículos, es aquí donde entra en juego el polimorfismo, que dependiendo del objeto que tratemos actuará de una forma u otra el método al que llamamos. class movimiento { function mover_adelante($obj) { $obj->avanza(); } } Supongamos que queremos mover cualquier vehículo hacia adelante entonces haríamos: $obj_coche = new coche(); $obj_ciclomotor = new ciclomotor(); $obj_movimiento = new movimiento(); // con esta sentencia el coche avanzaria hacia adelante. $obj_movimiento->mover_adelante($obj_coche); // con esta sentencia el ciclomotor avanzaría hacia adelante. $obj_movimiento->mover_adelante($obj_ciclomotor); Como podemos ver el mismo método del objeto movimiento actúa de dos formas diferentes dependiendo del objeto que le pasamos como parámetro. Conexión a SQL Server A continuación voy a explicar como configurar el PHP bajo windows para conectarse con una base de datos MS SQL Server. Conseguir las DLLs Por Joaquin Gracia Artículos publicados: 7 Valoración media: 3.72/5 Usuario desde: 20/06/1998 Lo primero que nos hace falta es conseguir las DLLs para conectarnos a un SQL Server, por defecto estas DLLs no van en el paquete de instalación automática, así que tendrás que bajar, si no lo tienes ya, el paquete con la instalación completa. Descomprime el paquete con la distribución completa y busca el fichero "php_mssql.dll" que está dentro del directorio "extensions", copia este fichero al directorio "dlls" en donde tengas instalado el PHP. Editar el PHP.ini Ahora hay que decirle al PHP que tiene una librería nueva y que la debe usar. Así que editaremos el PHP.ini con el Notepad, normalmente el PHP.ini está en el directorio C:\WINNT. Busca la línea en la que pone "extension_dir = " y modifícala para que apunte al directorio donde hemos copiado la DLL. Con esto le indicamos al PHP donde están las DLL de extensión. Ahora busca la línea ";extension=php_mssql.dll" y modifícala quitándole el ";" del principio. Graba el fichero PHP.ini y ya está. Ejemplo de conexión Solo nos queda probar que funciona la conexión con el servidor SQL Server, para ello vamos a conectarnos con la base de datos “Northwind” que viene como ejemplo en la instalación de SQL Server. Listaremos el nombre del producto y el precio de la tabla productos. $conectID = mssql_connect("NombreServidor","SA",""); mssql_select_db("Northwind"); $result=mssql_query("select * from products",$numero ); while ($row=mssql_fetch_array($result)) { $counter++; $c1=$row["ProductName"]; $c2=$row["UnitPrice"]; echo ("$counter c1: $c1 c2: $c2\n"); } mssql_close($conectID); Formateado, conversiones y fechas Calendario pequeño Código <?PHP ##InstaCalendar ##Written by Marcos Ojeda 11.July.2000 #Fill in default,today values accordingly as well as font... #$month can be changed, but not $textmonth ## "Remember who loves you, baby!" --Kojack $fontfamily = isset($fontfamily) ? $fontfamily : "Tahoma, Geneva, sans-serif"; $defaultfontcolor = isset($defaultfontcolor) ? $defaultfontcolor : "#000000"; $defaultbgcolor = isset($defaultbgcolor) ? $defaultbgcolor : "#FFFFFF"; $todayfontcolor = isset($todayfontcolor) ? $todayfontcolor : "#FFFFFF"; $todaybgcolor = isset($todaybgcolor) ? $todaybgcolor : "#CC0000"; $monthcolor = isset($monthcolor) ? $monthcolor : "#333399"; $relfontsize = isset($relfontsize) ? $relfontsize : "1"; $cssfontsize = isset($cssfontsize) ? $cssfontsize : "8pt"; $month = (isset($month)) ? $month : date("n",time()); $monthnames = array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"); $textmonth = $monthnames[$month - 1]; $year = (isset($year)) ? $year : date("Y",time()); $today = (isset($today))? $today : date("j", time()); ## Make $today really big to avoid hilite $today = ($month == date("n",time())) ? $today : 32; if ( (($month < 8) && ($month % 2 == 1)) || (($month > 7) && ($month % 2 == 0)) ) $days = 31; if ( (($month < 8) && ($month % 2 == 0)) || (($month > 7) && ($month % 2 == 1)) ) $days = 30; if ($month == 2) $days = (date("L",time())) ? 29 : 28; $dayone = date("w",mktime(1,1,1,$month,1,$year)); $daylast = date("w",mktime(1,1,1,$month,$days,$year)); ?> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td bgcolor="<?PHP echo $defaultbgcolor ?>" colspan="7" valign="middle" align="center"><font color="<?php echo $monthcolor ?>" face="Arial, Helvetica, sans-serif" size="3"><b><?PHP echo $textmonth ?></b></font></td> </tr> <tr> <td bgcolor="<?PHP echo $defaultbgcolor ?>" valign="middle" align="center" width="15%"><font face="<?PHP echo $fontfamily ?>" size="1"><b>Sun</b></font></td> <td bgcolor="<?PHP echo $defaultbgcolor ?>" valign="middle" align="center" width="14%"><font face="<?PHP echo $fontfamily ?>" size="1"><b>Mon</b></font></td> <td bgcolor="<?PHP echo $defaultbgcolor ?>" valign="middle" align="center" width="14%"><font face="<?PHP echo $fontfamily ?>" size="1"><b>Tue</b></font></td> <td bgcolor="<?PHP echo $defaultbgcolor ?>" valign="middle" align="center" width="14%"><font face="<?PHP echo $fontfamily ?>" size="1"><b>Wed</b></font></td> <td bgcolor="<?PHP echo $defaultbgcolor ?>" valign="middle" align="center" width="14%"><font face="<?PHP echo $fontfamily ?>" size="1"><b>Thu</b></font></td> <td bgcolor="<?PHP echo $defaultbgcolor ?>" valign="middle" align="center" width="14%"><font face="<?PHP echo $fontfamily ?>" size="1"><b>Fri</b></font></td> <td bgcolor="<?PHP echo $defaultbgcolor ?>" valign="middle" align="center" width="15%"><font face="<?PHP echo $fontfamily ?>" size="1"><b>Sat</b></font></td> </tr> <?PHP if($dayone != 0) $span1 = $dayone; if(6 - $daylast != 0) $span2 = 6 - $daylast; for($i = 1; $i <= $days; $i++): $dayofweek = date("w",mktime(1,1,1,$month,$i,$year)); $width = "14%"; if($dayofweek == 0 || $dayofweek == 6) $width = "15%"; if($i == $today): $fontcolor = $todayfontcolor; $bgcellcolor = $todaybgcolor; endif; if($i != $today): $fontcolor = $defaultfontcolor; $bgcellcolor = $defaultbgcolor; endif; # if($i == putdayhere): #use this for *special* days of the month, can be set ahead as well w/ &&... # $fontcolor = puthexcolorhere; # $bgcellcolor = puthexcolorhere; # endif; if($i == 1 || $dayofweek == 0): echo " <tr bgcolor="$defaultbgcolor"> "; if($span1 > 0 && $i == 1) echo " <td align="left" bgcolor="$defaultbgcolor" colspan="$span1"><font face="null" size="1">&nbsp;</font></td> "; endif; /*Save this until supported <td valign="middle" align="center" width="<?PHP echo $width ?>" style="background:<?PHP echo $bgcellcolor ?>;font-family:<?PHP echo $fontfamily ?>;color:<?PHP echo $fontcolor ?>;font-size:7pt"><?PHP echo $i ? ></td> */ ?> <td bgcolor="<?PHP echo $bgcellcolor ?>" valign="middle" align="center" width="<?PHP echo $width ?>"><font color="<?PHP echo $fontcolor ?>" face="<?PHP echo $fontfamily ?>" size="1"><?PHP echo $i ?></font></td> <?PHP if($i == $days): if($span2 > 0) echo " <td align="left" bgcolor="$defaultbgcolor" colspan="$span2"><font face="null" size="1">&nbsp;</font></td> "; endif; if($dayofweek == 6 || $i == $days): echo " </tr> "; endif; endfor; ?> </table> Calendario [Español] Estuvo originalmente escrito para funcionar en una pagina en la que se llegaba a reservar tiempo de maquina, en un local de estudiantes. Asi se hacia importante que el la distribucion de un dia estuviera disponible, por eso el script se llama a si mismo con una fecha como parametro, el script al que llama esta declarado en una variable: $_PHP_LINK y la fecha se pasa en el url como $Day. Se basa en emplear la funcion de linux 'cal', y luego se saca de alli lo que nos interesa para llenar el calendario. Código <? $_PHP_LINK = $PHP_SELF; $meses = array(1=>"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"); $WeekDays = array ( 0=> "Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"); $fontb = "<font color=#FFFFFF>" ; $fonte = "</font>"; if (!isset($Day)) { $month = date ("n"); $year = date ("Y"); $Day = time(); } else { $month = date ("n", $Day); $year = date ("Y", $Day); } $output = `cal $month $year`; $starter = date ("w", mktime (0, 0, 0, $month,1, $year)); $strings = split ("n", $output); ?> <html> <style type="text/css"> <!-- a:hover { color: #FF0000; text-decoration: none} a:link { text-decoration: none} a:visited { text-decoration: none} .small_letter { font-size: xx-small; color: #FFFFFF} --> </style> <title>Pequeño Calendario</title> <body> <table border="0" cellspacing="0" cellpadding="0"> <tr bgcolor="#3366CC"> <td bgcolor="#3366CC">&nbsp;&nbsp;</td> <td align=center class="small_letter" valign="top"> <? $NextMonth = mktime (0,0,0, date("n", $Day) + 1, date("j",$Day), date ("Y", $Day)); $PreviousMonth = mktime(0,0,0 , date("n",$Day)-1, date("j",$Day), date ("Y", $Day)); print("<a href="$_PHP_LINK?Day=$PreviousMonth">$fontb << $fonte</a>&nbsp;".$meses[date ("n", $Day)]. "&nbsp; <a href="$_PHP_LINK?Day=$NextMonth"> $fontb >>$fonte</a>"); ?> <? print("<table bgcolor="#FFFFFF" class="small_letter" >n <tr bgcolor="#3366CC" class="small_letter">"); $splited = split(" ", $strings[1]); $i=0; while (list ($k, $v) = each ($splited) ) { if ($v!='') print (" <td>&nbsp;".$WeekDays[$i]."&nbsp;</td>n"); $i++; } print ("</tr>n"); // Aqui termino de imprimir la primera fila con los dias de la semana print ("<tr>n"); for ($i=0; $i < $starter; $i++) { print (" <td bgcolor="#FFF6C0" align="center">&nbsp;</td>n"); } $splited = split(" ",trim ($strings[2])); while (list ($k, $v) = each ( $splited)) { $color =($v==date('j', $Day))?"#E0E0E0":"#FFF6C0"; $DayForLink = mktime ( 0, 0, 0, $month, $v, $year ); $link = "$_PHP_LINK?Day=$DayForLink"; if ($v!='') print ("<td bgcolor="$color" align="center"><a href="$link">".$v."</a></td>n"); } print ("</tr>n"); /*Aqui termino de imprimir la primera fila con los Numeros*/ $i=0; while (list ($k, $v ) = each ($strings)) { if ( $i++ > 2) { //print ("<tr>"); $lisbet = split (" ", $v); while (list ($k1, $v1) = each ($lisbet)) { $DayForLink = mktime ( 0, 0, 0, $month, $v1, $year ); $link = "$_PHP_LINK?Day=$DayForLink"; $color =($v1==date('j', $Day))?"#E0E0E0":"#FFF6C0"; if ($v1!='') print (" <td bgcolor="$color" align="center"><a href="$link">".$v1."</a></td>n"); } print ("</tr>n"); } } /* Fin de la impresion de los dias del mes */ print ("</table>"); ?> <? print ("<table class="small_letter" width="100%"> "); print ("<tr><td align="center" class="small_letter">"); // bgcolor=e0e0e0 $next= mktime ( 0, 0, 0, date("n",$Day), date ('j', $Day), $year+1 ); $back=mktime ( 0, 0, 0, date("n",$Day), date ('j', $Day), $year -1 ); print ("<a href="$_PHP_LINK?Day=$back"> $fontb << $fonte</a>&nbsp; $year&nbsp;<a href="$_PHP_LINK?Day=$next">$fontb >> $fonte</a>"); print ("</td></tr></table>"); ?> </td> <td bgcolor="#3366CC">&nbsp;&nbsp; </td> </tr> </table> </body> </html> PHP » Manual de PHP » Ejemplos Prácticos Formateo de página En este ejemplo vamos a usar el PHP y la capacidad de definir librerías para conseguir que todas nuestras páginas tengan el mismo formato de página, incluyendo las partes comunes en librerías. Así mismo modificando la librería modificaríamos tambien todas las páginas de una manera muy rápida. libpagina.phtml <!-- Manual de PHP de WebEstilo.com --> <?php function CabeceraPagina() { ?> <FONT SIZE="+1">Esta cabecera estará en todas sus páginas.</FONT><BR> <hr> <? } function PiePagina() { ?> <hr> <FONT SIZE="-1">Este es el pie de página.</FONT><BR> Autor: Joaquin Gracia <? } function Indice() { ?> <A HREF="ejem06a.phtml">Pagina 1</A><BR> <A HREF="ejem06a2.phtml">Pagina 2</A><BR> <? } ?> ejem06a.phtml <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php include("libpagina.phtml") ?> <?php CabeceraPagina(); ?> <TABLE> <TR> <TD><?php Indice() ?></TD> <TD> Esta es otra página<BR><BR> completamente distinta<BR><BR> pero comparte el pie y la cabecera con la otra.<BR><BR> </TD> </TR> </TABLE> <?php PiePagina(); ?> </body> </html> ejem06a2.phtml <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <?php include("libpagina.phtml") ?> <?php CabeceraPagina(); ?> <TABLE> <TR> <TD><?php Indice() ?></TD> <TD> Página 1 <BR><BR><BR><BR><BR> Contenido blalbl blalb alb<BR><BR> más cosas...<BR><BR> fin<BR><BR> </TD> </TR> </TABLE> <?php PiePagina(); ?> </body> </html> Enlace externo con frame Con este ejemplo damos solución al problema de los enlaces externos y de forma que la web externa queda en la parte inferior del frame y así no se sale de nuestra web. ejem06b.html <!-- Manual de PHP de WebEstilo.com --> <html> <head> <title>Ejemplo de PHP</title> </head> <body> <A HREF="ejem06b2.phtml? dire=http://www.webestilo.com">www.webestilo.com</A><BR><BR> <A HREF="ejem06b2.phtml?dire=http://www.terra.es">www.terra.es</A> </body> </html> ejem06a2.phtml <!-- Manual de PHP de WebEstilo.com --> <!-- frames --> <FRAMESET ROWS="100,*"> <FRAME NAME="arriba" SRC="ejem06b3.html" MARGINWIDTH="10" MARGINHEIGHT="10" SCROLLING="auto" FRAMEBORDER="0"> <FRAME NAME="abajo" SRC="<?php echo $dire ?>" MARGINWIDTH="10" MARGINHEIGHT="10" SCROLLING="auto" FRAMEBORDER="0"> </FRAMESET>