Outbook

HTML+CSS+JS, Accesibilidad, PHP y más

Datos de búsqueda

Categoría: ‘PHP’

PHP: Partir una variable en varias líneas

Fecha de publicación: 2008/12/01

En ocasiones al escribir el contenido de una variable PHP se emplean líneas distintas que pueden no ser consecutivas, por ejemplo:

$html = $html.'<p>Primer elemento</p>';
$html = $html.'<p>Segundo elemento</p>';
$html = $html.'<p>Tercer elemento</p>';

Cuando sería más correcto:

$html .= '<p>Primer elemento</p>';
$html .= '<p>Segundo elemento</p>';
$html .= '<p>Tercer elemento</p>';

En el segundo ejemplo se ha sustituido la variable después del símbolo "igual" por un punto justo antes de dicho símbolo.

Datos del artículo:

PHP: Crear una paginación de resultados para una consulta MySQL

Fecha de publicación: 2008/11/30

Actualización 2010-03-10: Código de ejemplo corregido (faltaban algunos caracteres).

No es necesario copiar todos estos fragmentos de código: al final del artículo se muestra completo.

El primer paso es definir cuantos registros se quieren mostrar en cada página, en este caso se deja en 10:

// Registros a mostrar en cada página
$regVistos = 10;

Se define una consulta que recupere todos los registros que se vayan a mostrar, con los parámetros mínimos imprescindibles:

// Consulta que devuelve todos los registros
$lista0 = mysql_query(" SELECT * FROM registros");

Se cuentan los registros recuperados por la consulta MySQL:

// Se cuentan los registros devueltos por la consulta SQL $lista0
$totalSql = mysql_num_rows($lista0);

Con los registros que salen divididos por los que se quiere que se vean por cada página, se obtienen las páginas en las que se dividirá el listado de resultados. Se redondea siempre hacia arriba con ceil, ya que si, por ejemplo, salen 3,4 páginas, ese 0,4 que queda suelto, debe ocupar una página entera:

// Páginas que van a aparecer, redondeando los decimales siempre hacia arriba
$pagTotal = ceil($totalSql/$regVistos);

Son también necesarios los datos de la página actual, la anterior y la siguiente. En este ejemplo la página actual se recoge del parámetro de la URL pag. Si ese parámetro no está definido, se predetermina en 1. Las páginas anterior y siguiente se obtienen restando o sumando 1 según sea necesario:

// Se definen la página actual (desde el parámetro 'pag' de la URL) y las páginas anterior y siguiente
if (!isset($_GET['pag'])) {$pagActual=1;} else {$pagActual=$_GET['pag'];}
$pagAnterior = $pagActual-1;
$pagSiguiente = $pagActual+1;

Es el momento de realizar la consulta MySQL para mostrar los registros. En este caso la consulta devolverá los mismos registros que en la anterior, pero se le ha añadido ordenación descendente (es opcional) y el parámetro LIMIT. El parámetro LIMIT contiene dos números separados por comas: el primero es que el registro por el que se empieza el listado (la página actual menos 1 por los registros a mostrar en cada página), y el segundo el número de registros a mostrar. Ejemplo:

// Consulta SQL con la que se sacará el listado de registros
$lista1 = mysql_query(" SELECT * FROM registros ORDER BY campo DESC LIMIT ".(($pagActual-1)*$regVistos).",".$regVistos."");
// Bucle para generar el listado de registros
while($fila = mysql_fetch_assoc($lista1)) {
 // Aquí irá el código PHP que escriba los registros
}

Finalmente se genera el listado de páginas mediante una lista desordenada (UL).

El primer elemento de la lista será el enlace a la página anterior, mostrándose con la condición de que la página actual no sea la primera.

Se mostrarán los números de página mediante un bucle, destacando la página actual mediante un elemento strong.

Y el último elemento de la lista será el enlace a la página siguiente.

Ejemplo:

// Se inicia el listado de páginas
echo '<ul>';

// Si la página actual no es la primera, se muestra el enlace a la página anterior
if ($pagAnterior>0) {echo '<li class="anterior"><a href="lista.php?pag='.$pagAnterior.'"><span class="oculto">Página </span>Anterior</a></li>';}

// Se saca el listado de páginas mediante un bucle
$pgIntervalo = 3; // Páginas que aparecen antes y después de la actual
$pgMaximo = ($pgIntervalo*2)+1; // Máximo de páginas en el listado
$pg=$pagActual-$pgIntervalo;$i=0;
while ($i<$pgMaximo) {
 if ($pg==$pagActual) {$strong=array('<strong>','</strong>');} else {$strong=array('','');}
 if ($pg>0 and $pg<=$pagTotal) {
  echo '<li>'.$strong[0].'<a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pg.'"><span class="oculto">Página </span>'.$pg.'</a>'.$strong[1].'</li>';
  $i++;
 }
 if ($pg>$pagTotal) {$i=$pgMaximo;} // Si la página que se va a mostrar se pasa de la cantidad de páginas definidas en $pagTotal se para la generación de elementos de lista
 $pg++;
}

// Si la página actual no es la última, se muestra el enlace a la página siguiente
if ($pagSiguiente<=$pagTotal) {echo '<li class="siguiente"><a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pagSiguiente.'"><span class="oculto">Página </span>Siguiente</a></li>';}

// Se finaliza el listado de páginas
echo '</ul>';

Y de esta forma se obtiene una paginación en PHP.

Ejemplo completo

<?

// Registros a mostrar en cada página
$regVistos = 10;

// Consulta que devuelve todos los registros
$lista0 = mysql_query(" SELECT * FROM registros");

// Se cuentan los registros devueltos por la consulta SQL $lista0
$totalSql = mysql_num_rows($lista0);

// Páginas que van a aparecer, redondeando los decimales siempre hacia arriba
$pagTotal = ceil($totalSql/$regVistos);

// Se definen la página actual (desde el parámetro 'pag' de la URL) y las páginas anterior y siguiente
if (!isset($_GET['pag'])) {$pagActual=1;} else {$pagActual=$_GET['pag'];}
$pagAnterior = $pagActual-1;
$pagSiguiente = $pagActual+1;

// Consulta SQL con la que se sacará el listado de registros
$lista1 = mysql_query(" SELECT * FROM registros ORDER BY campo DESC LIMIT ".(($pagActual-1)*$regVistos).",".$regVistos."");
// Bucle para generar el listado de registros
while($fila = mysql_fetch_assoc($lista1)) {
 // Aquí irá el código PHP que escriba los registros
}

// Se inicia el listado de páginas
echo '<ul>';

// Si la página actual no es la primera, se muestra el enlace a la página anterior
if ($pagAnterior>0) {echo '<li class="anterior"><a href="lista.php?pag='.$pagAnterior.'"><span class="oculto">Página </span>Anterior</a></li>';}

// Se saca el listado de páginas mediante un bucle
$pgIntervalo = 3; // Páginas que aparecen antes y después de la actual
$pgMaximo = ($pgIntervalo*2)+1; // Máximo de páginas en el listado
$pg=$pagActual-$pgIntervalo;$i=0;
while ($i<$pgMaximo) {
 if ($pg==$pagActual) {$strong=array('<strong>','</strong>');} else {$strong=array('','');}
 if ($pg>0 and $pg<=$pagTotal) {
  echo '<li>'.$strong[0].'<a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pg.'"><span class="oculto">Página </span>'.$pg.'</a>'.$strong[1].'</li>';
  $i++;
 }
 if ($pg>$pagTotal) {$i=$pgMaximo;} // Si la página que se va a mostrar se pasa de la cantidad de páginas definidas en $pagTotal se para la generación de elementos de lista
 $pg++;
}

// Si la página actual no es la última, se muestra el enlace a la página siguiente
if ($pagSiguiente<=$pagTotal) {echo '<li class="siguiente"><a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pagSiguiente.'"><span class="oculto">Página </span>Siguiente</a></li>';}

// Se finaliza el listado de páginas
echo '</ul>';
?>

Datos del artículo:

PHP: redondeo de números decimales hacia abajo (floor)

Fecha de publicación: 2008/11/30

La función PHP floor permite eliminar la parte decimal de un número redondeándolo hacia abajo. Por ejemplo, 11.22 se redondearía a 11, 11.9999 se redondearía a 11:

echo floor(11.22); // 11
echo floor(11.9999); // 11

Para realizar el redondeo hacia arriba se usa ceil.

Saber más sobre floor.

Datos del artículo:

PHP: recuperar la URL completa de la página actual

Fecha de publicación: 2008/10/07

Se puede realizar mediante esta sencilla función:

function averiguaUrl() {
 $protocolo = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http'; // Se extrae el protocolo (http o https)
 return $protocolo.'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // Se devuelve la URL completa
}

Visto en PHP Tutorials Examples: Get Full URL.

Datos del artículo:

PHP: number_format (formateo de numeros)

Fecha de publicación: 2008/07/11

Cuando se hacen operaciones aritméticas en PHP pueden salir números con un montón de decimales, no llevan el punto (o la coma si se está escribiendo en inglés) para separar los miles, ni la coma para los decimales.

Pero la gente del PHP ha pensado en ello y nos proporcionan una función para solventar con facilidad estos ligeros inconvenientes: number_format()

Su uso es muy sencillo, solo han de introducirse los párametros en el siguiente orden:

  • Variable que represente al número.
  • Número de decimales.
  • Lo que se quiera que aparezca para separar los decimales (punto o coma).
  • Lo que se quiera que aparezca para separar los miles (punto o coma).

Un ejemplo de uso:

$numero = 7219091.429939281617
number_format($numero, 2, ",",".");
/* Devuelve: 7.219.091,43 */

Enlaces relacionados

Datos del artículo:

PHP: clase para recortar imágenes

Fecha de publicación: 2008/06/12

Hoy me he encontrado con una clase PHP para recortar imágenes.

He aquí el código para la clase (solo le he añadido un pequeño detalle para poder elegir el tamaño de la imagen resultante):

class cropImage {
 var $imgSrc,$myImage,$cropHeight,$cropWidth,$x,$y,$thumb;

 function setImage($image) {

  //Your Image
  $this->imgSrc = $image;

  //getting the image dimensions
  list($width, $height) = getimagesize($this->imgSrc);

  //create image from the jpeg
  $this->myImage = imagecreatefromjpeg($this->imgSrc) or die("Error: Cannot find image!");
  if($width > $height) $biggestSide = $width; //find biggest length
  else $biggestSide = $height;

  //The crop size will be half that of the largest side
  $cropPercent = .5; // This will zoom in to 50% zoom (crop)
  $this->cropWidth   = $biggestSide*$cropPercent;
  $this->cropHeight  = $biggestSide*$cropPercent;

  //getting the top left coordinate
  $this->x = ($width-$this->cropWidth)/2;
  $this->y = ($height-$this->cropHeight)/2;
}

 function createThumb($size) {
  $thumbSize = $size; // will create a 250 x 250 thumb
  $this->thumb = imagecreatetruecolor($thumbSize, $thumbSize);
  imagecopyresampled($this->thumb, $this->myImage, 0, 0,$this->x, $this->y, $thumbSize, $thumbSize, $this->cropWidth, $this->cropHeight);
 }

 function renderImage() {
  header('Content-type: image/jpeg');
  imagejpeg($this->thumb);
  imagedestroy($this->thumb);
 }

}

Y se utiliza con el siguiente código:

$image = new cropImage;
$image->setImage($img);
$image->createThumb($size);
$image->renderImage();

La variable $img es la url de la imagen original, y la variable $size es el tamaño de imagen (sale con forma de cuadrado), tanto de anchura como de altura (ha de ser un número entero).

Datos del artículo:

PHP: manejo de sesiones

Fecha de publicación: 2008/06/05

Siempre que se vaya a hacer algo con sesiones debe añadirse este fragmento en el código (antes de cualquier otra cosa que envíe datos al navegador):

session_start();

Posteriormente se pueden definir (o redefinir) variables de sesión, en este caso si el usuario está registrado y el idioma de preferencia:

$_SESSION['logado'] = 'si';
$_SESSION['idioma'] = 'ingles';

O destruir las variables de sesión anteriormente definidas:

$_SESSION = array();
session_destroy();

Se puede definir el tiempo que durará la sesión (hay que ponerlo antes del session_start();), en este caso 1 hora (3600 segundos):

session_set_cookie_params(3600);

Saber más sobre sesiones en PHP

Datos del artículo:

Joomla: modificación de la salida HTML en listados de navegación

Fecha de publicación: 2008/05/23

Para Joomla 1.0.15

En ocasiones hay listados de navegación en los que uno o más elementos tienen un aspecto diferente al predeterminado, y necesitan una clase o identificador para poder llamarlos en un slector CSS, o se quiere introducir cualquier otra modificación en la salida de HTML.

Para modificar el listado hay que modificar el archivo modules/mod_mainmenu.php. En la línea 347 (aproximadamente) encontramos el siguiente código:

echo '<ul id="'. $menuclass .'">';
foreach ($links as $link) {
 echo '<li class="lista">' . $link . '</li>';
}
echo '</ul>';

Y sustituirlo el foreach por un while:

$numl=0;
while ($numl < count( $links )) {
echo '<li class="lista-'.$numl.'">' . $links[$numl] . '</li>';
 $numl  ;
}
echo '</ul>';

Datos del artículo:

  • Etiquetas:
  • Publicado en categorías: PHP
  • Comentarios desactivados en Joomla: modificación de la salida HTML en listados de navegación

PHP: redondeo de números decimales hacia arriba (ceil)

Fecha de publicación: 2008/04/21

Actualizado: 2008-11-30

La función PHP ceil permite eliminar la parte decimal de un número redondeándolo hacia arriba. Por ejemplo, 11.22 se redondearía a 12, 11.9999 se redondearía a 12:

echo ceil(11.22); // 12
echo ceil(11.9999); // 12

Para realizar el redondeo hacia abajo se usa floor.

Saber más sobre ceil.

Datos del artículo:

PHP: recoger fragmentos de una cadena mediante preg_match_all

Fecha de publicación: 2008/03/26

Supongamos que tenemos un texto largo en HTML que forma una cadena de texto:

<p>Listado de elementos</p>
<ul>
 <li><a href="#">Elemento 1</a></li>
 <li class="elegido"><a href="#">Elemento 2</a></li>
 <li><a href="#">Elemento 3</a></li>
 <li><a href="#">Elemento 4</a></li>
 <li class="elegido"><a href="#">Elemento 5</a></li>
 <li><a href="#">Elemento 6</a></li>
</ul>

Y queremos sacar únicamente los elementos LI con class="elegido".

Esto es posible con la funcion PHP preg_match_all, que nos devolverá un array con los fragmentos que haya encontrado:

<?
$htmlOriginal = '<p>Listado de elementos</p>
<ul>
 <li><a href="#">Elemento 1</a></li>
 <li class="elegido"><a href="#">Elemento 2</a></li>
 <li><a href="#">Elemento 3</a></li>
 <li><a href="#">Elemento 4</a></li>
 <li class="elegido"><a href="#">Elemento 5</a></li>
 <li><a href="#">Elemento 6</a></li>
</ul>';

$htmlABuscar = '/<li class="elegido".*li>/';

preg_match_all($htmlABuscar, $htmlOriginal, $htmlFinal);

echo $htmlFinal[0]; // <li class="elegido"><a href="#">Elemento 2</a></li>
echo $htmlFinal[1]; // <li class="elegido"><a href="#">Elemento 5</a></li>
?>

Saber más sobre preg_match_all.

Datos del artículo:

Información del sitio