Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Crando User
# createuser -Upostgres -sDRP town
Passwd: 12345
Luego de haber creado el usuario, vamos a crear la Base de Datos que usara este usuario.
tienda=>
Listado de relaciones
Schema | Nombre | Tipo | Dueño
--------------+----------------------+-----------+-------
public | cliente | tabla | town
Tabla «public.cliente»
Columna | Tipo | Modificadores
-------------+-------------------------+-------------------------------
idcliente | integer | not null default extval('cliente_idcliente_seq'::regclass)
nombre | character varying(30) |
apellido | character varying(30) |
direccion | character varying(200) |
telefono | numeric(10,0) |
Índices:
«cliente_pkey» PRIMARY KEY, btree (idcliente)
Listo hemos creado un user para nuestra DB, una base de datos, tabla y hemos insertado registros a la
tabla, todo desde la consola. Ahora crearemos un file.php para conectar nuestras DB a php, y asi desde web
insertar archivos y consultar.
inc.php
$user = 'town';
$passwd = '12345';
$db = 'tienda';
$port = 5432;
$host = 'localhost';
$strCnx = "host=$host port=$port dbname=$db user=$user password=$passwd";
?>
agregar.php
<html>
<head>
<title>postgreSQL - tienda</title>
</head>
<body>
<h1>postgreSQL - cliente</h1>
<?php
include_once '../inc.php';
$cnx = pg_connect($strCnx) or die ("Error de conexion. ". pg_last_error());
echo "Conexion exitosa<br>";
# Ejecutando la Consulta
if ( $_POST ) {
$result = pg_query($cnx, "INSERT INTO cliente (nombre,apellido,direccion,telefono) VALUES ('" .
pg_escape_string($_POST['nombre']) . "','" . pg_escape_string($_POST['apellido']) . "','" . pg_escape_string
($_POST['direccion']) . "'," . ((int)$_POST['telefono']) . " )");
if (!$result) {
echo "Query: Un error ha occurido.\n";
exit;
}
}
if ( $_POST )
echo "<div class=\"info\">Registro insertado
<a href=\"./ver\">volver</a></div>";
?>
<form action="" method="post">
<label>Nombre</label>
<input type="text" name="nombre" value="" class="txtbox long"/>
<label>apellido</label>
<input type="text" name="apellido" value="" class="txtbox long"/>
<label>Direccion</label>
<input type="text" name="direccion" value="" class="txtbox long"/>
<label>Telefono</label>
<input type="text" name="telefono" value="" class="txtbox"/>
<label>Password</label>
<input type="text" name="password" value="" class="txtbox"/>
<br />
<br />
<input type="submit" value="Guardar" class="btn"
/> <a href="./ver">volver</a>
</form>
<?php
pg_close($cnx);
?>
</table>
</body>
</html>
http://localhost/agregar.php
listo!! usted puede ingresar sus clientes desde php, sin estar en la consola.
Seguire en otra entrada con la consulta de estos dados...
PHP y PostgreSQL
Veamos un ejemplo de cómo trabajar con bases de datos PostgreSQL, para ello en la base de
datos template1 crea la siguiente tablaque utilizaremos en el ejemplo:
1.º create table tbl_personas (
2.º id integer not null check (id > 0),
3.º nombre varchar(50) not null,
4.º primary key (id)
5.º )
NOTA: a día de hoy, la última versión disponible (PostgreSQL 9) no soporta unsigned, en su lugar podemos usar
la cláusula check.
Creamos una función usando pg_connect() para conectar con PostgreSQL, y pg_last_error() que nos devolverá
un mensaje de error si se produjo alguno (lo detectamos con or die, que detendrá la ejecución):
1.º <?php
2.º function conectar_PostgreSQL( $usuario, $pass, $host, $bd )
3.º {
4.º $conexion = pg_connect( "user=".$usuario." ".
5.º "password=".$pass." ".
6.º "host=".$host." ".
7.º "dbname=".$bd
1.º ) or die( "Error al conectar:
".pg_last_error() );
1.º
2.º return $conexion;
3.º }
4.º ?>
Creamos otra función para borrar todos los registros de la tabla o sólo el especificado. Para procesar una
consulta (tanto de selección como de actualización) usaremos la función pg_query():
1.º <?php
2.º function borrarPersona( $conexion, $id )
3.º {
4.º $sql = "DELETE FROM tbl_personas";
5.º
6.º // Si 'id' es diferente de 'null' sólo se borra la persona con el
'id' especificado:
7.º if( $id != null )
8.º $sql .= " WHERE id=".$id;
9.º
10.º // Ejecutamos la consulta (se devolverá true o false):
1.º return pg_query( $conexion, $sql );
1.º }
2.º ?>
Función para insertar un registro en la tabla:
1.º <?php
2.º function insertarPersona( $conexion, $id, $nombre )
3.º {
4.º $sql = "INSERT INTO tbl_personas VALUES (".$id.", '".$nombre."')";
5.º
6.º // Ejecutamos la consulta (se devolverá true o false):
1.º return pg_query( $conexion, $sql );
1.º }
2.º ?>
Otra función para modificar un registro:
1.º <?php
2.º function modificarPersona( $conexion, $id, $nombre )
3.º {
4.º $sql = "UPDATE tbl_personas SET nombre='".$nombre."' WHERE id=".
$id;
5.º
6.º // Ejecutamos la consulta (se devolverá true o false):
1.º return pg_query( $conexion, $sql );
1.º }
2.º ?>
Creamos una función más para listar la tabla completa, en la cual utilizamos pg_num_rows() (devuelve el
número de registros encontrados) y pg_fetch_object() (devuelve los valores de los campos en un Objeto de
PHP):
1.º <?php
2.º function listarPersonas( $conexion )
3.º {
4.º $sql = "SELECT * FROM tbl_personas ORDER BY id";
5.º $ok = true;
6.º
7.º // Ejecutar la consulta:
1.º $rs = pg_query( $conexion, $sql );
1.º
2.º if( $rs )
3.º {
4.º // Obtener el número de filas:
1.º if( pg_num_rows($rs) > 0 )
1.º {
2.º echo "<p/>LISTADO DE PERSONAS<br/>";
3.º echo "===================<p />";
4.º
5.º // Recorrer el resource y mostrar los datos:
1.º while( $obj = pg_fetch_object($rs) )
2.º echo $obj->id." - ".$obj->nombre."<br />";
1.º }
2.º else
3.º echo "<p>No se encontraron personas</p>";
4.º }
5.º else
6.º $ok = false;
7.º
8.º return $ok;
9.º }
10.º ?>
Por último, creamos una función que procesará una consulta y nos devolverá un Objeto en PHP con los datos del
registro encontrado:
1.º <?php
2.º function buscarPersona( $conexion, $id )
3.º {
4.º $sql = "SELECT * FROM tbl_personas WHERE id=".$id."";
5.º $devolver = null;
6.º
7.º // Ejecutar la consulta:
1.º $rs = pg_query( $conexion, $sql );
1.º
2.º if( $rs )
3.º {
4.º // Si se encontró el registro, se obtiene un objeto en PHP con
los datos de los campos:
1.º if( pg_num_rows($rs) > 0 )
2.º $devolver = pg_fetch_object( $rs, 0 );
1.º }
2.º
3.º return $devolver;
4.º }
5.º ?>
A continuación, el código fuente principal del programa. Observa que debemos introducir los datos de acceso
(usuario, contraseña, dirección IP y nombre de la base de datos) para conectar con PostgreSQL:
Expand Code
También disponemos de la función pg_send_query() que permite enviar una consulta de forma asíncrona,
pudiendo así enviar varias a la vez e irlas obteniendo de una en una con pg_result().
// =====
//Example #1 (An array of IP addresses):
<?php
$pgsqlArr = '{192.168.1.1,10.1.1.1}';
preg_match('/^{(.*)}$/', $pgsqlArr, $matches);
$phpArr = str_getcsv($matches[1]);
print_r($phpArr);
}
// Output:
// Array
// (
// [0] => 192.168.1.1
// [1] => 10.1.1.1
// )
// =====
// =====
// Example #2 (An array of strings including spaces and commas):
<?php
$pgsqlArr = '{string1,string2,"string,3","string 4"}';
preg_match('/^{(.*)}$/', $pgsqlArr, $matches);
$phpArr = str_getcsv($matches[1]);
print_r($phpArr);
}
// Output:
// Array
// (
// [0] => string1
// [1] => string2
// [2] => string,3
// [3] => string 4
// )
// =====
up
down
3
saberit at home dot com ¶
17 years ago
I tried compiling PHP from source with PostgreSQL support (./configure --with-
pgsql=/usr/local/pgsql) and ran into a bunch of problems when trying to 'make'. The
problem was that some of the PostgreSQL headers were not installed by default when I
installed PostgreSQL from source. When installing PostgreSQL make sure you 'make
install-all-headers' after you 'make install'.
up
down
1
1413 at blargh dot com ¶
13 years ago
Here is some quick and dirty code to convert Postgres-returned arrays into PHP
arrays. There's probably a billion bugs, but since I'm only dealing with variable-depth-and-
length arrays of integers, it works for my needs.
Most notably, any data that might have commas in it won't work right...
<?php
function PGArrayToPHPArray($pgArray)
{
$ret = array();
$stack = array(&$ret);
$pgArray = substr($pgArray, 1, -1);
$pgElements = explode(",", $pgArray);
ArrayDump($pgElements);
foreach($pgElements as $elem)
{
if(substr($elem,-1) == "}")
{
$elem = substr($elem,0,-1);
$newSub = array();
while(substr($elem,0,1) != "{")
{
$newSub[] = $elem;
$elem = array_pop($ret);
}
$newSub[] = substr($elem,1);
$ret[] = array_reverse($newSub);
}
else
$ret[] = $elem;
}
return $ret;
}
?>
up
down
1
74012 dot 2773 at compuserve dot com ¶
14 years ago
for just a list of tables, this works with postgresql-7.2.1:
function pg_list_tables($db) {
$sql = "select relname from pg_stat_user_tables order by relname;";
return pg_query($db, $sql);
}
up
down
1
daniel at bichara dot com dot br ¶
16 years ago
Running RedHat Linux and Apache with suexec enabled you must include pgsql.so on
each .php file using dl("pgsql.so") and remove "extension=pgsql.so" from php.ini,
otherwise Apache (httpd) will not start.
up
down
0
WillowCatkin at hotmail dot com ¶
13 years ago
There is an example:
<?php
/*
* Define PostgreSQL database server connect parameters.
*/
define('PGHOST','10.0.0.218');
define('PGPORT',5432);
define('PGDATABASE','example');
define('PGUSER', 'root');
define('PGPASSWORD', 'nopass');
define('PGCLIENTENCODING','UNICODE');
define('ERROR_ON_CONNECT_FAILED','Sorry, can not connect the database server
now!');
/*
* Merge connect string and connect db server with default parameters.
*/
pg_pconnect('host=' . PGHOST . ' port=' . PGPORT . ' dbname=' . PGDATABASE . '
user=' . PGUSER . ' password=' . PGPASSWORD);
/*
* generate sql statements to call db-server-side stored procedure(or function)
* @parameter string $proc stored procedure name.
* @parameter array $paras parameters, 2 dimensions array.
* @return string $sql = 'select "proc"(para1,para2,para3);'
* @example pg_prepare('userExists',
* array(
* array('userName','chin','string'),
* array('userId','7777','numeric')
* )
*)
*/
function pg_prepare($proc, $paras)
{
$sql = 'select "' . $proc . '"(';
$sql .= $paras[0][2] == 'numeric' ? $paras[0][1] : "'" . str_replace("'","''",$paras[0][1]) . "'";
$len = count($paras);
for ($i = 1; $i < $len; $i ++)
{
$sql .= ',';
$sql .= $paras[$i][2] == 'numeric' ? $paras[$i][1] : "'" . str_replace("'","''",$paras[$i]
[1]) . "'";
}
$sql .= ');';
return $sql;
}
?>
up
down
0
abondi at ijk dot it ¶
14 years ago
I've found another function to mimic the following mysql list tables function
(http://www.php.net/manual/en/function.mysql-list-tables.php) that's more useful for my
target:
function pg_list_tables() {
$sql = "SELECT a.relname AS Name
FROM pg_class a, pg_user b
WHERE ( relkind = 'r') and relname !~ '^pg_' AND relname !~ '^sql_'
AND relname !~ '^xin[vx][0-9]+' AND b.usesysid = a.relowner
AND NOT (EXISTS (SELECT viewname FROM pg_views WHERE
viewname=a.relname));";
return(pg_query($conn, $sql));
}
up
down
-1
Anonymous ¶
12 years ago
Lots of advice on stored procedures didn't work for me. This did:
<?php
$response = pg_query( $connection, "BEGIN; DECLARE s CURSOR FOR SELECT
get_consumer('harry'); FETCH ALL IN s; END;" );
?>
<value> takes:
i for keys,
r for relations,
S for sequences
Note that all tables names that begins with 'pg_' are PostgreSQL internal tables (this
explain why I use AND relname !~ '^pg_' condition).
up
down
-1
passion at monkey dot org ¶
17 years ago
I've tried to mimic the following mysql database connection functions for postgres.
http://www.php.net/manual/en/function.mysql-list-dbs.php
http://www.php.net/manual/en/function.mysql-list-tables.php
These are assuming that you're passing in $link as the result from pg_connect:
function pg_list_dbs($link)
{
$sql = 'SELECT datname FROM pg_database';
return (pg_query($link, $sql));
}
function pg_list_tables($link)
{
$sql = "SELECT relname FROM pg_class WHERE relname !~ '^pg_'";
return (pg_query($link, $sql));
}
up
down
-1
!spamcraig at ahdore dot com ¶
17 years ago
If you want to extract data from select statements, you need to store the result index, and
then apply pg_result to that value. Basically, do this
I'm new to php and had to do some fiddling around to work this out. It's reasonably
elementary, but not demonstrated by the examples on these pages. Hopefully it will come
in useful to someone else.
up
down
-1
bleach at chek dot com ¶
18 years ago
If you want to see all the objects in a database, you can find that information in the
pg_class table. <BR>
SELECT * FROM pg_class;<BR>
Now this is going to be kind of long and complex, to see how psql command handles the \d
and other things. use the syntax. psql -E <Database>, ie psql -E mydatabase <BR>
What this will do is show the SQL command used for everything. So when you type a \d or
something, it shows the SQL query used for the result.
up
down
-2
Chris KL ¶
13 years ago
Here is a better array parser for PHP. It will work with 1-d arrays only. Unlike the example
below it will work in all cases.
/**
* Change a db array into a PHP array
* @param $arr String representing the DB array
* @return A PHP array
*/
function phpArray($dbarr) {
// Take off the first and last characters (the braces)
$arr = substr($dbarr, 1, strlen($dbarr) - 2);
// Do one further loop over the elements array to remote double quoting
// and escaping of double quotes and backslashes
for ($i = 0; $i < sizeof($elements); $i++) {
$v = $elements[$i];
if (strpos($v, '"') === 0) {
$v = substr($v, 1, strlen($v) - 2);
$v = str_replace('\\"', '"', $v);
$v = str_replace('\\\\', '\\', $v);
$elements[$i] = $v;
}
}
return $elements;
}
up
down
-2
adaml at mimuw edu pl ¶
14 years ago
Yes, PHP does support stored procedures
You have to add "select" before the name of the
procedure, just like that:
PHP will return values of PostgreSQL boolean datatype as single character strings "t" and
"f", not PHP true and false.
[Editor's Note]
't' or 'f' is valid boolean expression for PostgreSQL.
All values from PostgreSQL are strings, since PostgreSQL integer, float may be much
larger than PHP's native int, double can handle. PostgreSQL array is not supported.
up
down
-1
anonymous at unknown dot com ¶
16 years ago
I just wanted to add to my previous post I've got the system up and running.
Environment: Windows XP, Apache 1.3.23, Php 4.3 RC2, PostGreSQL beta4 native
windows build
You must load the postgresql extension by editing the php.ini and restarting apache in
order to access psql with php.
Oh yeah, I created the data dir manually - don't know whether that was necessary
Grtz Vargo
up
down
-1
anis_wn at gawab dot com ¶
13 years ago
Setting up PostgreSQL for higher security PHP connection.
Case:
We want to connect to PostgreSQL database using username and password supplied by
webuser at login time.
Fact (Linux):
Apache (perhaps other servers, too) running the server as (default to) apache user
account. So if you connect to PostgreSQL using default user, apache will be assingned for
it. If you hard code the user and password in your PHP script, you'll loose security
restriction from PostgreSQL.
Solution:
(You are assumed to have enough privilege to do these things, though)
1. Edit pg_hba.conf to have the line like the one below
host db_Name [web_server_ip_address] [ip_address_mask] md5
2. Add to you script the login page that submits username and password.
3. Use those information to login to PostgreSQL like these...
<?
$conn = "host=$DBHost port=$DBPort dbname=$DBName ".
"user='{$_POST['dbUsername']}' password='{$_POST['dbPassword']}'";
$db = pg_connect ($conn);
[your other codes go here...]
?>
4. You must add users in PostgreSQL properly.
5. For your convenience, you can store the username and password to $_SESSION
variable.
Good luck.
Anis WN
up
down
-5
Anonymous ¶
12 years ago
Chris KL: Will parse well {"\\"}? The second " will be treat as escaped while it shoudn't...
El archivo de configuración de PHP
PHP posee un archivo de configuración cuyo nombre es php.ini y que podrás encontrar en el directorio de
instalación de PHP, o bien en la carpeta de tu sistema operativo Windows.
Si usas una distribución basada en Linux su ubicación varía dependiendo de la que uses. Una forma de localizarlo
es usando el siguiente comando:
find / -name "*php.ini*"
Para evitar posibles confusiones y quebraderos de cabeza a causa de editar un archivo php.ini que no es el que
está siendo realmente usado, lo mejor es crear un archivo llamado por ejemplo info.php (por ejemplo) con el
siguiente código PHP:
1.º <?php
2.º phpinfo();
3.º ?>
Tras copiarlo a la carpeta htdocs del servidor web Apache y ejecutarlo introduciendo
la URL http://127.0.0.1/info.php navegador web, deberías ver algo como:
En Loaded Configuration File podrás ver la ruta en la que se encuentra el archivo de configuración que está
siendo actualmente usado.
Sin embargo, existe una forma de configurar la ruta del archivo php.ini que deseemos usar, añadiendo al final
del archivo de configuración del servidor web Apache (llamado httpd.conf y que se encuentra en la
subcarpeta conf dentro del directorio de instalación del mismo) la siguiente línea, reiniciándolo posteriormente:
PHPIniDir "c:/php5"
NOTA: también podemos indicar la ruta usando doble barra inversa \\.
Añade también a las variables de entorno de tu sistema operativo el directorio en el que tengas instalado PHP, y
también el subdirectorio ext (en el que se encuentran las extensiones).
En los siguientes apartados te mostraremos algunas opciones de configuración útiles.
Recuerda que tras hacer algún cambio en el archivo de configuración de PHP deberás reiniciar el servidor web
Apache, para que surtan efecto los cambios.
php_value nombre valor
Establece el valor de la directiva especificada. Sólo puede usarse con las directivas de
tipo PHP_INI_ALL y PHP_INI_PERDIR. Para borrar un valor previamente establecido,
use none como valor.
Nota: No use php_value para establecer valores boolean. Debe usarse en su
lugar php_flag (ver más abajo).
php_flag nombre on|off
Usado para establecer una directiva de configuración de tipo boolean. Sólo puede usarse
con las directivas de tipo PHP_INI_ALL y PHP_INI_PERDIR.
php_admin_value nombre valor
Establece el valor de la directiva especificada. Esto no se puede usar en
ficheros .htaccess. Ninguna directiva establecida con php_admin_value podrá ser
sobrescrita por .htaccess o por ini_set(). Para borrar un valor establecido previamente
use none como valor.
php_admin_flag nombre on|off
Usado para establecer una directiva de configuración de tipo boolean. Esto no se puede
usar en ficheros .htaccess. Ninguna directiva establecida con php_admin_flag podrá ser
sobrescrita por .htaccess o por ini_set().
ini_set
(PHP 4, PHP 5, PHP 7)
ini_set — Establece el valor de una directiva de configuración
Descripción ¶
string ini_set ( string $varname , string $newvalue )
Establece el valor de la directiva de configuración dada. La opción de configuración
mantendrá este nuevo valor durante la ejecución del script, y se restaurará cuando acabe
el mismo.
Parámetros ¶
varname
No todas las directivas pueden ser modificadas con ini_set(). Hay una lista con todas las
directivas disponibles en el apéndice.
newvalue
El nuevo valor para la opción.
Valores devueltos ¶
Devuelve el valor anterior en caso de éxito, FALSE en caso de error.
Ejemplos ¶
Ejemplo #1 Establece una opción ini
<?php
echo ini_get('display_errors');
if (!ini_get('display_errors')) {
ini_set('display_errors', '1');
}
echo ini_get('display_errors');
?>
setlocale
(PHP 4, PHP 5, PHP 7)
setlocale — Establecer la información del localismo
Descripción ¶
string setlocale ( int $category , string $locale [, string $... ] )
string setlocale ( int $category , array $locale )
Establece la información del localismo.
Parámetros ¶
category
category es una constante con nombre que especifica la categoría de las funciones
afectadas por el localismo:
LC_ALL para establecer todas las siguientes
LC_COLLATE para la comparación de cadenas; véase strcoll()
LC_CTYPE para la clasificación y conversión de caracteres, por ejemplo strtoupper()
LC_MONETARY para localeconv()
LC_NUMERIC para el separador decimal (véase también localeconv())
LC_TIME para el formato de fecha y hora con strftime()
LC_MESSAGES para las respuestas del sistema (disponible si PHP fue compilado
con libintl)
locale
Si locale es NULL o el string vacío "", los nombres de los localismos se establecerán a
partir de los valores de las variables de entorno con los mismos nombres que las
categorías anteriores, o desde "LANG".
Si locale es "0", el localismo no se ve afectado, solamente devuelve la configuración
actual.
Si locale es un array o le siguen parámetros adicionales, cada elemento del array o
parámetro se intenta establecer como nuevo localismo hasta que se tenga éxito. Esto es
útil si un localismo se conoce con diferentes nombres en diferentes sistemas, o para
proporcionar un respaldo para un localismo posiblemente no disponible.
...
(String opcional o array de parámetros para probarlos como localismos hasta que se
tenga éxito.)
Nota:
En Windows, setlocale(LC_ALL, '') establece los nombres del localismo desde la
configuración regional o del lenguaje del sistema (accesible por medio del Panel de
Control).
Valores devueltos ¶
Devuelve el nuevo localismo actual o FALSE si la funcionalidad del localismo no está
implementada en la plataforma, el localismo especificado no existe, o el nombre de la
categoría no es válido.
Un nombre de categoría no válido también produce un mensaje de advertencia. Se
pueden encontrar los nombres de las categorías/localismos en la » RFC 1766 y en
la » ISO 639. Diferentes sistemas tienen diferentes nomenclaturas para los localismos.
Nota:
El valor de retorno de setlocale() depende del sistema donde se está ejecutando PHP.
Devuelve exactamente lo que la función setlocale del sistema devuelve.
/* Muestra: vrijdag 22 december 1978 */
echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 1978));
/* Probar diferentes nombres posibles de localismos para el alemán a partir de PHP 4.3.0
*/
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
echo "El localismo preferido para el alemán en este sistema es '$loc_de'";
?>
Ejemplo #2 Ejemplos para Windows de setlocale()
<?php
/* Establecer el localismo al holandés */
setlocale(LC_ALL, 'nld_nld');
/* Muestra: vrijdag 22 december 1978 */
echo strftime("%A %d %B %Y", mktime(0, 0, 0, 12, 22, 1978));
/* Probar diferentes nombres posibles de localismos para el alemán a partir de PHP 4.3
.0 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo "El localismo preferido para el alemán en este sistema es '$loc_de'";
?>
ini_get_all
(PHP 4 >= 4.2.0, PHP 5, PHP 7)
ini_get_all — Obtiene todas las opciones de configuración
Descripción ¶
array ini_get_all ([ string $extension [, bool $details = true ]] )
Devuelve todas las opciones de configuración registradas.
Parámetros ¶
extension
Un nombre de extensión opcional. Si se establece, la función de retornará únicamente
opciones específicas para esa extensión.
details
Recupera los detalles de configuración o sólo el valor actual de cada configuración. Por
omisión es TRUE(recuperar detalles).
Valores devueltos ¶
Devuelve un array asociativo con el nombre de la directiva como la clave del array.
Cuando el parámetro details es TRUE (por omisión) el array
contendrá global_value (establecido en php.ini), local_value (tal vez establecido
con ini_set() o .htaccess), y access (el nivel de acceso).
Cuando el parámetro details es FALSE el valor será el valor actual de la opción.
Vea la sección del manual para obtener información sobre lo que significan los niveles de
acceso.
Nota:
Es posible que una directiva tenga múltiples niveles de acceso, por lo que
el access muestra los valores de máscara de bits adecuado.
Notas ¶
Nota:
ini_get_all() ignora las opciones ini de "array" como pdo.dsn.*.
Historial de cambios ¶
Versión Descripción
5.3.0 Se añadió details.
Ejemplos ¶
Ejemplo #1 ini_get_all() ejemplos
<?php
print_r(ini_get_all("pcre"));
print_r(ini_get_all());
?>
El resultado del ejemplo sería algo similar a:
Array
(
[pcre.backtrack_limit] => Array
(
[global_value] => 100000
[local_value] => 100000
[access] => 7
)
)
Array
(
[allow_call_time_pass_reference] => Array
(
[global_value] => 0
[local_value] => 0
[access] => 6
)
...
)
Ejemplo #2 Disabling details
<?php
print_r(ini_get_all("pcre", false)); // Se añadió en PHP 5.3.0
print_r(ini_get_all(null, false)); // Se añadió en PHP 5.3.0
?>
El resultado del ejemplo sería algo similar a:
Array
(
[pcre.backtrack_limit] => 100000
[pcre.recursion_limit] => 100000
)
Array
(
[allow_call_time_pass_reference] => 0
[allow_url_fopen] => 1
...
)
ini_restore
(PHP 4, PHP 5, PHP 7)
ini_restore — Restablece el valor de una opción de configuración
Descripción ¶
void ini_restore ( string $varname )
Restaura una opción de configuración dado su valor original.
Parámetros ¶
varname
El nombre de la opción de configuración.
Valores devueltos ¶
No devuelve ningún valor.
Ejemplos ¶
Ejemplo #1 ini_restore() ejemplo
<?php
$setting = 'y2k_compliance';
echo 'Valor actual \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_set($setting, ini_get($setting) ? 0 : 1);
echo 'Nuevo valor \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
ini_restore($setting);
echo 'Valor original \'' . $setting . '\': ' . ini_get($setting), PHP_EOL;
?>
El resultado del ejemplo sería:
Valor actual 'y2k_compliance': 1
Nuevo valor 'y2k_compliance': 0
Valor original 'y2k_compliance': 1
Ver también ¶
ini_get() - Devuelve el valor de una directiva de configuración
ini_get_all() - Obtiene todas las opciones de configuración
ini_set() - Establece el valor de una directiva de configuración
add a note
<?php
/**
* Executes a function using a custom PHP configuration.
*
* @param array $settings A map<ini setting name, ini setting value>.
* @param callable $doThis The code to execute using the given settings.
* @return mixed Returns the value returned by the given callable.
*/
function ini_using_do(array $settings, callable $doThis){
foreach($settings as $name => $value){
$previousSettings[$name] = ini_set($name, $value);
}
$returnValue = $doThis();
if(isset($previousSettings)){
foreach($previousSettings as $name => $value){
ini_set($name, $value);
}
}
return $returnValue;
}
?>
parse_ini_file
(PHP 4, PHP 5, PHP 7)
parse_ini_file — Analiza un fichero de configuración
Descripción ¶
array parse_ini_file ( string $filename [, bool $process_sections = false [, int $scanner_mode =
INI_SCANNER_NORMAL ]] )
parse_ini_file() carga el fichero ini especificado en filename, y devuelve las
configuraciones que hay en él a un array asociativa.
La estructura del ficher0 ini es la misma que la de php.ini.
Parámetros ¶
filename
El nombre del fichero ini que va a ser analizado.
process_sections
Al establecer el parámetro process_sections a TRUE, se obtiene un array multidimesional,
con los nombres de las secciones y las configuraciones incluidas. El valor por defecto
de process_sections es FALSE
scanner_mode
Puede ser o INI_SCANNER_NORMAL (por defecto) o INI_SCANNER_RAW.
Si INI_SCANNER_RAW es proporcionado, los valores de las opciones no serán
analizadas.
A partir de PHP 5.6.1 también se puede especificar como INI_SCANNER_TYPED. En
este modo, los tipos boolean, null e integer se preservan siempre que sea posible. Los
valores de string "true", "on" y "yes" son convertidos
a TRUE. "false", "off", "no" y "none" se consideran como FALSE. "null" se convierte
a NULL en el modo tipificado. También, todos los string numéricos son convertidos al tipo
integer fuera es posible.
Valores devueltos ¶
Las configuraciones son devueltas como un array asociativo si se tiene éxito,
y FALSE si falla.
parse_ini_string
(PHP 5 >= 5.3.0, PHP 7)
parse_ini_string — Analiza una cadena de configuración
Descripción ¶
array parse_ini_string ( string $ini [, bool $process_sections = false [, int $scanner_mode =
INI_SCANNER_NORMAL ]] )
parse_ini_string() devuelve las configuraciones de la cadena ini a una matriz asociativa.
La estructura de la cadena ini es la misma que la de php.ini.
Parámetros ¶
ini
El contenido del archivo ini que va a ser analizado.
process_sections
Al establecer el parámetro process_sections a TRUE, se obtiene una matriz
multidimesional, con los nombres de las secciones y las configuraciones incluidas. El valor
por defecto de process_sections es FALSE
scanner_mode
Puede ser o INI_SCANNER_NORMAL (por defecto) o INI_SCANNER_RAW.
Si INI_SCANNER_RAW es proporcionado, los valores de las opciones no serán
analizadas.
A partir de PHP 5.6.1 también se puede especificar como INI_SCANNER_TYPED. En
este modo, los tipos boolean, null e integer se preservan siempre que sea posible. Los
valores de string "true", "on" y "yes" son convertidos
a TRUE. "false", "off", "no" y "none" se consideran como FALSE. "null" se convierte
a NULL en el modo tipificado. También, todos los string numéricos son convertidos al tipo
integer fuera es posible.
Valores devueltos ¶
Las configuraciones son devueltas como un array asociativo si se tiene éxito, y FALSE si
falla.
Notas ¶
Nota: Hay palabras reservadas que no se deben usar como claves en los archivos ini.
Éstas incluyen: null, yes, no, true, false, on, off, none. Los valores null, off, no y false
resultan en "", y los valores on, yes y true resultan en "1", a menos que se emplee el
modo INI_SCANNER_TYPED. Los caracteres ?{}|&~![()^" no se deben usar en ningún
lugar de la clave y tienen un significado especial en el valor.
Ver también ¶
parse_ini_file() - Analiza un fichero de configuración
add a note
User Contributed Notes 3 notes
up
down
22
epicmaxim at gmail dot com ¶
5 years ago
parse_ini_string_m is analog for a parse_ini_string function.
had to code this function due to the lack of a php 5.3 on some hosting.
parse_ini_string_m:
- ignores commented lines that start with ";" or "#"
- ignores broken lines that do not have "="
- supports array values and array value keys
<?php
function parse_ini_string_m($str) {
if(empty($str)) return false;
$lines = explode("\n", $str);
$ret = Array();
$inside_section = false;
foreach($lines as $line) {
$line = trim($line);
if(!strpos($line, '=')) continue;
$tmp = explode("=", $line, 2);
if($inside_section) {
$key = rtrim($tmp[0]);
$value = ltrim($tmp[1]);
if(preg_match("/^\".*\"$/", $value) || preg_match("/^'.*'$/", $value)) {
$value = mb_substr($value, 1, mb_strlen($value) - 2);
}
$t = preg_match("^\[(.*?)\]^", $key, $matches);
if(!empty($matches) && isset($matches[0])) {
$arr_name = preg_replace('#\[(.*?)\]#is', '', $key);
if(!isset($ret[$inside_section][$arr_name]) || !is_array($ret[$inside_section]
[$arr_name])) {
$ret[$inside_section][$arr_name] = array();
}
if(isset($matches[1]) && !empty($matches[1])) {
$ret[$inside_section][$arr_name][$matches[1]] = $value;
} else {
$ret[$inside_section][$arr_name][] = $value;
}
} else {
$ret[$inside_section][trim($tmp[0])] = $value;
}
} else {
$ret[trim($tmp[0])] = ltrim($tmp[1]);
}
}
return $ret;
}
?>
example usage:
<?php
$ini = '
[simple]
val_one = "some value"
val_two = 567
[array]
val_arr[] = "arr_elem_one"
val_arr[] = "arr_elem_two"
val_arr[] = "arr_elem_three"
[array_keys]
val_arr_two[6] = "key_6"
val_arr_two[some_key] = "some_key_value"
';
$arr = parse_ini_string_m($ini);
?>
Array
(
[simple] => Array
(
[val_one] => some value
[val_two] => 567
)
[array] => Array
(
[val_arr] => Array
(
[0] => arr_elem_one
[1] => arr_elem_two
[2] => arr_elem_three
)
)
)
)
up
down
2
Peter Baylies ¶
5 years ago
Replacement for php_ini_string() for PHP pre 5.3 - uses php_ini_file() and streams
<?php
if ( !function_exists( 'parse_ini_string' ) ) {
function parse_ini_string( $string, $process_sections ) {
if ( !class_exists( 'parse_ini_filter' ) ) {
/* Define our filter class */
class parse_ini_filter extends php_user_filter {
static $buf = '';
function filter( $in, $out, &$consumed, $closing ) {
$bucket = stream_bucket_new( fopen('php://memory', 'wb'), self::$buf );
stream_bucket_append( $out, $bucket );
return PSFS_PASS_ON;
}
}
/* Register our filter with PHP */
stream_filter_register("parse_ini", "parse_ini_filter")
or return false;
}
parse_ini_filter::$buf = $string;
return parse_ini_file( "php://filter/read=parse_ini/resource=php://memory", $process_sec
tions );
}
}
?>
up
down
0
msegit post pl ¶
6 months ago
With function parse_ini_stringM() below you can:
- fix unvalued fields ('key' (invalid) ==> 'key=' (OK) )
- fix unquotted values with equal sign '=' ('key=value_part1=value_part2' ==>
'key="value_part1=value_part2"')
- fix (solve) multidimensional arrays (makes 'key[key1][key2]=value' valid)
function parse_ini_stringM() on
github https://gist.github.com/msegu/c43a871c5a874a1d9bff978b448a0aa4 (here is too
long)
// Example:
$ini = '[a]
b
c=d
e=';
$ini .= '
f[g][2]=h
f[g][i]=j
f[g][][]=k
m=n=o';
Otra opción de la que disponemos es usar la función de PHP ini_set() para modificar temporalmente el valor de la
opción de configuración (durante el script PHP actual) sin tener que modificar el archivo de configuración:
Otra opción de configuración que podemos usar en el archivo php.ini es error_reporting, con la que podremos definir
qué tipos de mensajes deberían ser mostrados. Puede tomar como valor alguna de las constantes predefinidas que se
indican en el enlace facilitado al final de la presenta sección (su descripción también se encuentra en el
archivo php.ini).
También podemos configurar esta opción en tiempo de ejecución usando la función de PHP error_reporting().
1.º <?php
2.º error_reporting(E_ALL | E_STRICT);
1.º ini_set('display_errors', "On");
1.º ...
2.º ?>
Recuerda que tras hacer las modificaciones en el archivo php.ini deberás reiniciar el servidor web Apache.
Configuración regional
Para configurar la zona horaria del servidor web, en el archivo php.ini disponemos de la opción de
configuración date.timezone, que podrá tener como valor uno de los timezones soportados especificados en el enlace
al final de la presente sección.
También podemos usar la función de PHP setlocale(), en la que especificaremos como primer parámetro la salida de
determinadas categorías de funciones en tiempo de ejecución, pudiendo éstas ser:
LC_COLLATE: para la comparación de cadenas de texto, ver strcoll().
LC_CTYPE: para la clasificación y conversión de caracteres, por ejemplo con strtoupper().
LC_MONETARY: para localeconv().
LC_MESSAGES: para los mensajes devueltos por el sistema (disponible si PHP fue compilado con libintl).
error_reporting
(PHP 4, PHP 5, PHP 7)
error_reporting — Establece cuáles errores de PHP son notificados
Descripción ¶
int error_reporting ([ int $level ] )
La función error_reporting() establece la directiva error_reporting en tiempo de
ejecución. PHP tiene varios niveles de errores para notificar, al utilizar ésta función se
define el nivel de duración (tiempo de ejecución) de sus scripts. Si el parámetro
opcional level no se define, la función error_reporting() sólo devolverá el nivel actual de
notificación de error.
Parámetros ¶
level
El nuevo nivel de error_reporting. Este nivel toma una máscara de bit o constantes
nominadas. Al utilizar constantes nominadas se recomienda encarecidamente asegurar la
compatibilidad para versiones futuras. Según se añaden niveles de error, el rango de los
enteros incrementa, por lo que los niveles antiguos de errores basados en enteros no
siempre se comportarán como se esperaba.
Las constantes de niveles de error disponibles, y los significados actuales de esos niveles
de error están descritos en constantes predefinidas.
Valores devueltos ¶
Devuelve el nivel antiguo de error_reporting o el nivel actual si el parámetro level no se
proporciona.
session.auto_start = 0
session.use_only_cookies = 1
session.gc_maxlifetime = 1440
session.cookie_lifetime = 0
session.save_path: indica la ruta en la que se guardarán los archivos temporales de la sesión. Ejemplo
(observa la doble barra inversa, como configuración para Windows:
session.save_path = "c:\\Temp\\Sesiones"
session.cookie_path: indica la ruta en la que se guardarán las cookies de sesión. Ejemplo (observa la doble
barra inversa, como configuración para Windows):
session.cookie_path = "c:\\Temp\\Cookies"
Recuerda que tras hacer las modificaciones en el archivo de configuración deberás reiniciar el servidor web
Apache.
Es recomendable comprobar si las operaciones realizadas con las funciones de archivos explicadas se han realizado
correctamente (mediante los valores que devuelven en caso de error).
También podemos usar readfile() junto la función header() para enviar un archivo de modo que pueda ser descargado
por el usuario:
1.º <?php
2.º $archivo = "test.pdf";
3.º
4.º if( file_exists($archivo) )
5.º {
6.º // Enviamos el PDF al cliente
1.º header("Content-type: application/pdf");
2.º header("Content-Disposition: attachment; filename=".$archivo);
3.º header("Content-length: ".filesize($archivo));
1.º
1.º readfile($archivo);
1.º }
2.º ?>
Parámetros ¶
source
Ruta al fichero de origen.
dest
La ruta de destino. Si dest es un URL, la operación de copiado puede fallar si la envoltura
no admite la sobrescritura de ficheros existentes.
Advertencia
Si el fichero destino ya existe, será sobrescrito.
context
Un recurso de contexto válido creado con stream_context_create().
Valores devueltos ¶
1.º Devuelve TRUE en caso de éxito o FALSE en caso de error.
Ejemplos ¶
Ejemplo #1 Ejemplo de copy()
<?php
$fichero = 'ejemplo.txt';
$nuevo_fichero = 'ejemplo.txt.bak';
if (!copy($fichero, $nuevo_fichero)) {
echo "Error al copiar $fichero...\n";
}
?>
move_uploaded_file
(PHP 4 >= 4.0.3, PHP 5, PHP 7)
move_uploaded_file — Mueve un archivo subido a una nueva ubicación
Descripción ¶
bool move_uploaded_file ( string $filename , string $destination )
Esta función intenta asegurarse de que el archivo designado por filename es un archivo
subido válido (lo que significa que fue subido mediante el mecanismo de subida HTTP
POST de PHP). Si el archivo es válido, será movido al nombre de archivo dado
por destination.
El orden de comprobación es especialmente importante si hay cualquier posibilidad de
que cualquier cosa hecha con los archivos subidos pueda revelar su contenido al usuario,
o incluso a otros usuarios en el mismo sistema.
Parámetros ¶
filename
El nombre de archivo del archivo subido.
destination
El destino del archivo movido.
Valores devueltos ¶
Devuelve TRUE en caso de éxito.
Si filename no es un archivo válido subido, no sucederá ninguna acción,
y move_uploaded_file() devolveráFALSE.
Si filename es un archivo subido válido, pero no puede ser movido por algunas razones,
no sucederá ninguna acción, y move_uploaded_file() devolverá FALSE. Adicionalmente,
se emitirá un aviso.
Ejemplos ¶
Ejemplo #1 Subida de múltiples archivos
<?php
$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
if ($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES["pictures"]["tmp_name"][$key];
// basename() puede evitar ataques de denegación de sistema de ficheros;
// podría ser apropiada más validación/saneamiento del nombre del fichero
$name = basename($_FILES["pictures"]["name"][$key]);
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
}
?>
rename
(PHP 4, PHP 5, PHP 7)
rename — Renombra un fichero o directorio
Descripción ¶
bool rename ( string $oldname , string $newname [, resource $context ] )
Intenta renombrar oldname a newname, moviéndolo a otro directorio si fuera necesario.
Si newname existe, lo sobrescribirá.
Parámetros ¶
oldname
Nota:
El nombre antiguo. La envoltura usada en oldname debe coincidir con la envoltura usada
en newname.
newname
El nuevo nombre.
context
Nota: Soporte para context fue añadido en PHP 5.0.0. Para una descripción de contexts,
refiérase aFlujos.
Valores devueltos ¶
Devuelve TRUE en caso de éxito o FALSE en caso de error.
tmp_name: nombre temporal del archivo subido junto con la ruta temporal (los archivos subidos se guardan
en un directorio temporal).
Comprimir y descomprimir
Desde PHP podremos comprimir y descomprimir archivos y carpetas de forma muy sencilla, pudiendo hacerlo en
los principales formatos de compresión de archivos: gz, rar, zip, etc.
En el siguiente ejemplo puedes ver cómo crear un archivo comprimido en formato ZIP utilizando la
Clase ZipArchive:
1.º <?php
2.º $archivo_origen1 = "logo.jpg";
3.º $archivo_origen2 = "archivo.html";
4.º $archivo_zip = "comprimido.zip";
5.º
6.º // Creamos una instancia de la clase ZipArchive:
7.º $zip = new ZipArchive();
8.º
9.º // Creamos el archivo zip:
1.º if ($zip->open($archivo_zip, ZIPARCHIVE::CREATE) === true )
1.º {
2.º // Añadimos archivos:
1.º $zip->addFile( $archivo_origen1 );
2.º $zip->addFile( $archivo_origen2 );
1.º
2.º // Cerramos el archivo zip:
1.º $zip->close();
1.º
2.º echo "Proceso finalizado";
3.º }
4.º else
5.º {
6.º echo "Ha ocurrido un error";
7.º }
8.º ?>
Recuerda que tras hacer las modificaciones en el archivo php.ini deberás reiniciar el servidor web Apache.
Vea también: [ Enviar EMail con PHP ] - [ Configurar XAMPP para enviar EMail a través de GMail (Windows) ]
Windows Vista: Inicio, Panel de Control, Sistema y Mantenimiento, Sistema, Configuración avanzada del
sistema, y en el cuadro de diálogo que se mostrará haremos clic en el botón Variables de entorno.
Windows XP: Inicio, Panel de Control, Sistema y en el cuadro de diálogo que aparecerá seleccionaremos la
pestaña Opciones avanzadas y después haremos clic en el botón Variables de entorno.
Aparecerá la siguiente ventana, en la que editaremos y crearemos las variables de sistema mencionadas:
A continuación sigue los pasos indicados para el sistema gestor de bases de datos (SGBD) deseado:
MySQL:
Si estás intentando acceder desde un ordenador diferente al que tiene instalado el servidor de bases de datos
MySQL y recibes el mensaje:
Warning: mysql_connect() [function.mysql-connect]: Host 'TU-HOST' is not allowed to connect to this MySQL
server in...
... debes crear un usuario indicando la direccion IP desde la cual podrá acceder (también se le podría dar acceso
desde cualquier IP), y asignarle los permisos deseados del siguiente modo (para ello deberás acceder como
usuario root):
PostgreSQL:
... añade la siguiente línea al archivo de configuración httpd.conf del servidor web Apache (cambia la ruta por
aquella en que se encuentre el archivo libpq.dll en tu ordenador):
Si estás intentando conectar desde un ordenador diferente al que tiene instalado al servidor de bases de datos
PostgreSQL y te aparece el mensaje...
Unable to connect to PostgreSQL server: could not connect to server: Connection refused
Deberás editar otro archivo de configuración de PostgreSQL llamado postgresql.conf, añadiendo la siguiente línea:
Oracle:
En el archivo php.ini descomenta sólo la línea correspondiente a la versión de Oracle que utilices (las últimas
versiones de PHP incluyen soporte para Oracle 11g):
Si vas a acceder a Oracle de forma remota (no lo tienes instalado en el ordenador desde el que vas a acceder a
dicha base de datos) descarga e instala Instant Client desde este enlace:
Marca la opcion Accept License Agreement y selecciona Instant Client Package - Basic: antes de comenzar con
la descarga deberás introducir los datos de acceso de tu cuenta de Oracle, o crear una si no tienes.
En este punto, tras haber realizado los pasos anteriores deberíamos poder realizar la conexión con Oracle.
Aún nos resta un paso más: para configurar el juego de caracteres de modo que aparezcan las letras con tilde así
como las 'ñ' y otros caracteres especiales como el símbolo del euro, en el mismo cuadro de diálogo crea una
variable de entorno llamada NLS-LANG y asígnale el valor SPANISH_SPAIN.WE8MSWIN1252 (consulta el
enlace al final de este apartado para ver otros valores admitidos).
Instant Client 11g funciona con Oracle 9.2, Oracle 10.x y Oracle 11.x.
Si continúas teniendo problemas después de seguir los pasos indicados anteriormente, comprueba también la
configuración de tu cortafuegos o firewall.
Recuerda que tras hacer las modificaciones en el archivo de configuración de PHP deberás reiniciar el servidor web
Apache.
Observa que hemos añadido el Content-type adecuado para enviar el correo electrónico en formato HTML, y
que usamos la etiqueta <br /> para insertar saltos de línea.
Fíjate también que hacemos uso de la función de PHP nl2br(): esto es así porque en los <textarea> se guardan los
saltos de línea con los caracteres utilizados por el sistema operativo, y puesto que vamos a enviar el Email en
formato HTML, con dicha función los convertimos a la etiqueta HTML <br> (si no lo hiciéramos, todo el cuerpo
del mensaje se mostraría en una sola línea).
Vea también: [ Enviar E-Mail ] - [ mail() ]
IMPORTANTE: en caso de que la dirección de correo electrónico especificada en la cabecera no exista o sea
la misma que la del destinatario, algunos servicios de correo electrónico como GMail enviarán el mensaje a la
carpeta de correo no deseado o SPAM.
Luego, por razones de seguridad comprobamos si estamos trabajando realmente sobre un archivo subido al
servidor y lo leemos obteniendo una cadena de texto, que posteriormente dividiremos en otras más pequeñas.
A continuación creamos la cabecera del EMail, teniendo en cuenta que lo siguiente a boundary debe ir entre
comillas dobles.
Después construimos el cuerpo del mensaje (la parte que corresponde al texto del E-Mail) insertando un
separador sl principio (fíjate en que se deben poner dos guiones medios seguidos).
Seguidamente y entre otros separadores, especificamos el comienzo y fin del archivo adjunto.
Una vez realizados todos los pasos, enviamos el correo electrónico (si no se seleccionó un archivo
simplemente se enviaría el texto del E-Mail).
IMPORTANTE: hay que tener en cuenta que si no se selecciona ningún archivo, el array $_POST[] contendrá un
elemento con un valor en la clave error de '4': dicho código informa de que no se subió ningún archivo. Para ver
otros códigos de error comprueba el enlace facilitado a continuación.
A continuación te mostramos otro ejemplo en el que podrás ver cómo enviar varios archivos adjuntos.
03_mail_adjuntos_2.html:
copytextpop-up
1.º <html>
2.º
3.º <head>
4.º <title>Enviar E-Mail desde PHP | informaticapc.com</title>
5.º </head>
6.º
7.º <body>
8.º <form name="frmMail" id="frmMail" action="03_mail_adjuntos_2.php"
method="post" enctype="multipart/form-data">
9.º
10.º Nombre del remitente: <input type="text" name="txtNombre"
id="txtNombre" /><br />
11.º EMail destinatario: <input type="text" name="txtMail"
id="txtMail" /><br />
12.º Mensaje:<br />
13.º <textarea name="txtMensaje" id="txtMensaje" /></textarea><br
/>
1.º Archivo adjunto 1: <input type="file" name="txtFile"
id="txtFile" /><br />
2.º Archivo adjunto 2: <input type="file" name="txtFile2"
id="txtFile2" /><p />
1.º
2.º <input type="submit" name="btnSubmit" value="Enviar" />
3.º
4.º </form>
5.º </body>
6.º
</html>
03_mail_adjuntos_2.html:
7.º <html>
8.º
9.º <head>
10.º <title>Enviar E-Mail desde PHP | informaticapc.com</title>
11.º </head>
12.º
13.º <body>
14.º <form name="frmMail" id="frmMail" action="03_mail_adjuntos_2.php"
method="post" enctype="multipart/form-data">
15.º
16.º Nombre del remitente: <input type="text" name="txtNombre"
id="txtNombre" /><br />
17.º EMail destinatario: <input type="text" name="txtMail"
id="txtMail" /><br />
18.º Mensaje:<br />
19.º <textarea name="txtMensaje" id="txtMensaje" /></textarea><br
/>
1.º Archivo adjunto 1: <input type="file" name="txtFile"
id="txtFile" /><br />
2.º Archivo adjunto 2: <input type="file" name="txtFile2"
id="txtFile2" /><p />
1.º
2.º <input type="submit" name="btnSubmit" value="Enviar" />
3.º
4.º </form>
5.º </body>
6.º
</html>
7.º <?php
8.º /*
9.º En caso de que no puedas enviar los correos electrónicos y no puedas o quieras
10.º editar el archivo de configuración 'php.ini', descomenta las siguientes líneas
con
11.º las que modificamos la configuración en tiempo de ejecución. Si es necesario,
modifica
12.º el valor adecuado.
13.º */
14.º //ini_set('SMTP', "localhost");
15.º //ini_set('smtp_port', 25);
16.º //ini_set('sendmail_from', "postmaster@localhost.com");
17.º //ini_set('display_errors', "On"); // Mostrar los errores (usar sólo durante las
pruebas)
18.º
19.º // Comprobar si llegaron los datos requeridos:
20.º if( !empty($_POST) &&
21.º (isset($_POST['txtNombre']) && !empty($_POST['txtNombre'])) &&
22.º (isset($_POST['txtMail']) && !empty($_POST['txtMail']))
23.º )
24.º {
25.º // Indicar cabecera con el nombre del remitente. Si no indicamos la dirección de
correo puede que
26.º // no se realice el envío a a otros servicios como Hotmail o Yahoo
27.º $cabecera = "From: TU_NOMBRE <TU_CUENTA_DE_EMAIL@TU_SERVIDOR.com>\r\n";
28.º
1.º $datos = "";
2.º $mensaje = "";
3.º $contenido_archivos = "";
4.º $hay_archivos = false;
1.º
2.º // Creamos una cadena aleatoria como separador entre cuerpo y archivos adjuntos:
1.º $separador = md5(uniqid(time()));
1.º
2.º // Recorremos el array para leer cada archivo recibido:
1.º foreach( $_FILES as $adjunto )
1.º {
2.º // Comprobamos si el archivo fue subido, y leemos su contenido:
1.º if( is_uploaded_file($adjunto['tmp_name']) )
1.º {
1.º $hay_archivos = true;
1.º
2.º // Leemos el archivo obteniéndolo como una cadena de texto:
3.º $archivo = fopen($adjunto['tmp_name'], "rb");
1.º $datos = fread( $archivo, filesize($adjunto['tmp_name']) );
1.º fclose($archivo);
2.º
3.º // Dividimos la cadena de texto en varias partes más pequeñas:
1.º $datos = chunk_split( base64_encode($datos) );
1.º
2.º // Continuamos construyendo el cuerpo del mensaje, añadiendo el archivo:
1.º $contenido_archivos .= "--".$separador."\r\n";
2.º $contenido_archivos .= "Content-Type: ".$adjunto['type']."; name='".
$adjunto['name']."'\r\n";
3.º $contenido_archivos .= "Content-Transfer-Encoding: base64\r\n";
4.º $contenido_archivos .= "Content-Disposition: attachment; filename='".
$adjunto['name']."'\r\n\r\n";
5.º $contenido_archivos .= $datos."\r\n\r\n";
1.º }
2.º }
3.º
4.º // Si se subieron archivos creamos las cabeceras necesarias:
1.º if( $hay_archivos == true )
1.º {
1.º // Creamos la cabecera del mensaje:
2.º $cabecera .= "MIME-Version: 1.0\r\n".
3.º "Content-Type: multipart/mixed; boundary=\"".$separador."\"\r\n\r\n";
4.º
5.º // Construimos el cuerpo del mensaje para el texto, añadiendo al final los archivos
adjuntos:
6.º $mensaje = "--".$separador."\r\n";
7.º $mensaje .= "Content-Type:text/plain; charset='iso-8859-1'\r\n";
8.º $mensaje .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
9.º $mensaje .= $_POST['txtMensaje']."\r\n\r\n".$contenido_archivos;
10.º
11.º // Separador de final del mensaje:
12.º $mensaje .= "--".$separador."--";
1.º }
2.º else
3.º {
4.º // No se adjuntó ningún archivo, enviamos sólo el texto del mensaje:
5.º
6.º $mensaje = "Mensaje de: ".$_POST['txtNombre'].PHP_EOL;
7.º $mensaje .= "EMail: ".$_POST['txtMail'].PHP_EOL.PHP_EOL;
8.º $mensaje .= $_POST['txtMensaje'];
9.º }
10.º
11.º // IMPORTANTE: debes sustituir la dirección de correo por aquella en que deseas
recibir el EMail:
1.º $ok = mail( trim($_POST['txtMail']), "Mensaje de prueba", $mensaje, $cabecera );
1.º
2.º if( $ok == true )
3.º echo "<p>El E-Mail ha sido enviado</p>";
4.º else
5.º echo "<p>ERROR al enviar el E-Mail</p>";
6.º
7.º echo "<p>Haz <a href='03_mail_adjuntos_2.html'>clic para volver al
formulario</a></p>";
8.º }
9.º else
10.º {
11.º $html = "<html>";
12.º $html .= "<head>";
13.º
14.º // Después de cuatro segundos de mostrarse esta página web de error se
redirigiría a la URL especificada.
15.º $html .= "<meta http-equiv='refresh' content='4;url=03_mail_adjuntos_2.html'>";
16.º
17.º $html .= "</head>";
18.º $html .= "<body>";
19.º $html .= "No han llegado todos los datos. En unos segundos será redirigido a la
página principal.";
20.º $html .= "</body>";
21.º $html .= "</html>";
22.º
23.º echo $html;
24.º }
?>
Enviar E-Mail usando PHPMailer
La clase PHPMailer es una poderosa herramienta gratuita que nos facilitará la tarea de enviar correos
electrónicos. Puedes descargarla gratis desde los enlaces facilitados al final de este apartado.
En el siguiente ejemplo, mediante PHPMailer accedemos al servidor de correo de GMail para enviar nuestros
correos electrónicos a través de dicho servicio (necesitaremos tener una cuenta en él).
04_mail_phpmailer.html:
copytextpop-up
1.º <html>
2.º <head>
3.º <title>Enviar E-Mail desde PHP | informaticapc.com</title>
4.º </head>
5.º
6.º <body>
7.º <form name="frmMail" id="frmMail" action="04_mail_phpmailer.php"
method="post">
8.º
9.º <textarea name="txtMail" id="txtMail" rows="10"
cols="60"></textarea><p/>
10.º
11.º <input type="submit" name="btnSubmit" value="Enviar" />
12.º
13.º </form>
14.º </body>
</html>
15.º <?php
16.º /*
17.º IMPORTANTE: descarga PHPMailer para tu versión de PHP desde el enlace facilitado
18.º al final de este apartado, y copia los archivos incluídos con 'require()' en la
misma
19.º carpeta del ejemplo.
20.º */
21.º require("class.phpmailer.php");
1.º require("class.smtp.php");
1.º
2.º // Comprobar si se llegaron los datos
1.º if( !empty($_POST) &&
1.º (isset($_POST['txtNombre']) && !empty($_POST['txtNombre'])) &&
2.º (isset($_POST['txtMail']) && !empty($_POST['txtMail'])) &&
3.º (isset($_POST['txtMensaje']) && !empty($_POST['txtMensaje']))
4.º )
5.º {
6.º
7.º try
8.º {
1.º $mail = new PHPMailer(); // Crear una instancia de la Clase
1.º
2.º // Configuraciones para GMail
1.º $mail->Host = "smtp.gmail.com"; // DATOS SERVIDOR CORREO
2.º $mail->SMTPAuth = true; // Indicamos que el servidor requiere
autenticación
3.º $mail->SMTPSecure = "tls";
4.º $mail->Port = "587";
1.º
2.º // Datos de acceso a tu cuenta en GMail (usuario y contraseña):
3.º $mail->Username = "TU_EMAIL@TU_SERVIDOR.com";
4.º $mail->Password = "TU_PASSWORD";
5.º
6.º // FROM (la dirección de correo y el nombre que queremos que vea el usuario que
lee nuestro correo):
7.º $mail->From = "test@prueba.com";
8.º $mail->FromName = "TU NOMBRE";
9.º
10.º // Datos del Mensaje:
11.º $mail->AddAddress($_POST['txtMail'], "DESTINATARIO"); // Email del
DESTINATARIO
12.º $mail->Subject = "Asunto del mensaje"; // ASUNTO
13.º $mail->IsHTML(false); // Indica si el CUERPO
estará en formato HTML
14.º
15.º // Cuerpo del mensaje:
16.º $mail->AltBody = $_POST['txtMensaje']; // ... si el proveedor de correo
de destino no soporta HTML
17.º $mail->Body = nl2br($_POST['txtMensaje']); // ... en HTML (obligatorio)
18.º
19.º // Si se adjuntó un archivo se añade al EMail:
1.º if( empty($_FILES['txtFile']['name']) == false )
2.º $mail->AddAttachment($_FILES['txtFile']['tmp_name'], $_FILES['txtFile']['name']);
1.º
2.º // Enviar el EMail
1.º if(!$mail->Send())
1.º echo "<p>No se puedo enviar el EMail</p>";
2.º else
3.º echo "<p>EMail enviado correctamente</p>";
4.º }
5.º catch(Exception $e )
6.º {
7.º echo "<p>Ha ocurrido un error al enviar el EMail</p>";
8.º }
9.º
10.º }
11.º else
12.º {
13.º echo "<p>No llegaron datos</p>";
14.º }
15.º
16.º echo "<p>Haz <a href='04_mail_phpmailer.html'>clic para volver al
formulario</a></p>";
?>
Fíjate en que debes rellenar algunos datos: escribir tu cuenta de correo y su contraseña en GMail, así como el
nombre que deseas que aparezca como destinatario y la dirección de correo del destinatario.
Al igual que en el apartado anterior, si no te funciona el ejemplo por no tener de un servidor de correo instalado en
tu ordenador prueba a ejecutar la página web desde un alojamiento web, ya que probablemente tendrán un
servidor de correo preparado.
Mostrar y ocultar mensajes de error
Cuando estamos desarrollando una página o aplicación web es recomendable configurar PHP para que muestre los
mensajes de aviso o error, mientras que al pasar el proyecto a producción deberemos desactivarlos.
Para mostrar u ocultar los mensajes debemos tener descomentada la opción de configuración display_errors() en
el archivo php.ini, asignándole los valores 'On' (para mostrarlos) u 'Off' (para ocultarlos):
Otra opción de la que disponemos es usar la función de PHP ini_set() para modificar temporalmente el valor de la
opción de configuración (durante el script PHP actual) sin tener que modificar el archivo de configuración:
Otra opción de configuración que podemos usar en el archivo php.ini es error_reporting, con la que podremos
definir qué tipos de mensajes deberían ser mostrados. Puede tomar como valor alguna de las constantes
predefinidas que se indican en el enlace facilitado al final de la presenta sección (su descripción también se
encuentra en el archivo php.ini).
También podemos configurar esta opción en tiempo de ejecución usando la función de PHP error_reporting().
copytextpop-up
1.º <?php
2.º error_reporting(E_ALL | E_STRICT);
1.º ini_set('display_errors', "On");
1.º ...
?>
Posteriormente iremos al menú Configuration, MercuryC SMTP Client y estableceremos las opciones que
se muestran en la siguiente imagen (en Login username y Password indicaremos la dirección de correo
electrónico y contraseña de nuestra cuenta en GMail, respectivamente):
Es posible que el Email tarde hasta un par de minutos en llegar en ser recibido.
Si ves que el envío se realizó correctamente pero transcurridos unos minutos no te ha llegado el correo
electrónico, comprueba si está en tu carpeta de Correo no deseado o SPAM. Si tampoco lo ves allí comprueba la
configuración de tu cortafuegos o firewall
Recuerda que tras hacer las modificaciones en el archivo php.ini deberás reiniciar el servidor web Apache.