Foros del Web » Programación para mayores de 30 ;) » Programación General »

Buscar en un @ARRAY y MySQL nombres inexistentes.

Estas en el tema de Buscar en un @ARRAY y MySQL nombres inexistentes. en el foro de Programación General en Foros del Web. Hola, Agradecería que alguien me pudiera dar alguna (cualquier) idea de como puedo realizar el siguiente procedimiento: Tengo una aplicación en PHP que carga imágenes ...
  #1 (permalink)  
Antiguo 05/09/2008, 21:13
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años, 1 mes
Puntos: 260
Sonrisa Buscar en un @ARRAY y MySQL nombres inexistentes.

Hola,

Agradecería que alguien me pudiera dar alguna (cualquier) idea de como puedo realizar el siguiente procedimiento:

Tengo una aplicación en PHP que carga imágenes y guarda el nombre del archivo de la imagen en una base de datos. Pero el problema es el siguiente; a veces, no se guarda en la base de datos el registro y el script en PHP genera un error, lo cual es lo adecuado y aceptado en la aplicación; pero para el momento que genera el error el archivo ya fué cargado, copiado n++ veces y modificado en el servidor (intentar hacerlo como una sola transacción resulta demasiado complicado).

Ahora necesito borrar todos los archivos que están en el servidor pero no en la base de datos; tengo el siguiente script que extrae los nombres de los archivos y los registros en la base de datos, pero necesito buscar en @files todos los registros que no estén en la base de datos (5 campos varchar con los nombres de las imágenes).

Código PHP:
#!/usr/bin/perl

print "Content-type: text/html\r\n\r\n";

print 
"<html>";
print 
"<title>Check Bad Upload</title>";
print 
"<body>";

use 
strict;
use 
DBI;

my $upload "../upload";
my $data_source "dbi:mysql:database=XXXXXXXXXX:host=localhost";

opendir(DIR$upload) || die "can't opendir $upload: $!";
my @files grep { !/^./ && !/^sm/ && !/^sz/ && -"$upload/$_" readdir(DIR);
closedir DIR;

my $dbh DBI->connect($data_source"XXXXXXXXXX""XXXXXXXXXX", {'RaiseError' => 1});
my $sth $dbh->prepare("SELECT image1, image2, image3, image4, image5 FROM table01");

$sth->execute();
while (
my $ref $sth->fetchrow_hashref()) {
  print 
"&quot;$ref->{'image1'}&quot;,&quot;$ref->{'image2'}&quot;<br>";
}
$sth->finish();

$dbh->disconnect();

print 
"</body>";
print 
"</html>"
Gracias,
  #2 (permalink)  
Antiguo 06/09/2008, 04:54
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 525
Antigüedad: 18 años, 10 meses
Puntos: 11
Respuesta: Buscar en un @ARRAY y MySQL nombres inexistentes.

No lo he probado, pero la idea es esta:
Código PHP:
my %files map $_ => } @files;

while (
my $ref $sth->fetchrow_hashref()) {
    
delete $files{$ref->{image1}};
    
delete $files{$ref->{image2}};
    
delete $files{$ref->{image3}};
    
delete $files{$ref->{image4}};
    
delete $files{$ref->{image5}};
}

for 
my $file (keys %files) {
    print 
"Aquí, borrar fichero $file\n";
    
# unlink "$upload/$file";

Es decir: pasamos el array de ficheros que tenemos a un hash. Luego, recorremos la base de datos, eliminando los elementos del hash que coinciden con los que aparecen en la base de datos. Los elementos que queden son los ficheros que tenemos que borrar.

Última edición por jferrero; 19/03/2009 a las 12:36
  #3 (permalink)  
Antiguo 06/09/2008, 15:28
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Buscar en un @ARRAY y MySQL nombres inexistentes.

Hola,

Excelente !!!

Muchas gracias, funciona perfecto, ya llevaba bastante tiempo en esto y no encontraba la forma de hacerlo adecuadamente.

Por más que leo la documentación, no entiendo mucho de Perl, como por ejemplo, de las cosas que más que confunden en Perl es que tengo (@files) como un arreglo, ese arreglo lo convertiste en un hash (%files), y no entiendo por que lo tengo que usar en un modo escalar para borrarlo ($files).

Gracias de nuevo,
  #4 (permalink)  
Antiguo 06/09/2008, 15:44
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 525
Antigüedad: 18 años, 10 meses
Puntos: 11
Respuesta: Buscar en un @ARRAY y MySQL nombres inexistentes.

@files y %files son dos variables distintas. Una es un array y la otra, un hash.

Otra cosa es el sigil (el signo que hay delante) que indica el tipo de dato que queremos obtener de ellas.

Es decir, para el caso de @files: si ponemos $files[2] estamos obteniendo un solo valor -el sigil $ indica un valor escalar-, en concreto, el tercer elemento de @files. Pero si ponemos @files[3,7] queremos obtener una lista (@) de dos valores: el cuarto y el octavo elemento de @files.

En el caso de los hash es algo parecido: $files{image1} es un elemento ($) de %files: el que corresponde a la clave 'image1'. Y @files{'image1','image2'} es una lista (@) de dos valores: los que corresponden a las claves 'image1' e 'image2' de %files.

Más información en perldata.
  #5 (permalink)  
Antiguo 07/09/2008, 03:19
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Buscar en un @ARRAY y MySQL nombres inexistentes.

Hola jferrero,

Con esa explicación y el vínculo creo que al fin he entendido como funciona esa parte del lenguaje, me parece que es un lenguaje increíble; con el perdón de todos los demás lenguajes de programación, me atrevería a decir que es un lenguaje mucho más avanzado que todos los demás y estoy seguro que lo voy a usar más seguido.

Una ves que se entiende, su construcción es simple, clara y eficiente. Esta línea: foreach (@array[ 4 .. 10 ]) { s/peter/paul/ }, creo que escribirla más corta y clara en otro lenguaje sería casi imposible. Voy a estudiarlo más.

Gracias de nuevo,
Saludos
  #6 (permalink)  
Antiguo 16/09/2008, 15:53
Colaborador
 
Fecha de Ingreso: mayo-2006
Ubicación: Valladolid
Mensajes: 525
Antigüedad: 18 años, 10 meses
Puntos: 11
Respuesta: Buscar en un @ARRAY y MySQL nombres inexistentes.

Claro que puedes escribirlo más corto... en Perl, claro:
Código PHP:
s/peter/paul/ for @array[4..10]; 

Última edición por jferrero; 19/03/2009 a las 12:38
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:48.