Beruflich Dokumente
Kultur Dokumente
CREATEDATABASEbatman;
Ahora crear una tabla para guardar los personajes de esta serie:
CREATETABLEpersonaje(
idtinyint(3)unsignednotnullauto_incrementprimarykey,
nombrevarchar(255)notnull,
descripciontextnotnull
)
Bueno, hasta ac nada nuevo, cre una base de datos con una sola tabla que
guardar los nombres y una descripcin de los personajes, y por supuesto
tendr un id o clave primaria.
Ahora, para probar mis consultas crear dos clases. Una ser una clase para
conectarse a la base de datos, la misma que us en el posteo anterior:
<?php
classConexionextendsPDO{
private$tipo_de_base='mysql';
private$host='localhost';
private$nombre_de_base='batman';
private$usuario='root';
private$contrasena='';
publicfunction__construct(){
//SobreescriboelmtodoconstructordelaclasePDO.
try{
parent::__construct($this>tipo_de_base.':host='.$this
>host.';dbname='.$this>nombre_de_base,$this>usuario,$this
>contrasena);
}catch(PDOException$e){
echo'Hasurgidounerrorynosepuedeconectaralabasede
datos.Detalle:'.$e>getMessage();
exit;
}
}
}
?>
Y luego crear una segunda clase que se encargar de todo lo referido con
consultas con la tabla de personajes que se llame Personaje, en la misma
carpeta de la clase Conexion. Pero antes de mostrarles el cdigo paremos aqu.
<?php
require_once'Conexion.php';
classPersonaje{
private$id;
private$nombre;
private$descripcion;
constTABLA='personaje';
publicfunction__construct($nombre,$descipcion,$id=null){
$this>nombre=$nombre;
$this>descripcion=$descipcion;
$this>id=$id;
}
}
?>
<?php
require_once'Conexion.php';
classPersonaje{
private$id;
private$nombre;
private$descripcion;
constTABLA='personaje';
publicfunctiongetId(){
return$this>id;
}
publicfunctiongetNombre(){
return$this>nombre;
}
publicfunctiongetDescripcion(){
return$this>descripcion;
}
publicfunctionsetNombre($nombre){
$this>nombre=$nombre;
}
publicfunctionsetDescripcion($descripcion){
$this>descripcion=$descripcion;
}
publicfunction__construct($nombre,$descipcion,$id=null){
$this>nombre=$nombre;
$this>descripcion=$descipcion;
$this>id=$id;
}
publicfunctionguardar(){
$conexion=newConexion();
if($this>id)/*Modifica*/{
$consulta=$conexion>prepare('UPDATE'.self::TABLA.'SET
nombre=:nombre,descripcion=:descripcionWHEREid=:id');
$consulta>bindParam(':nombre',$this>nombre);
$consulta>bindParam(':descripcion',$this>descripcion);
$consulta>bindParam(':id',$this>id);
$consulta>execute();
}else/*Inserta*/{
$consulta=$conexion>prepare('INSERTINTO'.self::TABLA.'
(nombre,descripcion)VALUES(:nombre,:descripcion)');
$consulta>bindParam(':nombre',$this>nombre);
$consulta>bindParam(':descripcion',$this>descripcion);
$consulta>execute();
$this>id=$conexion>lastInsertId();
}
$conexion=null;
}
}
?>
Ok, analicemos los cambios. En primer lugar agregu los mtodos getters y
setters que me estaban faltando, luego cre un mtodo guardar() que primero
crea un objeto Conexion, para as luego por medio de ese objeto poder
conectarse a la base de datos:
$conexion=newConexion();
Luego pregunt por el valor del id mediante un if, si el valor es cualquier cosa
que no sea 0, false o null entonces entrar en el lado verdadero del
condicional. Esto sirve para indicarle a nuestro mtodo si tendr que hacer
un update o un insert, si el valor del id esalgo significa existe un id, por ende
se est modificar un usuario con ese valor, de lo contrario se est intentando
insertar un usuario nuevo.
$consulta=$conexion>prepare('UPDATE'.self::TABLA.'SETnombre=
:nombre,descripcion=:descripcionWHEREid=:id');
$consulta>bindParam(':nombre',$this>nombre);
$consulta>bindParam(':descripcion',$this>descripcion);
$consulta>bindParam(':id',$this>id);
$consulta>execute();
El lado falso del if, osea el que sirve para insertar un nuevo registro es muy
parecido al del update, slo cambia la consulta (obviamente) y que no debe
pasarle el valor del id, porque como dijimos antes, en el INSERT no hay id, sino
que se auto incrementa en la consulta.
$this>id=$conexion>lastInsertId();
$conexion=null;
<?php
require_once'clases/Personaje.php';
$persona=newPersonaje('Batman','Encapuchado,disfrazadodemurcilago
quesaleporlasnochesacombatirelmal.',1);
$persona>guardar();
echo$persona>getNombre().'sehaguardadocorrectamenteconelid:
'.$persona>getId();
?>
Saludos!
Anterior: Php orientado a objetos, parte 10: PDO, Conectarse a una base de
datos
Siguiente: Php orientado a objetos, parte 12: PDO, Buscar registros en una base
de datos
Consultas a bases de datos desde PHP
con PDO
por Jose el 01/07/2012
Si el desarrollo de tus aplicaciones lo haces con PHP usando como base de datos
MySql y no utilizas ningn tipo de framework, seguramente las consultas a la base
de datos las realizars con el API de mysql. Un ejemplo del uso de este API es el
siguiente:
?
1
$con = mysql_connect('localhost', 'user', pass');
2
3 mysql_select_db('nombreBaseDatos');
4 $sql = 'SELECT * FROM tabla';
5
6 $res = mysql_query($sql);
7
8 while( $row = mysql_fetch_array($res) )
echo $row['titulo'];
9
10 mysql_free_result($res);
11 mysql_close($con);
12
Si este es tu caso, deberas saber que ests usando una API obsoleta y
desaconsejada por el equipo de PHP. En su lugar deberas usar el API de mysqli o
mejor an PDO (PHP Data Objects). Utilizando PDO podemos solventar muchas
dificultades que surgen al utilizar la API de mysql. Un par de ventajas que se
obtienen con PDO es que el proceso de escapado de los parmetros es sumamente
sencillo y sin la necesidad de estar atentos a utilizar en todos los casos funciones
para este cometido como mysql_real_escape_string(). Otra ventaja es que PDO es
una API flexible y nos permite trabajar con cualquier tipo de base de datos y no
estar restringidos a utilizar MySql.
Veamos como podemos utilizar PDO en una aplicacin para recuperar datos de una
base de datos MySql y ver lo sencillo que es usar esta API. Lo primero que tenemos
que hacer es realizar la conexin a la base de datos. La conexin la realizaremos
con el constructor de la clase de la siguiente forma:
?
1 $con = new PDO('mysql:host=localhost;dbname=nombreBaseDatos', 'user', 'pass');
Con la llamada anterior ya tenemos creada la conexin a la base de datos. Antes de
continuar voy a explicar como tratar los posibles errores con PDO. Por defecto PDO
viene configurado para no mostrar ningn error. Es decir que para saber si se ha
producido un error, tendramos que estar comprobando los
mtodos errorCode() y errorInfo(). Para facilitarnos la tarea vamos a habilitar
las excepciones. De esta forma cada vez que ocurra un error saltar una excepcin
que capturaremos y podremos tratar correctamente para mostrarle un mensaje al
usuario. Para realizar esta tarea utilizaremos la funcin setAttribute() de la
siguiente forma:
?
1 $con = new PDO('mysql:host=localhost;dbname=nombreBaseDatos', 'user', 'pass');
2 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?
1
try
2 {
3 $con = new PDO('mysql:host=localhost;dbname=nombreBaseDatos', 'user', 'pass');
4 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
5 }
6 catch(PDOException $e)
{
7 echo 'Error conectando con la base de datos: ' . $e->getMessage();
8 }
9
Ahora que sabemos como conectarnos a la base de datos, vamos a crear una
sentencia para poder recuperar datos. Para ejecutar sentencias podemos utilizar la
llamada a query() o bien la llamada a prepare(). Aunque tenemos disponibles las
dos llamadas es mucho ms seguro utilizar la llamada a prepare() ya que esta se
encarga de escapar por nosotros los parmetros y nos asegura que no sufriremos
problemas de SQL Injection. La funcin query() se suele utilizar cuando la
sentencia que vamos a ejecutar no contiene parmetros que ha enviado el usuario.
Veamos un ejemplo utilizando la funcin query():
?
1
2 try
3 {
$con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
4 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
5
6 $datos = $con->query('SELECT nombre FROM personal');
7 foreach($datos as $row)
8 echo $row[0] . '<br/>';
}
9 catch(PDOException $e)
10 {
11 echo 'Error conectando con la base de datos: ' . $e->getMessage();
12 }
13
Si a pesar de las advertencias aun quieres ejecutar sentencias
con query() pasndole parmetros de usuarios, la forma correcta de hacerlo sera
escapando esos parmetros con la funcin quote()como se muestra a
continuacin:
?
1
$ape = 'Hernandez';
2
3 try
4 {
5 $con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
6 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
7
8 $datos = $con->query('SELECT nombre FROM personal WHERE apellidos like ' . $con-
>quote($ape));
9 foreach($datos as $row)
10 echo $row[0] . '<br/>';
11 }
12 catch(PDOException $e)
{
13 echo 'Error conectando con la base de datos: ' . $e->getMessage();
14 }
15
?
1 try
{
2 $con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
3 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
4
5 $stmt = $con->prepare('SELECT nombre FROM personal');
6 $stmt->execute();
7
8 while( $datos = $stmt->fetch() )
echo $datos[0] . '<br/>';
9 }
10 catch(PDOException $e)
11 {
12 echo 'Error: ' . $e->getMessage();
13 }
14
15
Como se ve, es realmente simple ejecutar consultas. Simplemente tenemos que
indicarle a la funcin prepare() la sentencia sql que queremos ejecutar. Esta
funcin nos devolver unPDOStatement sobre el cual ejecutaremos la
funcin fetch() para poder mostrar su valor.
?
1
$ape = 'Hernandez';
2
3
try
4 {
5 $con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
6 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
7
8 $stmt = $con->prepare('SELECT nombre FROM personal WHERE apellidos like
:apellidos');
9 $stmt->execute(array(':apellidos' => $ape ));
10
11 while( $datos = $stmt->fetch() )
12 echo $datos[0] . '<br />';
13 }
14 catch(PDOException $e)
{
15 echo 'Error: ' . $e->getMessage();
16 }
17
Como se ve hemos llamado al parmetro :apellidos y posteriormente en la llamada
a la funcinexecute() indicamos con un array asociativo el nombre del parmetro
y su valor. Otra forma de indicar los parmetros es utilizando la
funcin bindParam.
?
1 $ape = 'Hernandez';
2
try
3 {
4 $con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
5 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
6
7 $stmt = $con->prepare('SELECT nombre FROM personal WHERE apellidos like
8 :apellidos');
$stmt->bindParam(':apellidos', $ape, PDO::PARAM_INT);
9 $stmt->execute();
10
11 while( $datos = $stmt->fetch() )
12 echo $datos[0] . '<br />';
13 }
14 catch(PDOException $e)
{
15 echo 'Error: ' . $e->getMessage();
16
17 }
18
A la funcin bindParam() le pasamos el nombre del parmetro, su valor y
finalmente el tipo que es. Los tipos de parmetros que le podemos pasar los
podemos ver en las constantes predefinidas de PDO y son:
PDO::PARAM_BOOL
PDO::PARAM_NULL
PDO::PARAM_INT
PDO::PARAM_STR
PDO::PARAM_LOB
Ejemplo de insert:
?
1
2 $nom = 'Jose';
$ape = 'Hernandez';
3
4 try
5 {
6 $con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
7 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
8
$stmt = $con->prepare('INSERT INTO personal (nombre, apellidos) VALUES (:nombre
9
:apellidos)');
10
$rows = $stmt->execute( array( ':nombre' => $nom,
11 ':apellidos' => $ape));
12
13 if( $rows == 1 )
14 echo 'Insercin correcta';
15 }
catch(PDOException $e)
16 {
17 echo 'Error: ' . $e->getMessage();
18 }
19
Ejemplo de update:
?
1 $nom = 'Jose';
$ape = 'Hernandez';
2
3
try
4 {
5 $con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
6 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
7
8 $stmt = $con->prepare('UPDATE personal SET apellidos = :apellidos WHERE nombre
:nombre');
9
$rows = $stmt->execute( array( ':nombre' => $nom,
10
11
':apellidos' => $ape));
12 if( $rows > 0 )
13 echo 'Actualizacin correcta';
14 }
15 catch(PDOException $e)
{
16 echo 'Error: ' . $e->getMessage();
17 }
18
Ejemplo de delete:
?
1
2 $ape = 'Hernandez';
3
4 try
5 {
$con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
6 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
7
8 $stmt = $con->prepare('DELETE FROM personal WHERE apellidos = :apellidos');
9 $rows = $stmt->execute( array( ':apellidos' => $ape));
10
11 if( $rows > 0 )
echo 'Borrado correcto';
12
}
13 catch(PDOException $e)
14 {
15 echo 'Error: ' . $e->getMessage();
16 }
17
Para acabar con esta entrada sobre PDO vamos a ver otra de las funcionalidades
que nos aporta y que puede ser muy til. PDO nos permite realizar consultas y
mapear los resultados en objetos de nuestro modelo. Para ello primero tenemos
que crearnos una clase con nuestro modelo de datos.
?
1
class Usuario
2 {
3 private $nombre;
4 private $apellidos;
5
6 public function nombreApellidos()
7 {
return $this->nombre . ' ' . $this->apellidos;
8 }
9 }
10
Hay que tener en cuenta que para que funcione correctamente, el nombre de los
atributos en nuestra clase tienen que ser iguales que los que tienen las columnas
en nuestra tabla de la base de datos. Con esto claro vamos a realizar la consulta.
?
1
2 try
3 {
4 $con = new PDO('mysql:host=localhost;dbname=personal', 'user', 'pass');
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
5
6 $stmt= $con->prepare('SELECT nombre, apellidos FROM personal');
7 $stmt->execute();
8
9 $stmt->setFetchMode(PDO::FETCH_CLASS, 'Usuario');
10
11 while($usuario = $stmt->fetch())
echo $usuario->nombreApellidos() . '<br>';
12
13 }
14 catch(PDOException $e)
15 {
16 echo 'Error: ' . $e->getMessage();
17 }
18
La novedad que podemos ver en este script es la llamada al
mtodo setFetchMode() pasndole como primer argumento la constante
PDO::FETCH_CLASS que le indica que haga un mapeado en la clase que le
indicamos como segundo argumento, en este caso la clase Usuario que hemos
creado anteriormente. Despus al recorrer los elementos con fetch los resultados
en vez de en un vector los obtendremos en el objeto indicado.
Despus de todo esto solo me queda decir que si eres de los que todava sigues
usando la antigua API de mysql este es un buen momento para empezar a cambiar
y a usar una nueva API ms moderna y con mejores prestaciones.
o Conexin configurable
Desconexin con la base de datos
o Consultas preparadas
Ejemplos de consultas
Consultas en MySQL
Consultas en SQLite
Solucin configurable
o Consulta SELECT
Para conectar con la base de datos hay que crear una instancia de la
clase PDO, que se utiliza en todas las consultas posteriores. En cada
pgina php que incluya consultas a la base de datos es necesario
conectar primero con la base de datos.
Conexin configurable
// biblioteca.php
define("MYSQL", "MySQL"); // Base de datos
MySQL
define("SQLITE", "SQLite"); // Base de datos
SQLITE
$dbMotor = SQLITE; // Base de datos
empleada (MYSQL o SQLITE)
if ($dbMotor == MYSQL) {
require_once "biblioteca_mysql.php";
} elseif ($dbMotor == SQLITE) {
require_once "biblioteca_sqlite.php";
}
// biblioteca_mysql.php
function conectaDb()
{
try {
$db = new PDO(MYSQL_HOST, MYSQL_USUARIO,
MYSQL_PASSWORD);
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,
true);
return($db);
} catch(PDOException $e) {
cabecera("Error grave", MENU_PRINCIPAL);
print "<p>Error: No puede conectarse con la base de
datos.</p>\n";
print "<p>Error: " . $e->getMessage() . "</p>\n";
pie();
exit();
}
}
// biblioteca_sqlite.php
function conectaDb()
{
global $dbDb;
try {
$db = new PDO("sqlite:" . $dbDb);
return($db);
} catch(PDOException $e) {
cabecera("Error grave", MENU_PRINCIPAL);
print "<p>Error: No puede conectarse con la base de
datos.</p>\n";
print "<p>Error: " . $e->getMessage() . "</p>\n";
pie();
exit();
}
}
Consultas preparadas
Para que PHP desinfecte los datos, estos deben enviarse al ejecutar
la consulta, no al prepararla. Para ello es necesario indicar en la
consulta la posicin de los datos. Esto se puede hacer de dos
maneras, mediante parmetros o mediante interrogantes, aunque se
aconseja la utilizacin de parmetros:
foreach($campos as $campo) {
if (isset($_REQUEST[$var]) && $_REQUEST[$var] == $campo) {
return $campo;
}
}
return $var2;
}
Ejemplos de consultas
Consultas en MySQL
Consultas en SQLite
El resultado sera
// biblioteca_mysql.php
$consultaCreaTabla = "CREATE TABLE $dbTabla (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nombre VARCHAR($tamNombre),
apellidos VARCHAR($tamApellidos),
PRIMARY KEY(id)
)";
function borraTodo($db)
{
global $dbDb, $consultaCreaTabla;
$consulta = "DROP DATABASE $dbDb";
if ($db->query($consulta)) {
print "<p>Base de datos borrada
correctamente.</p>\n";
} else {
print "<p>Error al borrar la base de datos.</p>\n";
}
$consulta = "CREATE DATABASE $dbDb";
if ($db->query($consulta)) {
print "<p>Base de datos creada correctamente.</p>\n";
$consulta = $consultaCreaTabla;
if ($db->query($consulta)) {
print "<p>Tabla creada correctamente.</p>\n";
} else {
print "<p>Error al crear la tabla.</p>\n";
}
} else {
print "<p>Error al crear la base de datos.</p>\n";
}
}
// biblioteca_sqlite.php
$consultaCreaTabla = "CREATE TABLE $dbTabla (
id INTEGER PRIMARY KEY,
nombre VARCHAR($tamNombre),
apellidos VARCHAR($tamApellidos)
)";
function borraTodo($db)
{
global $dbTabla, $consultaCreaTabla;
$consulta = "DROP TABLE $dbTabla";
if ($db->query($consulta)) {
print "<p>Tabla borrada correctamente.</p>\n";
} else {
print "<p>Error al borrar la tabla.</p>\n";
}
$consulta = $consultaCreaTabla;
if ($db->query($consulta)) {
print "<p>Tabla creada correctamente.</p>\n";
} else {
print "<p>Error al crear la tabla.</p>\n";
}
}
Consulta SELECT
Ejemplos de consultas:
Registros en los que el apellido empieza por la cadena recibida:
#1 (permalink)
06/01/2013, 17:39
viclube Mensajes: 46
Puntos: 1
Cdigo PHP:
<?php
class ConfigBD{
public $DBServer;
public $DBName;
public $UserName;
public $Password;
function __construct(){
$this->DBServer='localhost';
$this->UserName='root';
$this->Password='toor';
$this->DBName='db';
}
}
?>
Cdigo PHP:
<?php
include_once 'claseConfigDB.php';
class db{
/*** Declare instance ***/
private static $instance = NULL;
/**
*
* the constructor is set to private so
* so nobody can create a new instance using new
*
*/
private function __construct() {
/*** maybe set the db name here later ***/
}
/**
*
* Return DB instance or create intitial connection
*
* @return object (PDO)
*
* @access public
*
*/
public static function getInstance() {
if (!self::$instance)
{
$conexion = new ConfigBD();
self::$instance = new PDO("mysql:host=$conexion-
>DBServer;dbname=$conexion->DBName",$conexion->UserName,$conexion-
>Password);; //asi funciona y con variables NO.
self::$instance-> setAttribute(PDO::ATTR_ERRMODE, PD
O::ERRMODE_EXCEPTION);
}
return self::$instance;
}
/**
*
* Like the constructor, we make __clone private
* so nobody can clone the instance
*
*/
private function __clone(){
}
Cdigo PHP:
<?php
include_once "claseBaseDatos.php";
class Usuario{
private $id_usuario;
private $nombre;
private $apellido;
private $usuario;
private $pass;
private $rol;
private $email;
private $telefono;
private $activo;
try {
$comando = DB::getInstance()->prepare($query);
$comando->execute();
if($row = $comando->fetch(PDO::FETCH_ASSOC)) {
$this->setIdUsuario($row['id_usuario']);
$this->setNombre($row['nombre']);
$this->setApellido($row['apellido']);
$this->setUsuario($row['usuario']);
$this->setRol($row['rol']);
$this->setEmail($row['email']);
$this->setTelefono($row['telefono']);
$this->setActivo($row['activo']);
return true;
}else{
echo 'No hay resultado para esa consulta';
return false;
}
}catch(PDOException $e){
echo 'Error: ' . $e->getMessage();
}
}
public static function listarUsuarios(){
$query = "SELECT * FROM usuarios";
try {
$comando = DB::getInstance()->prepare($query);
$comando->execute();
$arreglo = array();
while( $datos = $comando->fetch() ) {
$usuario=new Usuario();
$usuario->cargar($datos[0], $datos[1], $datos[2], $da
tos[3], $datos[4], $datos[5], $datos[6], $datos[7], $datos[8]);
array_push($arreglo,$usuario);
}
return $arreglo;
}catch(PDOException $e){
echo 'Error: ' . $e->getMessage();
}
}
try
{
$comando = DB::getInstance()->prepare($query);
$rows = $comando->execute(array(':id_usuario' => $this-
>getIdUsuario()));
if( $rows == 1 ){echo 'DELETE correcto';}
}
catch(PDOException $e)
{
echo 'Error: ' . $e->getMessage();
}
}
Las dos primeras clases las saque de algun lado... diria de donde pero no me
acuerdo, si alguien sabe que le de los creditos jeje.
Recogida de datos
Matriz $_REQUEST
Comprobacin de existencia
o Controles vacos
Utilizacin de variables
Salida de datos
o Recoger un dato
Matriz $_REQUEST
<form action="ejemplo.php">
<p>Nombre: <input type="text" name="nombre" /></p>
<p><input type="submit" value="Enviar" /></p>
</form>
<?php
Nombre: print "<pre>"; print_r($_REQUEST)
Pepito Cone
<?php
print "<p>Su nombre es " . $_REQUEST["nombre"] . "</p>\n";
?>
<?php
print "<p>Su nombre es " . $_REQUEST['nombre'] . "</p>\n";
?>
<?php
print "<p>Su nombre es " . $_REQUEST[nombre] . "</p>\n";
?>
En ningn caso se pueden utilizar los carcteres especiales \" o \', ni
dentro ni fuera de las cadenas.
Comprobacin de existencia
Controles vacos
ejemplo.html ejemplo.php
<?php
Nombre: print "<pre>"; print_r($_REQUEST);
Pepito Cone "</pre>\n";
ejemplo.html ejemplo.php
<?php
Nombre: print "<pre>"; print_r($_REQUEST); pri
ejemplo.html ejemplo.php
<?php
Nombre: print "<pre>"; print_r($_REQUEST); pri
if ($_REQUEST["nombre"] == "") {
print "<p>No ha escrito ningn nom
Enviar
} else {
print "<p>Su nombre es $_REQUEST[n
}
?>
<form action="ejemplo.php">
<p>Deseo recibir informacin: <input type="checkbox" name="acepto" /></p>
<p><input type="submit" value="Enviar" /></p>
</form>
Si en el formulario anterior el usuario marca la casilla, el siguiente
programa funciona perfectamente:
ejemplo.html ejemplo.php
<?php
Deseo recibir informacin: print "<pre>"; print_r($_REQUEST); pri
if ($_REQUEST["acepto"] == "on") {
print "<p>Desea recibir informaci
Enviar
} else {
print "<p>No desea recibir informa
}
?>
ejemplo.html ejemplo.php
<?php
Deseo recibir informacin: print "<pre>"; print_r($_REQUEST); p
if ($_REQUEST["acepto"] == "on") {
print "<p>Desea recibir informac
Enviar
} else {
print "<p>No desea recibir infor
}
?>
if ($_REQUEST["nombre"] == "") {
print "<p>No ha escrito ningn n
Enviar
} else {
print "<p>Su nombre es $_REQUEST
}
?>
ejemplo.html ejemplo.php
Deseo recibir informacin: <?php
if (isset($_REQUEST["acepto"])) {
print "<p>Desea recibir informacin</p
} else {
Enviar print "<p>No desea recibir informacin
}
?>
ejemplo.html ejemplo.php
Deseo recibir informacin: <?php
if (isset($_REQUEST["acepto"])) {
print "<p>Desea recibir informacin</p
} else {
Enviar print "<p>No desea recibir informacin
}
?>
Nombre: <?php
<strong>Pe
print "<pre>"; print_r($_REQUEST); pri
Nombre: <?php
<body onlo
print "<pre>"; print_r($_REQUEST); print "</
Nombre: <?php
<strong>Pe
print "<pre>"; print_r($_REQUEST); print "
Aunque hay que tener en cuenta que esta funcin elimina cualquier
cosa que se interprete como una etiqueta, es decir, que empiece por
"<".
Nombre: <?php
<pepe>
print "<pre>"; print_r($_REQUEST); pr
ejemplo.html ejemplo.php
<?php
Nombre: print "<pre>"; print_r($_REQUEST); pri
if ($_REQUEST["nombre"] == "") {
print "<p>No ha escrito ningn nom
Enviar
} else {
print "<p>Su nombre es $_REQUEST[n
}
?>
ejemplo.html ejemplo.php
Nombre: <?php
print "<pre>"; print_r($_REQUEST); prin
if (trim($_REQUEST["nombre"]) == "") {
print "<p>No ha escrito ningn nomb
Enviar } else {
print "<p>Su nombre es ". trim
"</p>\n";
}
?>
Utilizacin de variables
ejemplo.html ejemplo.php
Nombre: <?php
print "<pre>"; print_r($_REQUEST); print "</pre>\n
if (isset($_REQUEST["nombre"])) {
Enviar $nombre = trim(strip_tags($_REQUEST["nombre"])
} else {
$nombre = "";
}
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</p>\n";
} else {
print "<p>Su nombre es $nombre</p>\n";
}
?>
ejemplo.html ejemplo.php
Nombre: <?php
<strong>Pe
print "<pre>"; print_r($_REQUEST); print "</pre>\n
if (isset($_REQUEST["nombre"])) {
Enviar $nombre = trim(strip_tags($_REQUEST["nombre"])
} else {
$nombre = "";
}
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</p>\n";
} else {
print "<p>Su nombre es $nombre</p>\n";
}
?>
ejemplo.html ejemplo.php
Nombre: <?php
<strong>Pe
print "<pre>"; print_r($_REQUEST); print "</pre>\
$nombre = (isset($_REQUEST["nombre"]))
Enviar ? trim(strip_tags($_REQUEST["nombre"]))
: "";
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</p>\n";
} else {
print "<p>Su nombre es $nombre</p>\n";
}
?>
Salida de datos
Nombre: <?php
Pepito & Co
$nombre = (isset($_REQUEST["nombre"]))
? trim(strip_tags($_REQUEST["nombre"]
: "";
Enviar
if ($nombre == "") {
print "<p>No ha escrito ningn nombre
} else {
print "<p>Su nombre es $nombre</p>\n"
}
?>
Nombre: <?php
Pepito & Co
$nombre = (isset($_REQUEST["nombre"]))
? trim(strip_tags($_REQUEST["nombre"]
: "";
Enviar
$nombre = str_replace('&', '&', $nomb
if ($nombre == "") {
print "<p>No ha escrito ningn nombre
} else {
print "<p>Su nombre es $nombre</p>\n"
}
?>
Nombre: <?php
Me llamo
$nombre = (isset($_REQUEST["nombre"]))
? trim(strip_tags($_REQUEST["nombre"]))
: "";
Enviar
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</
} else {
print "<p>Corrija: <input type=\"text\"
}
?>
El problema es que el cdigo fuente contiene comillas dentro de
comillas y el navegador no puede interpretar correctamente el cdigo
(en este caso, el valor del atributo value es solamente "Me llamo":
<p>Corrige: <input type="text" value="Me llamo "Pepe"" /></p>
Nombre: <?php
Me llamo
$nombre = (isset($_REQUEST["nombre"]))
? trim(strip_tags($_REQUEST["nombre"]))
: "";
Enviar
$nombre = str_replace('"', '"', $nombr
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</
} else {
print "<p>Corrija: <input type=\"text\"
}
?>
Nombre: <?php
Me llamo
$nombre = (isset($_REQUEST["nombre"]))
? htmlspecialchars(trim(strip_tags($_REQUEST[
: "";
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</p>\n";
Enviar
} else {
print "<p>Corrija: <input type=\"text\" value
}
?>
Nombre: <?php
Me llamo <s
$nombre = (isset($_REQUEST["nombre"]))
? htmlspecialchars(trim(strip_tags($_REQUEST[
: "";
Enviar
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</p>\n";
} else {
print "<p>Corrija: <input type=\"text\" value
}
?>
Nombre: <?php
Me llamo <s
$nombre = (isset($_REQUEST["nombre"]))
? strip_tags(trim(htmlspecialchars($_REQUEST[
: "";
Enviar
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</p>\n";
} else {
print "<p>Corrija: <input type=\"text\" value
}
?>
Nombre: <?php
Me llamo <s
$nombre = (isset($_REQUEST["nombre"]))
? trim(htmlspecialchars($_REQUEST["nombre
: "";
if ($nombre == "") {
print "<p>No ha escrito ningn nombre</p>
} else {
Enviar
print "<p>Corrija: <input type=\"text\" v
}
?>
htmlspecialchars(trim(strip_tags($_REQUEST[$var])),
ENT_QUOTES, "ISO-8859-1")
1. Recoger un dato
Recoger un dato
Hay que hacer otra funcin que recoja y trate los datos en forma de
matriz.
if ($nombre[1] == "") {
print "<p style=\"color: red\">No ha escrito su
nombre.</p>\n";
} else {
print "<p>Su nombre es <strong>$nombre[1]</strong>.</p>\n";
}
if ($nombre[2] == "") {
print "<p style=\"color: red\">No ha escrito su
apellido.</p>\n";
} else {
print "<p>Su apellido es <strong>$nombre[2]</strong>.</p>\n";
}
?>
$recorta = array(
"nombre" => $tamNombre);
$tmp = isset($recorta[$campo])
? substr($cadena, 0, $recorta[$campo])
: $cadena;
return $tmp;
}
function recoge($var)
{
$tmp = (isset($_REQUEST[$var]))
? trim(htmlspecialchars($_REQUEST[$var], ENT_QUOTES, "ISO-
8859-1"))
: "";
$tmp = recorta($var, $tmp);
return $tmp;
}
Cuando envias el formulario de nuevo a esa pgina te falta algo para recoger lo que has
enviado.
Algo asi...
Cdigo:
<?php
$mold_suelo = $_REQUEST['mold_suelo'];
$mold = $_REQUEST['mold'];
?>
Cdigo:
Un saludo
En lnea
Mensajes: 3
gracias gente ya funciona, hice lo que dijeron, pero ahora hace akgo
extrao, cuando se carga el formulario por primera vez y solo por
primera vez sale esto:
luego cuando ingreso los numeros y le doy enviar hace el calculo sin
problemas y estas advertencias desaparecen y puedo seguir ingresando
numeros y haciando el calculo si que esto vuelva a aparecer, si saben
que puede ser se los agradecere
saludos y gracias
// src/Acme/TaskBundle/Entity/Task.php
namespace Acme\TaskBundle\Entity;
class Task
// descripcin de la tarea
protected $task;
protected $dueDate;
return $this->task;
$this->task = $task;
}
public function getDueDate()
return $this->dueDate;
$this->dueDate = $dueDate;
NOTA Si ests programando este ejemplo a medida que lees el captulo, primero
crea el bundleAcmeTaskBundle ejecutando el siguiente comando (y acepta los
valores por defecto de todas las opciones):
Esta clase no es ms que una clase PHP normal, ya que por el momento no
tiene nada que ver ni con Symfony ni con ninguna otra librera. Se trata de una
clase PHP adecuada para resolver el problema de tu aplicacin. Al finalizar
este captulo, sers capaz de enviar informacin a una instancia de la
clase Task mediante un formulario, validar sus datos y guardarlos en una base
de datos.
Ahora que has creado una clase Task, el siguiente paso consiste en crear y
mostrar en el navegador el formulario HTML real. En Symfony2, esto se hace
construyendo un objeto de tipo Form y luego renderizndolo en una plantilla.
Por el momento vamos a hacer todos estos pasos dentro de un controlador:
// src/Acme/TaskBundle/Controller/DefaultController.php
namespace Acme\TaskBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\TaskBundle\Entity\Task;
use Symfony\Component\HttpFoundation\Request;
// crea una task y le asigna algunos datos ficticios para este ejemplo
$task->setDueDate(new \DateTime('tomorrow'));
$form = $this->createFormBuilder($task)
->add('task', 'text')
->add('dueDate', 'date')
->add('save', 'submit')
->getForm();
));
TWIG
PHP
// ...
$form = $this->createFormBuilder($task)
->add('task', 'text')
->add('dueDate', 'date')
->add('save', 'submit')
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
return $this->redirect($this->generateUrl('task_success'));
// ...
3. Cuando el usuario enva el formulario con datos vlidos, los datos enviados se
guardan de nuevo en el formulario, pero esta vez el
mtodo isValid() devuelve true. En este momento ya puedes trabajar con el
objeto $task (por ejemplo guardndolo en una base de datos) antes de redirigir al
usuario a otra pgina (por ejemplo a la pgina de agradecimiento o a la que
muestra un mensaje determinado).
$form = $this->createFormBuilder($task)
->add('task', 'text')
->add('dueDate', 'date')
->add('save', 'submit')
->add('saveAndAdd', 'submit')
->getForm();
// ... haz algo con los datos, como por ejemplo guardarlos
$nextAction = $form->get('saveAndAdd')->isClicked()
? 'task_new'
: 'task_success';
return $this->redirect($this->generateUrl($nextAction));