PHP Bug when reusing variables by references

PHP Bug when reusing variables by references

I Just find a bug in PHP when you are reusing variables by references.

This is the example code:

$lines = array(
	'1' => array(
		'1A'
	),
	'2' => array(
		'2A',
		'2B',
		'2C'
	)
);

foreach($lines as &$items){
	foreach($items as $key => $value){
		if($value=='2B') unset($items[$key]);
	}
}

$items = array();
foreach($lines as $key => $items){
	print_r($items);
}

What this code should do, is to take the $lines array and delete the 2B value, but it doesn’t work like that, and is because it get crash when you use the $items variable in the second foreach and you already used it as a referece variable, even if you clean the $items variable with an empty array as you see in the code.

Just if you change the name or the $items variable in the second foreach it works fine.

https://bugs.php.net/bug.php?id=67608

Charlas sobre Aplicaciones Web con Cakephp

Charlas sobre Aplicaciones Web con Cakephp

Desde el próximo sabado 10 de mayo empezaré a dar unas charlas cuyo objetivo serán mostrar a los programadores e ingenieros de sistemas a desarrollar aplicaciones web en CakePHP.

Mi principal objetivo serán los principiantes, así que por esa razón la primera charla de este sabado desde las 9:30AM hasta la 1:00PM será HTML5 + CSS.

¿Quieres asistir? tengo 5 cupos disponibles, no tiene precio, es gratis.

Para esta primera charla tengo unos requisitos que debes cumplir:

  • Ser ingeniero de sistemas o programador.
  • No tener conocimientos de HTML ni CSS, o en su defecto que sea muy poco lo que sabes.
  • Tener ganas de venir y estar 3 1/2 horas hablando y practicando en el tema.
  • Traer tu propio computador

Todos los requisitos anteriores son obligatorios 🙂

Para el sábado siguiente haremos JavaScript + jQuery, así que espera mis indicaciones 🙂

Puedes contactarme por los comentarios de este artículo o por Twitter, Facebook o LinkedIn

Los pasabocas serán invitados por Salgarus 🙂

Esto será en la ciudad de Barranquilla, así que por favor abstenerse personas de otras partes del mundo.

Programador / Ingeniero de Sistemas PHP

Requerimos Ingeniero de Sistemas, programador, con gran habilidad para la desarrollo Web, debe ser una persona capaz de coordinar y organizar su tiempo.

Debe cumplir con las siguientes características:
– Programador PHP, CSS, XHTML con experiencia demostrable
– Gestión de bases de datos MySQL
– Dominio de WordPress demostrable
– Experiencia con BuddyPress
– Experiencia con Joomla
– Experiencia con CakePHP
– Jornada de 8 horas diarias de Lunes a Viernes

Se valora manejo de Frameworks PHP y otros conocimientos adicionales.

Si no cumple con las características por favor no pierda el tiempo enviando su hoja de vida.

Fecha: 17 de octubre de 2012
Localidad: Barranquilla
Departamento: Atlántico
Salario: Enviar aspiración salarial
Comienzo: Inmediatamente
Duración: indefinido
Tipo de trabajo: Tiempo Completo
Solicitudes: envíar currículum por correo
Correo-E:

DropboxUploader ha dejado de funcionar

Hace ya unos días que no se actualizaba mis archivos en dropbox desde un script PHP que tengo hecho, al inspeccionar el script que se ejecutaba en crontab me he dado cuenta que el DropboxUploader habia dejado de funcionar arroja un error de «Login unsuccessful.»

Buscando, encontre que DropBox habia cambiado su formulario de login y por eso esta clase había dejado de funcionar. Pues nada, lo unico que hay que hacr para que esto siga funcionando con normalidad es modificar el método login de la clase DropboxUploader.

Antes teníamos esto:

protected function login() {
    $data = $this->request('https://www.dropbox.com/login');
    $data = $this->request('https://www.dropbox.com/login', true, array('login_email'=>$this->email, 'login_password'=>$this->password));
    if (stripos($data, 'location: /home') === false)
        throw new Exception('Login unsuccessful.');
    $this->loggedIn = true;
}

Pero ahora hay que cambiarlo por esto:

protected function login() {
    $data = $this->request('https://www.dropbox.com/login');
    $matches = array();
    $res = preg_match('#(.*)name=\"t\" value=\"(.*)\"(.*)#', $data, $matches);
    $data = $this->request('https://www.dropbox.com/login', true, array('login_email' => $this->email, 'login_password' => $this->password, 't' => $matches[2]));
    if(stripos($data, 'location: /home') === false)
        throw new Exception('Login unsuccessful.');
    $this->loggedIn = true;
}

y listo ya tenemos funcionando otra vez nuestro dropboxuploader

Variables compartidas en PHP – APC

Los que alguna vez trabajamos con ASP y luego nos pasamos a PHP solo extrañamos una cosa, las variables de Aplicación… Algunos se preguntarán, ¿Qué son las famosas variables de aplicación?

Es muy fácil, la forma mas sencilla de explicarlos es que se imaginen un contador de visitas a una página web, en PHP cómo lo harías? Bueno, tradicionalmente son dos maneras:

  1. Haces una conexión a la base de datos y ya sea en un parametro o en una tabla donde guardas los registros de las visitas, actualizas o insertas lo que tengas que insertar y luego haces una consulta para saber la cantidad de visitas
  2. En un archivo de texto vas guardando la cantidad de visitas + 1 según vayan llegando los visitantes, luego lees el archivo para mostrarlo en la web

Pues en ASP esto es mucho mas fácil, porque puedes tener una variable de Aplicación que es accedida desde cualquier parte del código, lo mejor es que esa variable podrá ser modificada o leída por cualquier session, cualquier cliente y siempre será la misma variable para todos.

Pues bien, en PHP eso también es posible y lo acabo de descubrir… quizás ya tu lo sabías pero yo no (soy de la vieja usanza)… se llama «Caché Alternativo de PHP» que te permite tener variables en memoria para que sea accedida por cualquier cliente.

Aquí tienes toda la documentación http://mx.php.net/manual/es/book.apc.php , pero básicamente son 3 métodos los que mas usas:

  • apc_add — Poner una nueva variable en caché en el almacén de datos
  • apc_store — Guardar una variable en caché en el almacén de datos
  • apc_fetch — Traer una variable almacenada desde la caché

Algunos dirán, «eyyyy!! pero existe memcache», y si, tienen razón, pero son dos cosas diferentes, esto es algo nativo de PHP y ademas no necesitas tener corriendo ningun servicio, en cambio el memcache por si solo gasta memoria, por otro lado, los que usan hosting baratos no siempre cuentan con memcahe, además no siempre vale la pena tener un memcache gastando memoria para almacenar una variable. Todo es la conveniencia, de todas formas es una alternativa nativa.

Espero sea útil, a mi me sirvió 🙂

¿SEO o SEM? Ups, aveces SEM pero prefiero el SEO

En estos días me he metido a google y queria ver como iba el posicionamiento de Bubok Colombia en los buscadores y me he encontrado con esta imagen, y me dije: «Upsss, esto está lleno de campañas SEM, ¿Valdrá la pena hacer SEO?» bueno, soy de los que piensa que el SEO es muy importante, que se debe trabajar en ello ya que es una campaña a futuro, donde el trabajo se ve reflejado en el tiempo… pero cuando veo esta imagen digo: «Si no puedes con el enemigo, compra una campaña SEM 🙂» jajajaj