• User Attivo

    Problemino con interrogazione al database

    Buonasera,

    ho una tabella MySQL di questo tipo


    | nick1 nick2 ok |
    | Roxas Nome 1 |
    | Nome Roxas 2 |
    | Nome Roxas 1 |

    e vorrei stampare a video tutti i nickname "Nome" dove "ok" = 1 ma non so come fare, io solitamente per gli echo dal db uso il seguente script:

    $result=mysql_query('SELECT [...] FROM [...] WHERE [...]');
    $righe=mysql_num_rows($result);
    for ($i=0;$i<$righe;$i++)
    {
    $array_result=mysql_fetch_row($result);
    $stringa=$array_result[0];
    $stringa2=$array_result[1];
    echo $stringa.$stringa;
    }

    però in questo caso non so come comportarmi e chiedo aiuto a voi 😄


  • ModSenior

    Php non me lo ricordo bene quindi mi butto, male che vada, passera qualcuno a correggerci... 🙂

    [PHP]$result=mysql_query('SELECT nick1 FROM nomeTabeòòa WHERE ok=1');
    while ($row = mysql_fetch_assoc($result)) {
    echo $row["nick1"]."<br />";
    }[/PHP]


  • User Attivo

    E' giusto il codice XD
    Però ho bisogno di cercare in entrambe le colonne nick1 e nick2 e non ci devono essere due nick uguali, è questo il mio problema >_<


  • User Attivo

    Non ti ho capito bene, ma se intendi che nella stessa riga nick1 e nick2 non possono essere uguali, prova questo:
    [php]$q = mysql_query('SELECT * FROM tabella WHERE ok = 1');
    while($r = mysql_fetch_assoc($q)) {

    if($r['nick1'] == $r['nick2']) { continue; }

    echo $r["nick1"]."<br />";

    }[/php]

    Ciao


  • User Attivo

    Io intendo che devo interrogare nick1 e nick2 insieme e prendere i nickname secondo certe clausole (tipo che ok = 1) e che i "doppioni" vengano filtrati.


  • User Attivo

    I doppioni che intendi dire sono le righe uguali in tutti e 3 i campi?

    Se intendi questo, cambia la query così:
    [php]$q = mysql_query('SELECT DISTINCT * FROM tabella WHERE ok = 1'); [/php]

    Ciao


  • User Attivo

    Niente mi dà lo stesso risultato di prima, non generalizzando ma andando sul mio caso concreto:

    La query (se non specifico "*" mi dà errore):

    $get_nick = $_GET['nickname'];
    $q=mysql_query('SELECT DISTINCT * FROM table WHERE id1 = "'.$get_nick.'" OR id2 = "'.$get_nick.'" [****] AND accettato = 1 AND cancellato = 0 AND rifiutato = 0');
    while($r = mysql_fetch_assoc($q)) {
    if($r['id1'] == $r['id2']) { continue; }
    echo $r["id1"]."<br />";
    }

    [****] --> (non è nel codice, è una nota per il forum :D) Ho bisogno di avere tutti id1 e un id2 dove compare $get_nick e accettato sia uguale ad uno e cancellato e rifiutato uguale a 0.

    Il database: htt p:// ww w.technicianpokemon.com/old-hosting/images/db.png

    Io Roxas Shadow dovrò visualizzare: Nome Utente e Nick1, poichè rispettano le condizioni e non importa se il mio nick sia su id1 o id2 :smile5:


  • User Attivo

    Se tu vuoi che non vengono visualizzati più di 1 record per nick1 e nick2 dovresti unire i campi e farne solo uno in modo da farlo diventare chiave primaria.

    Ciao


  • User Attivo

    E poi come faccio a inserirci i dati ?


  • User

    @RoxasShadow said:

    Il database: htt p:// ww w.technicianpokemon.com/old-hosting/images/db.png

    Io Roxas Shadow dovrò visualizzare: Nome Utente e Nick1, poichè rispettano le condizioni e non importa se il mio nick sia su id1 o id2 :smile5:

    mmm...a parte che il db fatto in questo modo non è il massimo, io di solito faccio una colonna stato con tipo di dati enum in cui ci metto i valori che quel campo può assumere, così è il db che fa sanitize dell'input e non l'applicazione (esempio concreto: cosa succederebbe se in qualche modo la colonna rifiutato fosse null o fosse 3 o 4?)
    In ogni caso, scusa per la divagazione, facciamo un esempio pratico dalla tabella che hai postato tu (il file png qui sopra) quali risultati ti aspetti?

    Ciao


  • User Attivo

    @mferraroni said:

    esempio concreto: cosa succederebbe se in qualche modo la colonna rifiutato fosse null o fosse 3 o 4?)

    La colonna booleana rifiutato ha un valore predefinito 0 e i dati vengono modificati mediante un form che imposta il valore a 1.

    @mferraroni said:

    In ogni caso, scusa per la divagazione, facciamo un esempio pratico dalla tabella che hai postato tu (il file png qui sopra) quali risultati ti aspetti?

    In questo caso la query dovrebbe "echare" (accedendo nel profilo di Roxas Shadow) i nickname Nick1 e Nome Utente poichè sono entrambi accettati (1 = true) e non rifiutati e/o cancellati (0 = false).


  • User

    @RoxasShadow said:

    In questo caso la query dovrebbe "echare" (accedendo nel profilo di Roxas Shadow) i nickname Nick1 e Nome Utente poichè sono entrambi accettati (1 = true) e non rifiutati e/o cancellati (0 = false).

    Secondo me è un approccio sbagliato proprio dalla progettazione, modifica il campo in modo che accetti solo i valori A,R,C ovvero Accettato, Rifiutato, Cancellato (mysql type enum) e poi modifica il form di conseguenza.
    La query poi diventa una semplice

    
    SELECT DISTINCT id1, id2 WHERE (id1 = XXX OR id2 = XXX) and stato = A
    
    

    al posto di XXX mettici le tue condizioni.

    Ciao


  • User Attivo

    Ti ringrazio infinitamente mferraroni, lo script funziona che una meraviglia.
    Alla prossima.


  • User Attivo

    Ops, ho un problema 😄

    La query è questa

    $query=mysql_query('SELECT DISTINCT * FROM amicizie WHERE (id1 = "'.$nickname.'" OR id2 = "'.$nickname.'") AND stato = "A"');
    while($result = mysql_fetch_assoc($query)) {
    if($result['id1'] == $result['id2']) { continue; }
    echo $result["id2"].', ';
    }

    Il database è questo

    h ttp:/ /ww w.technicianpokemon.com/old-hosting/images/db2.png

    Io vorrei visualizzare "Linkino" ma visualizzo "Roxas Shadow" e lo stesso visualizzerà l' utente che ha $nickname impostato su "Linkino".

    Per piacere aiutatemi 😄


  • User

    @RoxasShadow said:

    Io vorrei visualizzare "Linkino" ma visualizzo "Roxas Shadow" e lo stesso visualizzerà l' utente che ha $nickname impostato su "Linkino".

    Ciao cambia

    
    echo $result["id2"].', ';
    
    

    con

    
    echo $result["id1"].', ';
    
    

    poi un consiglio, cerca di non utilizzare l'asterisco (*) nelle query che non è il massimo in fatto di performance, ma specifica sempre i campi che ti servono, in questo caso ti servono solo id1 ed id2

    Ciao
    Matteo


  • User Attivo

    Si ma in questo caso cambia per me, ma non per tutti: mi spiego.

    Con id1 io accedendo con $nickname a Linkino visualizzo "Linkino", la stessa cosa accade accedendo con $nickname a Roxas Shadow visualizzo "Roxas Shadow".
    A me servirebbe che se accedessi con $nickname "Linkino" visualizzassi "Roxas Shadow" e viceversa, accedendo con $nickname "Roxas Shadow" visualizzassi "Linkino".

    Grazie per il tempo e l' aiuto dedicatomi.


  • User

    @RoxasShadow said:

    Si ma in questo caso cambia per me, ma non per tutti: mi spiego.

    Con id1 io accedendo con $nickname a Linkino visualizzo "Linkino", la stessa cosa accade accedendo con $nickname a Roxas Shadow visualizzo "Roxas Shadow".
    A me servirebbe che se accedessi con $nickname "Linkino" visualizzassi "Roxas Shadow" e viceversa, accedendo con $nickname "Roxas Shadow" visualizzassi "Linkino".

    Se ho capito bene la struttura della tabella id1 è il nick e id2 è il nome dell'utente, quindi tu vuoi far accedere sia con il nome sia con nick, e visualizzare sempre il nick, giusto?

    Ciao


  • User Attivo

    E' un sistema di amicizie.
    Id1 è il richiedente, Id2 è il destinatario dell' amicizia.
    Se accedo come richiedente dovrò vedere Id2 e se accedo come destinatario vedrò Id1.


  • User

    @RoxasShadow said:

    E' un sistema di amicizie.
    Id1 è il richiedente, Id2 è il destinatario dell' amicizia.
    Se accedo come richiedente dovrò vedere Id2 e se accedo come destinatario vedrò Id1.

    Ok.

    allora puoi fare così:

    
    $whoami = <nickname con cui sono dentro al sistema>
    $query=mysql_query('SELECT DISTINCT * FROM amicizie WHERE (id1 = "'.$nickname.'" OR id2 = "'.$nickname.'") AND stato = "A"');
    while($result = mysql_fetch_assoc($query)) {
      if($result['id1'] == $whoami) {  // se sono richiedente...
        echo $result['id2']; // ...vedo id2 
    } else {                   // altrimenti....
        echo $result["id1"]; // ...vedo id1 
    } ;
    
    

    Spero che sia chiaro.
    Ciao
    Matteo


  • User Attivo

    Funziona finalmente! 😄

    Ti ringrazio infinitamente, a presto.