Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2008
    residenza
    Hamburg
    Messaggi
    27

    Record ripetuti DISTINCT

    Salve a tutti, sto cercando di risolvere un problemino, mi servirebbe un aiuto, non riesco ad isolare i risultati doppi che mi restituisce una query con PHP... praticamente effettuo una query che mi da gli artisti presenti in un DB.. purtroppo in questo db gli artisti sono salvati in un formato particolare e cioè hanno l'anno prima del nome -> esempio 2016 Artista quindi la sola SELECT DISTINCT non funziona correttamente.. per lo meno non sempre... quando ci sono artisti con lo stesso nome ma con anno diverso vorrei che i risultati non si ripetessero.... vi posto un pó di codice forse capirete meglio...
    codice:
    //QUERY RICERCA ARTISTA SENZA DOPPIONI DISTINCT
          $query_a = "SELECT DISTINCT post_content FROM wp_posts WHERE post_content LIKE '%".$valore_cerca."%' AND post_status = 'publish' LIMIT 5";
          $result_a = mysqli_query($connection,$query_a) or die("Query non funzionante");
          while ($row_a = mysqli_fetch_array($result_a))
          {
            // mysql_data_seek($result_a, $i + 1); sposta puntatore array di uno avanti
            //ELIMINA I PRIMI 6 CARATTERI DELLA STRINGA
            $artista = substr($row_a["post_content"], 6);
            //ESPRESSIONE REGOLARE ELIMINA CARATTERI PARTICOLARI
            $artista = preg_replace("/[^a-zA-Z0-9_-]/", " ", $artista);
                //CREA LINK ARTIST SOSTITUISCI ALLO SPAZIO UN TRATTINO, Elimina il primo spazio all'inizio della sgtringa
                $artista_link = str_replace(" ", "-", $artista);
                $artista_link = substr($artista_link, 1);
                //ELIMINA SPAZI INIZIALI E FINALI
                $artista_link = trim($artista_link);
                //STAMPO RISULTATI SENZA RIPETERE LO STESSO nome GRAZIE A SELECT DISTINCT
                if ((strpos($artista, 'and conditions') == 0) && (strpos($artista, 'name') == 0) && (strpos($artista, 'disclouser information') == 0)&&(strpos($artista, 'information') == 0)&&(strpos($artista, 'contact') == 0)){
                  $sostituisti_a = "<b>".$valore_cerca."</b>";
                  $stringa_completa_a = str_replace($valore_cerca, $sostituisti_a, strtolower($artista)); //MOSTRA RISULTATO GRASSETTO
                  echo "<div class='bordo'>";
                  echo "<a href='artists/".strtolower($artista_link)."/'><div><img class='logo-c' src='http://tuunes.co/user.png'></div><div class='risult-cerca'>  ".strtolower($stringa_completa_a)."</div></a>";
                  echo "</div>";
                }
            }

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,448
    Fa un esempio pratico indicando cosa contiene un campo, come vuoi che risulti dopo il tuo script e cosa ottieni in realtà.

    Fa molta attenzione all'uso di strpos()

    Codice PHP:
    if ((strpos($artista'and conditions') == 0) && 
        (
    strpos($artista'name') == 0) && 
        (
    strpos($artista'disclouser information') == 0) &&
        (
    strpos($artista'information') == 0) &&
        (
    strpos($artista'contact') == 0)) 
    Vuoi effettivamente verificare se le sottostringhe indicate sono all'inizio della stringa oppure se NON sono contenute nella variabile $artista?
    Io supporrei il secondo caso, perché il primo non si potrebbe mai verificare, è impossibile che sottostringhe diverse siano contemporaneamente all'inizio, quindi modifica quel codice, perché potrebbe non funzionare come credi.

    strpos() restituisce la posizione della sottostringa che stai cercando se la trova, FALSE se non la trova.
    Se la sottostringa fosse all'inizio, strpos ti restituirebbe 0 (NON false), quindi il tuo controllo "== 0" sarebbe verificato, ma tu non vuoi questo perché vuoi true se la sottostringa non c'è.
    Devi usare "=== FALSE", 3 simboli = e la costante FALSE, in questo caso hai la certezza del comportamento voluto.

    Devi sempre conoscere bene il comportamento delle funzioni che usi, leggi sempre la documentazione su php.net, quello che ti ho spiegato c'è scritto e lo hanno messo anche in evidenza perché è facile sbagliarsi.

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2008
    residenza
    Hamburg
    Messaggi
    27
    Grazie mille per il momento!
    Mi spiego meglio, con lo script che ho postato sopra al momento visualizzo 3 risultati identici.. se il valore da cercare ad esempio é dj suede -> allora visualizzo 3 volte dj suede perché all'interno del DB ho 2013 dj suede, 2015 dj suede e 2016 dj suede... io vorrei ottenere solo una volta dj suede...

  4. #4
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,448
    Riesci a crearti un array con tutti i nomi ripuliti (anche se con doppioni) partendo da ciò che recuperi dal db?
    In tal caso, una volta che hai l'array (con i duplicati), basta che applichi a questo la funzione array_unique() che rimuove i doppioni, poi usi questo array ripulito per mostrare i nomi.

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2008
    residenza
    Hamburg
    Messaggi
    27
    Ah grazie! si ci ero quasi arrivato, ma non trovato la soluzione per confrontare i risultato nell'array!! grazie mille. mi metto a lavoro

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2008
    residenza
    Hamburg
    Messaggi
    27
    ora ho un piccolo problema con array_unique() praticamente mi mostra lo stesso gli elementi.. dove sbaglio?
    codice:
    
    
    codice:
    $query_a = "SELECT DISTINCT post_content FROM wp_posts WHERE post_content LIKE '%".$valore_cerca."%' AND post_status = 'publish' ORDER BY ID LIMIT 5";
          $result_a = mysqli_query($connection,$query_a) or die("Query non funzionante");
          $risultati = array();
          $i=0;
          while ($row_a = mysqli_fetch_array($result_a))
          {
            $artista = substr($row_a["post_content"], 6);
            //ESPRESSIONE REGOLARE ELIMINA CARATTERI PARTICOLARI
            $artista = preg_replace("/[^a-zA-Z0-9_-]/", " ", $artista);
            $artista = trim($artista);
            $artista = strtolower($artista);
            $risultati[$i] = $artista;
            $i = $i + 1;
          }
          array_unique($risultati);
          foreach ($risultati as &$value) {
            echo $value;
          }

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2008
    residenza
    Hamburg
    Messaggi
    27
    Risolto, grayie mille... ecco la soluzione
    codice:
    //QUERY RICERCA ARTISTA SENZA DOPPIONI DISTINCT
          $query_a = "SELECT DISTINCT post_content FROM wp_posts WHERE post_content LIKE '%".$valore_cerca."%' AND post_status = 'publish' ORDER BY ID LIMIT 5";
          $result_a = mysqli_query($connection,$query_a) or die("Query non funzionante");
          $risultati = array();
          $i=0;
          while ($row_a = mysqli_fetch_array($result_a))
          {
            $artista = substr($row_a["post_content"], 6);
            //ESPRESSIONE REGOLARE ELIMINA CARATTERI PARTICOLARI
            $artista = preg_replace("/[^a-zA-Z0-9_-]/", " ", $artista);
            $artista = trim($artista);
            $artista = strtolower($artista);
            $risultati[$i] = $artista;
            $i = $i + 1;
          }
    
    
          foreach (array_unique($risultati) as &$value) {
            $artista = $value;
            //CREA LINK ARTIST SOSTITUISCI ALLO SPAZIO UN TRATTINO, Elimina il primo spazio all'inizio della sgtringa
            $artista_link = str_replace(" ", "-", $artista);
            //ELIMINA SPAZI INIZIALI E FINALI
            $artista_link = trim($artista_link);
            //STAMPO RISULTATI SENZA RIPETERE LO STESSO nome GRAZIE A SELECT DISTINCT
            if ((strpos($artista, 'and conditions') === FALSE) && (strpos($artista, 'name') === FALSE) && (strpos($artista, 'disclouser information') === FALSE)&&(strpos($artista, 'information') === FALSE)&&(strpos($artista, 'contact') === FALSE)){
                $sostituisti_a = "<b>".$valore_cerca."</b>";
                $stringa_completa_a = str_replace($valore_cerca, $sostituisti_a, strtolower($artista)); //MOSTRA RISULTATO GRASSETTO
                echo "<div class='bordo'>";
                echo "<a href='artists/".strtolower($artista_link)."/'><div><img class='logo-c' src='http://tuunes.co/user.png'></div><div class='risult-cerca'>  ".strtolower($stringa_completa_a)."</div></a>";
                echo "</div>";
            }
          }

  8. #8
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,448
    $risultati[$i] = $artista;

    non c'è bisogno di esplicitare l'indice, puoi fare così

    $risultati[] = $artista;

    lo sa da se che va aggiunto un nuovo elemento, così ti risparmi il contatore $i

  9. #9
    Utente di HTML.it
    Registrato dal
    Oct 2008
    residenza
    Hamburg
    Messaggi
    27
    grazie mille ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.