PHP

web. Páginas PHP

preguntas relacionadas con código y funciones PHP

Intento acceder a ficheros remotos mediante la función de PHP file_get_contents pero acaba dando timeout ¿Cómo lo puedo solucionar?

Por seguridad, para que la función file_get_contents() trabaje con ficheros remotos, es necesario que indique la IP desde la que su servidor web realizará la petición. Para ello, dentro de la función debe especificar el parámetro "context" tal y como se indica en el siguiente ejemplo:

<?php
$opts = array(
'socket' => array(
'bindto' => $_SERVER[‘SERVER_ADDR’] . ':0',
),
);

$context = stream_context_create($opts);
$contents = file_get_contents('http://URL_EXTERNA/FICHERO', FALSE, $context);
// ejemplo que muestra el resultado de hacer la llamada con file_get_contents();
echo ($contents === false) ? 'error' : htmlentities($contents);
?>

Al acceder a mi página obtengo el error “user already has more than ‘max_user_connections’ active connections”

Este mensaje es una medida de seguridad del servidor ante una avalancha de peticiones que no se deberían producir, salvo sitios con una carga real de visitantes.

Si su sitio web no está teniendo una carga excesiva de visitantes y está obteniendo este mensaje, puede ser debido a una incorrecta programación/configuración que está abriendo conexiones a los servidores MySQL sin haber cerrado conexiones previas.

En mi servidor web se están mostrando los mensajes de Warning y Notice de PHP, ¿cómo puedo hacer que no se muestren en pantalla?

Para evitar que los avisos Notice y Warning se muestren en pantalla, basta con añadir la siguiente línea en su fichero .htaccess:
php_value error_reporting 1

Para sitios web en producción puede hacer que no se muestre ningún mensaje de error en pantalla añadiendo lo siguiente en el fichero .htaccess:
php_value display_errors 0

He configurado mi espacio web para que use UTF-8 como codificación por defecto, pero al obtener resultados de la base de datos no se muestran correctamente ¿Cómo puedo solucionarlo?

Si al mostrar contenidos de la base de datos en sus páginas codificadas en utf-8, no se muestran correctamente, puede ser debido a:

  • Su base de datos y/o tabla no tiene configurado el charset en utf-8
  • Los datos contenidos en su base de datos no están almacenados en UTF-8

Para que los datos obtenidos de su base de datos se muestren correctamente, deberá asegurarse de que su base de datos tiene configurado el charset en utf-8 y que los datos se están almacenando en utf-8.

Otra opción es establecer en sus páginas PHP que los resultados MySQL se codifiquen en utf-8 antes de mostrarlos, tal y como se indica en el siguiente ejemplo:
<?php
// Conectar con la base de datos
$connect=mysql_connect($host, $user, $pass);
mysql_select_db($db, $connect);

// establecer que los resultados MySQL se codifiquen en UTF-8
mysql_query("SET NAMES 'utf8'", $connect);

// Operaciones con la base de datos

?>

Intento enviar un menaje en UTF-8 desde PHP paro el receptor no lo ve correctamente

Asegúrese de que a la hora de enviar el mensaje, esté indicando que e mismo está codificado en UTF-8.

A continuación le mostramos un ejemplo de envío de correo indicando que la codificació es UTF-8:

<?php
$headers = "MIME-Version: 1.0rn";
$headers .= "Content-type: text/html; charset=UTF-8rn";
$headers .= "From: usuario@mipropiodominio.comrn";

$message="áéíóú ñ";

$subject="prueba de codificación";

$to="usuario2@mipropiodominio.com";

mail($to, $subject, $message, $headers);
?>

Intento obtener un fichero remoto mediante la funcion file, pero no consigo ver su contenido. ¿Cómo lo soluciono?

Por motivos de seguridad, la función file de PHP alojada en nuestros servidores no puede obtener contenidos de sitios web remotos.

Para llevar a cabo esta operación utilice la función cURL de la siguiente manera:

<?
$url_remota='http://ejemplo.com/fichero.txt';
$fp=fopen('resultado.txt','w');
$ch = @curl_init($url_remota);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_INTERFACE, $_SERVER[‘SERVER_ADDR’]);
fwrite(curl_exec($ch));
curl_close($ch);
fclose($fp);
?>

Con este ejemplo habrá leido el fichero alojado en http://ejemplo.com/fichero.txt y su salida se guardará en el fichero resultado.txt de su propio servidor web.

Tengo una página PHP que realiza varias operaciones y hasta que no finalizan no se muestra en pantalla, pero siempre me da error antes de finalizar. ¿Cómo lo soluciono?

Esto ocurre porque su página no ha enviado ninguna información al navegador, y por lo tanto se ha superado el tiempo de inactividad.

Para evitar que la conexión con el servidor se cierre por haber superado el tiempo de inactividad antes de finalizar sus operaciones, haga que se envíe información al navegador cada cierto tiempo.

El siguiente ejemplo envía intormación al navegador cada segundo:

<?php
set_time_limit (600);

for ($i = 1; $i <= 70; $i++) {
sleep(1);
echo '.';
flush();
ob_flush();
echo '<BR>Se finalizaron todas las tareas.';
}
?>

Trabajo con sesiones en mis paginas PHP pero al pedirlas con el navegador me devuelve el siguiente codigo: session_start(): Cannot send session cookie – headers already sent …

Este mensaje de error se está mostrando porque está usando sesiones basadas en cookies y ESTÁ INICIANDO LA SESIÓN después de haber incluido algo de código en su página.

Para solucionar este error DEBE INICIAR LA SESIÓN ANTES de incluir cualquier tipo de código en la página.

NOTA: Este modo de funcionamiento está documentado en el manual de PHP.

¿Cómo accedo a bases de datos MySQL desde mis paginas PHP?

Para acceder a las bases de datos MySQL desde páginas web y realizar operaciones (insertar, consulta, borrar) sobre los registros es preciso que programe las páginas en una tecnología orientada al uso de estas.

A continuacion veremos un ejemplo de una conexion con el servidor MySQL y consulta desde paginas PHP (Cambie los valores en negrita por los creados en su panel de configuración):

<?php
/*Datos para la conexión*/
$host=’mysql-server; /*Nombre del Servidor MySQL*/
$user=’usuario-mysql‘; /*Usuario web para la conexion*/
$pass=’miclave‘; /*contraseña del usuario*/
$db=’nombre-base-datos‘; /*Nombre de la Base de datos*/
$table=’tabla‘; /*Tabla sobre la que se va a trabajar*/

/*Realiza la conexión con la base de datos*/
$connect=mysql_connect($host, $user, $pass)
or die(“Error 1: “.mysql_error());

/*Selecciona la base de datos*/
mysql_select_db($db, $connect);

/*Realiza la consulta*/
$consult=”SELECT * FROM $table”;
$query=mysql_query($consult,$connect)
or die(“Error 2: “.mysql_error());

/*Muestra los resultados*/
while($row = mysql_fetch_array($query))
{
echo $row[“campo_1″];
echo ” “;
echo $row[“campo_N”];
echo ”
“;
}

/*Libera la consulta de la memoria*/
mysql_free_result($query)
or die(“Error 3: “.mysql_error());

/*Cierra la conexión*/
mysql_close($connect);

?>

¿Cómo configuro un formulario por e-mail mediante páginas PHP?

Para configurar un formulario de envío de datos en una página PHP con su dominio alojado en nuestros servidores consulte en la sección de asistentes en dentro de este mismo sitio web.

Tenga en cuenta que al menos una de las dos direcciones, remitente o destinatario, deberá ser un buzón de correo de un dominio alojado y con servicio de correo contratado en nuestros servidores. Si existe más de un destinatario y el remitente no es un buzón alojado, todos los destinatarios han de ser cuentas alojadas con servico de correo contratado en nuestros servidores.

¿Cómo establezco el default_charset de PHP?

Desde la versión 5.6 de PHP el default_charset ha sido establecido por defecto a UTF-8. Si necesita establecer un default_charset a otro diferente, en un fichero .htaccess dentro de su espacio web incluya el siguiente código:

php_value default_charset CHARSET

Donde CHARSET es la codificación que necesitan sus páginas. Por ejemplo. Si sus páginas están codificadas en iso-8859-1:

php_value default_charset iso-8859-1

¿Cómo modifico la cantidad de memoria que pueden utilizar mis páginas PHP?

Para ampliar el tamaño máximo de la memoria que puede utilizar su página PHP, a través de ftp añada un fichero “.htaccess” en su espacio web con el siguiente contenido:

php_value memory_limit 32M

Siendo 32M, el tamaño máximo expresado en MB.

¿Cómo muestro las variables pasadas a paginas PHP a traves de formularios y la URL?

A la hora de trabajar con páginas PHP puede ser que necesitemos incluir variables que vienen de otras páginas anteriores.

Estas variables pueden venir de dos formas, a través de un formulario (por ejemplo un libro de visitas) o a través de la URL en el navegador (por ejemplo un enlace que incluya un id para una consulta).

Para mostrar estos tipos de variables en la página PHP actual tenemos incluir el siguiente código:

En caso de que la variable llegue a través de un formulario:

<INPUT Type="text" name="nombre">

La variable hay que mostrarla en la página PHP de la siguiente manera:

echo $_POST[‘nombre’];

En el caso de que la variable se pase en el enlace a la página:

<a href="pagina.php?id=1" >

El código necesario en la página PHP será:

echo $_GET[‘id’];

¿Cómo puedo ampliar el tamaño máximo de subida a través de mis páginas PHP?

Para ampliar el tamaño de subida para ficheros a través de su espacio web, añada un fichero “.htaccess” con el siguiente contenido:

php_value upload_max_filesize 10M
php_value post_max_size 10M

Siendo “10M” el tamaño máximo de subida (10M es un ejemplo, puede poner otro valor diferente).

No obstante para subidas de ficheros grandes, es recomendable realizar esta subida por ftp, en lugar de hacerlo mediante formularios web.

Nota: Edite y/o cree el fichero .htaccess con un editor de texto plano (notepad, notepad++, etc).

¿Cómo puedo ampliar el tiempo de ejecución de mis páginas PHP?

Por defecto las paginas PHP tienen un límite de 30 segundos en su ejecución. Si desea que este tiempo sea mayor, indique al principio de su código la siguiente función:

<?
set_time_limit(60);
?>

Donde 60 es un número en segundos que la página PHP debe esperar antes de mostrar un timeout.

¿Cómo puedo guardar en un fichero los errores de PHP que genera mi página web?

Para poder guardar un log de los errores generados por sus páginas PHP, debe habilitarlo en un fichero .htaccess de su web.

Cree un fichero .htaccess en la carpeta raíz de su web e incluya el siguiente contenido:

php_value error_log /RUTA/DEL/FICHERO/php.log
php_value error_reporting NIVEL_DE_ERROR

Sustituya /RUTA/DEL/FICHERO/php.log por la ruta donde desea alojar el fichero de log (consulte su DOCUMENT_ROOT mediante la funcion phpinfo() de PHP). Indique una carpeta dentro de su espacio web, pero no en la raíz. La carpeta tiene que existir, por lo que debe crearla previamente a través de ftp.
Sustituya NIVEL_DE_ERROR por el nivel de error que desea almacenar en el log, por ejemplo 3.

Dentro de la carpeta donde va a almacenar el fichero de log, incluya otro fichero .htaccess con el siguiente contenido:

Order allow,deny
deny from all

De esta forma, ningún usuario malintencionado podrá acceder a su fichero de log de errores PHP, mientras que usted podrá descargarlo mediante ftp.

¿Cómo puedo instalar mi propia versión de PEAR y paquetes dentro de mi espacio web?

Para instalar su propia versión de Pear con los paquetes que desee, descargue la versión básica de pear y súbala dentro de su espacio web.

Los paquetes que desee añadir subalos a la misma carpeta donde instaló Pear.

Para utilizar Pear en sus páginas php, en el fichero .htaccess incluya la siguiente línea:

php_value include_path /ruta/de/instalacion/de/PEAR

Si no desea modificar el fichero .htaccess, en las páginas php que vayan a utilizar Pear, incluya la siguiente línea:

ini_set("include_path", $_SERVER[‘DOCUMENT_ROOT’] . "/PEAR/" . PATH_SEPARATOR . ini_get("include_path"));

¿Cómo puedo leer ficheros xml de webs externos con DOMDocument?

Para que DOMDocument pueda leer ficheros xml de webs externos (Por ejemplo, de un API), es necesario indicar la IP por la que se realiza la petición. Para ello tendrá que utilizar un código como el del siguiente ejemplo:

<?php
$opts = array(
'socket' => array(
'bindto' => $_SERVER[‘SERVER_ADDR’].':0',
),
);

$context = stream_context_create($opts);
libxml_set_streams_context($context);

$doc = new DOMDocument();

$doc->load('URL_DEL_FICHERO');

?>

¿Cómo puedo mostrar en pantalla los errores de PHP?

Para habilitar que los errores PHP se muestren en pantalla, en su espacio web cree un fichero .htaccess con el siguiente contenido:

php_flag display_errors 1

Para volver a deshabilitar la visualización de estos errores cambie el valor a 0:

php_flag display_errors 0

¿Cómo puedo saber si un mensaje enviado a través de la función mail fue enviado?

Para saber si un mensaje enviado desde sus páginas web a través de la función mail se envió con éxito o no, modifique la parte correspondiente de su código PHP para que sea similar al siguiente:

if (mail($To,$Subject,$Body,$Headers,$Param)){
print("El mensaje se envió correctamenten");
}else{
print("El mensaje no se pudo enviarn");
}

¿Cómo puedo utilizar PHPMailer para enviar correo a través de smtp.mipropiodominio.com?

Para poder enviar correo a través de smtp.mipropiodominio.com con la librería PHP Mailer tiene que indicar a través de qué ip realizar la conexión. Para ello debe editar el fichero class.smtp.php y sustituir las líneas:

#connect to the smtp server
$this->smtp_conn = fsockopen($host,    # the host of the server
                                  $port,    # the port to use
                                  $errno,   # error number if any
                                  $errstr,  # error message if any
                                  $tval);   # give up after ? secs

Por:

if (function_exists('stream_context_create') && function_exists('stream_socket_client')) {
  $socket_options = array('socket' => array('bindto' => $_SERVER[‘SERVER_ADDR’].':0'));
  $socket_context = stream_context_create($socket_options);
  $this->smtp_conn = stream_socket_client($host.':'.$port, $errno, $errstr, $tval, STREAM_CLIENT_CONNECT, $socket_context);
} else {
  $this->smtp_conn = @fsockopen($host, // the host of the server
      $port, // the port to use
      $errno, // error number if any
      $errstr, // error message if any
      $tval); // give up after ? secs
}

¿Cómo se si un visitante está conectado a través de la conexión segura SSL de mi servidor web?

Para saber si un visitante ha conectado a su servidor web a través de la conexión segura SSL de su servidor web, tendrá que comprobar la existencia de la variable de servidor HTTP_HTTPS

Por ejemplo:
<?
if (isset($_SERVER[‘HTTP_HTTPS’])){
echo "conexion por https";
}
?>

Recuerde que para ello debe disponer previamente de un certificado seguro SSL

¿Debo cerrar las conexiones a la base de datos MySQL en mis páginas PHP?

Según la propia documentación de PHP las conexiones a la base de datos se cierran al finalizar el script de forma automática, siempre y cuando no sean conexiones persistentes. Desaconsejamos el uso de conexiones persistentes a la base de datos.

Aún así es recomendable que cierre sus conexiones a la base de datos para mejorar el rendimiento de su aplicación.

No cerrar las conexiones MySQL abiertas en sus páginas PHP puede llegear causar que su aplicación se bloquee a sí misma y no pueda abrir nuevas conexiones a la base de datos.

Si necesita más información al respecto, consulte la documentación de PHP

¿Qué librerías estan habilitadas para poder utilizar en mis páginas PHP?

Actualmente y en proceso de revisión para su ampliación, están instaladas las librerías siguientes:

  • php_gd2 -> Libreria para tratamiento de imágenes
  • php_zip -> Libreria para tratamiento de ficheros comprimidos en zip
  • php_curl -> Libreria para la comunicación a diferentes tipos de servidores con diferentes tipos de protocolos

Las librerías instaladas en nuestros servidores han sido probadas para verificar su funcionamiento.

¿Qué necesito para poder utilizar la extensión CURL en mi aplicación web?

La extensión CURL está activada en el servidor web. Para que su aplicación funciona con normalidad necesita establecer la variable CURLOPT_INTERFACE de la siguiene forma:

curl_setopt($ch, CURLOPT_INTERFACE, $_SERVER[‘SERVER_ADDR’]);

Ejemplo:

<?
/* Abre la conexión */
$ch = curl_init("http://direccion_url");

curl_setopt($ch, CURLOPT_INTERFACE, $_SERVER[‘SERVER_ADDR’]);

/* Pide el fichero */
$x = curl_exec($ch);

/* Muestra el resultado */
echo $x;

/* Finaliza */
curl_close($ch);
?>

¿Qué necesito para poder utilizar la extensión SOAPClient en mi aplicación web?

Por seguridad, para que la llamada a SoapClient conecte con servicios externos, es necesario que indique la IP desde la que su servidor web realizará la petición. Para ello, dentro de la función debe especificar el parámetro "context" tal y como se indica en el siguiente ejemplo:

$options = array('socket' => array('bindto' => $_SERVER[‘SERVER_ADDR’].':0'));
$context = stream_context_create($options);

$oSoapClient = new SoapClient("service.wsdl", array('uri' => 'otros_parametros', 'stream_context' => $context));
?>

¿Se pueden alojar páginas PHP con mis planes hosting en Nora?

Si, es posible alojar páginas web desarrolladas en tecnología PHP para sus planes hosting en nuestros servidores.

Consulte el sitio web comercial de Nora, para más información sobre servicios relacionados en el siguiente enlace :
http://nora.es

 

Si no ha encontrado respuesta a su consulta técnica utilice el siguiente formulario para plantearnos su pregunta.