• User Newbie

    Come vedere le relazioni su db mysql?

    Salve a tutti,
    sto provando a fare un sito locale che frutti un db in mysql con una tabella principale e tre tabelle ausiliarie (per le relazioni).. quindi nella tabella principale ho tre colonne dove i valori sono dei numeri (che corrispondono agli id delle altre tre tabelle)..

    Leggendo in rete ho capito che devo usare un join, ma non ho capito come fare..❌x:x

    Io vorrei che il file index.php mi desse l'intera tabella principale ma con già le relazioni fatte.. cosa che attualmente non fa:

    <form action="interroga.php" method="POST">
      Inserire IP:
         <input type="text" name="IP">
         <input type="submit" name="submit" value="cerca">
    </form>
    
    <div style="text-align: center;">
    
    <table width="120%" border="5" cellpadding="5" cellspacing="0">
      <tr>
            <td>Indirizzo IP</td>
            <td>HostName</td>
            <td>MacAddress</td>
            <td>UP(pinga)</td>
            <td>HOST,PACS,RIS,ESX</td>
            <td>Location</td>
            <td>OS</td>
            <td>Label</td>
            <td>Usr_pwd</td>
            <td>Description</td>
            <td>Responsible</td>
            <td>Note</td>
    </tr>
    
    <?php
    $db_connection= mysql_connect("localhost","root","Kodak123");
    $db_selection = mysql_select_db("Gestione_IP");
    
    $query = mysql_query("SELECT * FROM Lista_IP ORDER BY Indirizzo_IP");  //devo inserire qui il join oppure..
    while($cicle=mysql_fetch_array($query)){
        echo "<tr><td>".$cicle['Indirizzo_IP']."</td>";
        echo "<td>".$cicle['HostName']."</td>";
        echo "<td>".$cicle['MACAddress']."</td>";
        echo "<td>".$cicle['Up']."</td>";
        echo "<td>".$cicle['HOST']."</td>";
        echo "<td>".$cicle['id_Location']."</td>"; //devo fare qui il join con la tabella Location?
        echo "<td>".$cicle['id_OS']."</td>"; //devo fare qui il join con la tabella OS?
        echo "<td>".$cicle['Label']."</td>";
        echo "<td>".$cicle['Usr_pwd']."</td>";
        echo "<td>".$cicle['Description']."</td>";
        echo "<td>".$cicle['id_Responsabile']."</td>";  //devo fare qui il join con la tabella Responsabile?
        echo "<td>".$cicle['Note']."</td></tr>";
    }
    ?>
    </table>
    
    </div>
    
    
    
    

    Il join lo devo fare nella query o anche dove ho segnato?

    Le tabelle sono:
    Lista_IP (quella principale)
    Location (secondaria)
    OS (secondaria)
    Responsabile (secondaria)

    Mi è stato detto inoltre che le funzioni mysql_* sono vecchie e che non saranno più supportate in php.. ma pensavo che usando io un server mio ubuntu14 basta non aggiornarlo giusto?:sun:

    Grazie


  • Moderatore

    Sì in effetti la sintassi che utilizzi è obsoleta.. Ti consiglio di passare alla sintassi MySQLi oppure PDO, io personalmente uso MySQLi. (Sia per questioni di velocità che di aggiornamento versioni, non aggiornare il sistema perchè non si ha voglia di imparare una sintassi nuova è come non pulirsi più il sedere nel caso in cui si cambi marca di carta igienica). 😄

    Un altro consiglio è quello di non usare il JOIN, è stato dimostrato che è molto più lento ed occupa più memoria virtuale l'esecuzione della query (specie su grosse quantità di dati) di una relazione creata all'interno del ciclo da te, comunque se posti il codice non si capisce nulla faresti prima a spiegare bene cosa vuoi fare e a quale scopo.

    Cosa significa una relazione creata all'interno del ciclo da te?

    Che se devo ricollegare dentro una stessa query degli ID che rimandano a tabelle diverse, semplicemente eseguo una piccola query durante il while che mi estrapola il risultato che mi serve.

    Quindi se..

    while( $row = $query->fetch_row()){ // starto il ciclo
    $namelocal = $mysqli->query("SELECT namelocal from local where id='$row[0]'"); // ecco la relazione con una tabella esterna
    $local = $namelocal ->fetch_row(); // mi piglio il dato che mi serve

    // continuo con i miei bei calcoli....
    }

    Se mi spieghi che vuoi fare ti scrivo un codice funzionante e leggero in modo da comprendere anche meglio MySQLi ad oggetti.


  • User Newbie

    Ti ringrazio della risposta.
    Lo scopo era creare un db per gli indirizzi IP occupati da PC e macchine virtuali, in modo che poi chi deve creare una nuova VM o mettere un nuovo PC in rete vede gli indirizzi già occupati.

    Quindi ho creato una tabella Lista_IP con gli indirizzi, la descrizione della macchina, il sistema operativo, la posizione del PC e il responsabile, questi ultimi 3 collegati ad altrettanto 3 tabelle in relazione con la prima (relazione che ho creato anche sul db e non solo a parole).

    Adesso vorrei che quando un utente si collega alla homepage del db del server che contiene il db mi appaia:
    un tasto cerca (per cercare sulla tabella Lista_IP nel campo degli indirizzi e anche nella descrizione)
    senza fare nulla mi compaia l'intera tabella senza filtri vari in ordine crescente degli indirizzi IP
    alcuni pulsanti per selezionare direttamente alcune righe (ad esempio tutte le righe in cui il campo OS contiene ESX, oppure il cui campo Responsabile sia Pippo)

    Questo è tutto quello che vorrei fare

    Intanto che aspetto la tua risposta mi faccio ricerce sulla sintassi mysqli.. vediamo se trovo qualcosa per chi inizia.

    Grazie mille ancora


  • User Newbie

    @c3n2o said:

    Ti ringrazio della risposta.

    senza fare nulla mi compaia l'intera tabella senza filtri vari in ordine crescente degli indirizzi IP

    Intanto che aspetto la tua risposta mi faccio ricerce sulla sintassi mysqli.. vediamo se trovo qualcosa per chi inizia.

    Sono riuscito a fare questo punto.. in pratica ho fatto un LEFT JOIN sulla pagina index.php

    $query = mysql_query("SELECT * FROM Lista_IP LEFT JOIN Location USING (id_Location) LEFT JOIN OS USING (id_OS) LEFT JOIN Responsabile USING (id_Responsabile) ORDER BY Indirizzo_IP");

    A parte che appena trovo sostituisco mysql_query con mysqli, mi pare di aver capito che tu avresti usato un altro metodo.. ma non sono riuscito a trovare esempi "for dummy" .. Cmq fai conto che per adesso il db ha meno di 300 elementi e non penso che aumenti più di tanto, quindi le ricerche non saranno eccessivamente pesanti.

    Cmq ho delle perplessita sul codice da te inviato:

    //provo a sostituire i valori con quelli che penso siano corretti
    while( $row = $query->fetch_row()){ //prima non devo definire la variabile $query?
    $namelocal = $mysqli->query("SELECT Lista_IP from Location where id_Location='$row[0]'"); // qui $row[] è il nome della prima colonna, giusto?
    $local = $Lista_IP ->fetch_row(); // questa non l'ho proprio capita

    Grazie ancora


  • Moderatore

    @c3n2o said:

    Sono riuscito a fare questo punto.. in pratica ho fatto un LEFT JOIN sulla pagina index.php

    $query = mysql_query("SELECT * FROM Lista_IP LEFT JOIN Location USING (id_Location) LEFT JOIN OS USING (id_OS) LEFT JOIN Responsabile USING (id_Responsabile) ORDER BY Indirizzo_IP");

    A parte che appena trovo sostituisco mysql_query con mysqli, mi pare di aver capito che tu avresti usato un altro metodo.. ma non sono riuscito a trovare esempi "for dummy" .. Cmq fai conto che per adesso il db ha meno di 300 elementi e non penso che aumenti più di tanto, quindi le ricerche non saranno eccessivamente pesanti.

    Cmq ho delle perplessita sul codice da te inviato:

    //provo a sostituire i valori con quelli che penso siano corretti
    while( $row = $query->fetch_row()){ //prima non devo definire la variabile $query?
    $namelocal = $mysqli->query("SELECT Lista_IP from Location where id_Location='$row[0]'"); // qui $row[] è il nome della prima colonna, giusto?
    $local = $Lista_IP ->fetch_row(); // questa non l'ho proprio capita

    Grazie ancora

    Certo quel codice non funziona mica! Era solo per infarinarti con la logica di MySQLi e di come intendevo farti sviluppare la sintassi!

    Ti spiego con 4 semplici Step le cose da sapere su MySQLi per poterlo utilizzare subito:

    • Connessione al DB: $mysqli = new mysqli("localhost", "username", "password", "mioblog");
    • Come fare una query? gli assegni una variabile (per esempio query) e scrivi cosi: **$query = $mysqli->query("LA MIA QUERY SQL"); **(tutto qui.. $mysqli è la stringa di connessione al DB in questo caso, se la cambi metti l'altra).
    • Come prendi i risultati? Se vuoi ciclarli tutti e quindi hai piu campi: **while($rs = $query->fetch_row()){ // QUI SGUAZZI CON TUTTI I RISULTATI } ; **Quindi avrai $rs[0], $rs[1] ecc.. per ogni riga trovata. Se hai una condizione precisa e quindi non devi ciclare nulla, usi solamente: **$rs = $query->fetch_row(); .. **e ti prendi il valore che ti interessa nella posizione che ti interessa.. easy no?
    • Non ti piacciono i numeri e vuoi le associazioni dei campi del DB? Anziche fetch_row() usa fetch_assoc() 😄

    Ok se ti va bene usa il JOIN il mio era un parere personale! Si pensa sempre in grande 😉

    Non c'è bisogno che mi ringrazi, cit: condividiamo idee e conoscenze.

    Ciao!


  • User Newbie

    @MiWebDesign said:

    Certo quel codice non funziona mica! Era solo per infarinarti con la logica di MySQLi e di come intendevo farti sviluppare la sintassi!

    Ti spiego con 4 semplici Step le cose da sapere su MySQLi per poterlo utilizzare subito:

    • Connessione al DB: $mysqli = new mysqli("localhost", "username", "password", "mioblog");
    • Come fare una query? gli assegni una variabile (per esempio query) e scrivi cosi: **$query = $mysqli->query("LA MIA QUERY SQL"); **(tutto qui.. $mysqli è la stringa di connessione al DB in questo caso, se la cambi metti l'altra).
    • Come prendi i risultati? Se vuoi ciclarli tutti e quindi hai piu campi: **while($rs = $query->fetch_row()){ // QUI SGUAZZI CON TUTTI I RISULTATI } ; **Quindi avrai $rs[0], $rs[1] ecc.. per ogni riga trovata. Se hai una condizione precisa e quindi non devi ciclare nulla, usi solamente: **$rs = $query->fetch_row(); .. **e ti prendi il valore che ti interessa nella posizione che ti interessa.. easy no?
    • Non ti piacciono i numeri e vuoi le associazioni dei campi del DB? Anziche fetch_row() usa fetch_assoc() 😄

    Ok se ti va bene usa il JOIN il mio era un parere personale! Si pensa sempre in grande 😉

    Non c'è bisogno che mi ringrazi, cit: condividiamo idee e conoscenze.

    Ciao!

    Ciao, non è che non voglio usare mysqli e usare solo il JOIN .. il fatto è che tutte le guide che ho trovato parlano di JOIN e non fanno accenno a mysqli, e inoltre sono tutte un pò vecchiotte.

    Adesso mi studierò quello che hai scritto e proverò a metterlo in pratica.. speriamo bene:wink3:

    Una domanda: se apro il database in una pagina, in un altra pagina devo riaprirlo? e nella pagina precedente il db deve essere prima chiuso?
    Ad esempio: nella pagina index.php apro il db e mi stampa tutta la tabella. Poi c'è un campo per cercare che chiama la pagina interroga.php dove devo riaprire il db (giusto?) per interrogarlo, ma nè in index ne in interroga chiudo il db..

    A presto


  • Moderatore

    Non ha importanza la funzionalità close(); nella stringa di connessione.. puoi anche farne a meno sennò si diventerebbe matti 😄 almeno io non la uso proprio