Selezionare immagini obsolete
Selezionare immagini obsolete postato il 13/04/2019 12:36:34 nel forum programmazione, open source e hosting
Ciao ragazzi,
vi scrivo perché avrei urgentemente del vostro aiuto. Sostanzialmente nel mio GDR ho una directory /immagini/corporazioni all'interno della quale ci sono una cosa cosa 8000 file immagini.
Queste immagini fanno riferimento a una tabella nel database chiamata Corporazioni dentro cui c'è un campo chiamato Immagine_Corporazione.
Ecco, se io volessi fare una lista di tutte quelle immagini presenti nella directory /immagini/corporazioni ma che non sono memorizzate nel campo Immagine_Corporazione della tabella Corporazioni, quale sarebbe la query corretta?
Per il momento mi sono limitato a fare una lista, in questo modo:
$basedir = 'immagini/corporazioni';
$fileregex='/\.(gif)$/';
if ($basedir and is_dir($basedir) and $fileregex) {
$all = opendir($basedir);
while ($file = readdir($all)) {
if (preg_match($fileregex,$file)) {
$MySql = "SELECT * FROM Corporazioni WHERE Immagine_Corporazione NOT IN ('$file')";
$Result = mysql_query($MySql);
if (!($rs = mysql_fetch_array($Result))) {
?>
<table border="0" bordercolor="#888888" cellspacing=2 cellpadding=2 width=570>
<tr>
<td colspan=4 align=center style="border:1px solid #888888;"><img src="immagini/corporazioni/<?= $file ?>"> (Nome file: <?= $file ?>)
</td>
</tr>
<?
}
$rs->close;
}
}
}
closedir($all);
unset($all);
}
Nella lista, tuttavia, compaiono anche quelli che sono valorizzati nel campo Immagine_Corporazione :(
Potete aiutarmi a capire dove sbaglio?
Pagine → 1
15/04/2019 15:58:58 e modificato da lkmnoppo il 15/04/2019 21:37:54
Ciao!
Parto con il consigliarti di indentare il codice, rende più facile la vita a te e a chi ti vuole aiutare!
Detto questo, se non sto mancando qualche dettaglio, l'errore è molto semplice. Non devi usare NOT IN ('$file'), non è quello che vuoi dire. Oltretutto, usare NOT IN con una lista di un solo elemento è uguale a scrivere <> '$file' (se usy MySQL puoi scrivere anche != '$file').
Ti faccio un esempio:
supponi che i file siano
- a.gif,
- b.gif,
- c.gif
e che nel database siano presenti solo a.gif e c.gif.
Quando $file == "a.gif", la condizione della query diventa
WHERE immagine != 'a.gif'
Tutte le immagini nel database eccetto a.gif vengono restituite (in questo caso solo c.gif), no? Lo stesso vale quando $file == 'c.gif'. In tutti e due i casi il numero di risultati è {numero totale di immagini} - 1.
Quando invece $file == 'b.gif', l'immagine che effettivamente è obsoleta, tutte le immagini nel database soddisfano la condizione, quindi avrò {numero totale di immagini} risultati.
Se invece la condizione diventa
WHERE immagine = '$file'
, quando $file == 'a.gif', nel risultato ci sarà solo ed esclusivamente a.gif. Lo stesso vale per c.gif. Per b.gif, invece, nessuna riga soddisferà la condizione, e ciò farà fallireif (!($rs = mysql_fetch_array($Result)))
Ora, suggerimenti per migliorare la qualità del codice:
1. Non usare
NOT IN ('$file')
ma usa!= '$file'
(non in questo caso, in generale. In questo caso devi usare l'uguale, come nel codice sotto)2. Esplicita il fatto che ti interessano i file che non hanno riscontro sul database. Come?
$query = "SELECT COUNT(*) FROM Corporazioni WHERE Immagine_Corporazione = '$file')";
$result = mysql_query($query);
$rs = mysql_fetch_array($result);
if($rs[0] == 0) { //stampa nome file }
In questo modo quando in futuro leggerai il codice, ti ricorderai che quello che volevi fare era stampare le immagini che compaiono 0 volte nel database.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Enlisted ↗