• Bannato User Attivo

    Query per confrontare nomeimg.jpg con 123-nomeimg.jpg salvato in DB

    Quando carico una foto che si chiama
    nomeimg.jpg

    nel database la salvo con un numero progressivo del tipo
    1234-nomeimg.jpg

    Come posso fare un controllo per evitare di caricare foto esistenti?

    Escludo sia possibile controllare che foto identiche ma con nomi diversi siano riconoscibili quindi penso si possa controllare solo il nome del file.

    Io ho nella variabile $nomeimg_locale il nome del file che sto per caricare.

    Nel database ho 10000 righe di nomi di foto del tipo 1234-nomefoto.jpg

    Come faccio a fare una query che mi controlla se la foto che sto per caricare è già presente considerando che nel database il nome delle foto viene salvato con un numero davanti?


  • Moderatore

    fai un explode del nome esempio 1234-nome.jpg e prendi solo il valore del nome e confronti con quello che stai per inserire 🙂


  • Bannato User Attivo

    Non ho ben capito.
    Mettiamo che ho 200.000 foto. Faccio un ciclo for che per ogni riga mi fa un explode del campo e me lo confronta con quello che sto per inserire?
    Mi sembra proprio un lavoraccio.

    Mi servirebbe una funziona per una query diretta o che carichi molto meno il server?


  • User Attivo

    Una query SQL utile al caso tuo esiste.
    Si chiama RICERCA FULL-TEXT, serve per trovare un certo testo in un campo.

    
     SELECT * FROM tabella WHERE MATCH(immagine) AGAINST('nome_img')
    
    

    Con questa query si restituiscono tutti i campi "immagine" che contengono la parola "nome_img".

    Per altri riferimenti: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

    Ciao :ciauz:


  • Bannato User Attivo

    A FULLTEXT index definition can be given in the CREATE TABLE statement when a table is created, or added later using ALTER TABLE or CREATE INDEX.

    Non posso modificare il DB...
    Altre soluzioni?

    Con substrng_index, selezioni i numeri prima della - e poi li tolgo e poi cerco?
    (ogni nome immagine viene salvato con un numero prima ovvero 123-foto.jpg; 124-foto2.jpg)

    P. S.
    Come faccio a vedere se una mia tabella è già FULLTEST???


  • User Attivo

    In effetti dovresti alterarare la tabella per adattarla al FULLTEXT.
    Una soluzione alternativa è l'operatore LIKE:

    
    SELECT * FROM tabella WHERE immagine LIKE '%prova.jpg'
    
    ```LIKE accetta due caratteri speciali che sono **%** e **_
    
    **% indica una seguenza non definita di caratteri (0132-prova.jpg --> ... LIKE '%prova.jpg') 
    _ indica una seguenza definita di caratteri, _ = 1 carattere, __ = 2 caratteri, ecc... (0132-prova.jpg --> ... LIKE '_____prova.jpg') 
    
    Quindi da come è definito il codice sopra riportato può essere trodotto in questo modo:
    Seleziona tutto dalla tabella dove il campo immagine contiene una stringa che composta da una parte finale chiamata "prova.jpg" preceduta da una parte indefinita di caratteri, che possono essere "01264-".
    Attenzione, LIKE è case sensitive, quindi "PROVA.jpg" è diverso da "prova.jpg"

  • Bannato User Attivo

    Bella idea.
    Poichè il sistema è per evitare di caricare foto uguali da parte di uno stesso utente potrei, poichè ora sono tra le 10000 e 99999 mettere il like per 5 caratteri.

    Ma come si comporta se ho le foto:
    1234-foto-dolomiti-rosso.jpg
    1235-foto-dolomiti-gialla.jpg

    LIKE '_____-dolomiti.jpg me le trova entrambe o nessuna? Cioè trova tutte le foto con la parola dolomiti da qualche parte oppure con la precisa stringa "-dolomiti.jpg"

    GRAZIE


  • User Attivo

    L'operatore LIKE è molto restrittivo.
    Se utilizzi LIKE '_____-dolomiti.jpg' ed hai "1234-foto-dolomiti-rosso.jpg" e "1235-foto-dolomiti-gialla.jpg" non ti restituisce nessuna delle due.
    Cosi come impostato, ti trova tutte le stringhe con finale "-dolomiti.jpg" precedute da 5 caratteri (Es. 01251-dolomiti.jpg, 04515-dolomiti.jpg, ecc...).
    Se vuoi trovare quelle due immagini, e non sai quanti e quali caratteri sono contenuti nel nome, usa il % (... LIKE '%dolomiti%'), in questo modo trovi tutte le stringhe che contengono la parola che ti interessa, preceduta e seguita da indefiniti caratteri sconosciuti.


  • Moderatore

    ovviamente devi levargli l'estensione del file 😉