Visualizzazione risultati 1 fino 21 di 21

Discussione: dati prelevati dal database con php che si ripetono

  1. #1
    Guest

    Unhappy dati prelevati dal database con php che si ripetono

    salve a tutti,
    ho un problema, ho creato un piccolo programma che gestisce le commissioni di utenti ecc. tutto apposto se non che quando prelevo i dati dal database con php nella tabella compaiono alcuni campi ripetuti ed altri che non ci sono, cioè quando vedo le commissioni di un utente alcune commissioni sono ripetute e altri che ci dovrebbero essere non compaiono, non capisco dove sbaglio, mi potete aiutare, posto il codice:


    Codice PHP:
    <?php
    session_start
    ();
    include
    "util.php";
    include
    "connetti.php";

    if(
    $_SESSION['admin'] == true){




    $gginiz=$_REQUEST['gginiz'];
    $mminiz=$_REQUEST['mminiz'];
    $aainiz=$_REQUEST['aainiz'];
    $ggfine=$_REQUEST['ggfine'];
    $mmfine=$_REQUEST['mmfine'];
    $aafine=$_REQUEST['aafine'];


    $controllo="0000-00-00";

    $datainizio=$aainiz."-".$mminiz."-".$gginiz;
    $datafine=$aafine."-".$mmfine."-".$ggfine;



    if(
    htmlspecialchars($_REQUEST['username']) != null){


    ?>

    <form action="visualizzacomm.php">

    <input type="hidden" name="username" value="<?php echo htmlspecialchars($_REQUEST['username']); ?>">
    data inizio(gg/mm/aaaa): <input type="textbox" name="gginiz" value="00" size="2"> / <input type="textbox" name="mminiz" value="00" size="2"> / <input type="textbox" name="aainiz" value="0000" size="4"><br>
    data fine(gg/mm/aaaa): <input type="textbox" name="ggfine" value="00" size="2"> / <input type="textbox" name="mmfine" value="00" size="2"> / <input type="textbox" name="aafine" value="0000" size="4"><br>
    <input type="submit" value="Ok">
    </form>


    <?php

    if($datainizio != $controllo && $datafine != $controllo){




    $query = "select * from impiegato, commessa, impiegato_has_commessa where (impiegato.username = '".htmlspecialchars($_REQUEST['username'])."') AND (impiegato.username = impiegato_has_commessa.impiegato_username) AND (impiegato_has_commessa.commessa_idcommessa = commessa.idcommessa) AND (DATEDIFF(commessa.data, DATE('".$datainizio."')) > 0) AND (DATEDIFF(commessa.data, DATE('".$datafine."')) < 0)";



    }
    else{

    $query = "select * from impiegato, commessa, impiegato_has_commessa where (impiegato.username = '".htmlspecialchars($_REQUEST['username'])."') AND (impiegato.username = impiegato_has_commessa.impiegato_username) AND (impiegato_has_commessa.commessa_idcommessa = commessa.idcommessa)";





    }

    $rows = mysql_query($query);


    $count=0;

    echo
    "username: ".htmlspecialchars($_REQUEST['username']);

    echo
    "<center><table border=1><tr><td>Commessa</td><td>Data Commessa</td><td>Ore Commessa</td><td>Minuti</td></tr>";


    while(
    $count < mysql_num_rows($rows)){

    $row = mysql_fetch_assoc($rows);

    echo
    "<tr><td>".$row['nomecommessa'];

    echo
    "</td>";

    echo
    "<td> ".get_correct_date($row['data']);

    echo
    "</td>";

    echo
    "<td>".$row['commessa1'];

    echo
    "</td>";

    echo
    "<td>".$row['minuti'];

    echo
    "</td>";


    echo
    "</tr>";

    $count= $count + 1;

    }

    echo
    "</table></center>";


    }



    else{



    $Data=$anno.'-'.$mese.'-'.$giorno;

    $query = "select * from impiegato";

    $rows = mysql_query($query);



    if(
    mysql_num_rows($rows) == 0)

    echo
    "la tabella è vuota";

    else{

    echo
    "<table>";

    while(
    $row = mysql_fetch_assoc($rows)){


    echo
    "<tr>";

    echo
    "<td>";

    echo
    "<span class='username'><a href='visualizzacomm.php?username=".$row["username"]."'>".$row["username"]."</a></span>";

    echo
    "</td>";

    echo
    "<td>";

    echo
    "<span class='nome'>".$row["nome"]."</span>";

    echo
    "</td>";

    echo
    "<td>";

    echo
    "<span class='cognome'>".$row["cognome"]."</span>";

    echo
    "</td>";

    echo
    "</tr>";

    }

    echo
    "</table>";

    }

    }





    mysql_close($Connessione);


    }
    else {

    echo
    "non hai accesso alla pagina";

    }

    ?>
    http://s4.imagestime.com/out.php/i59...lacommesse.jpg

    come si vede dall'immagine la commissione Czar sistemazioni si ripete e non viene invece visualizzata la commissione sempre Czar sistemazioni avente data 06-09-2011

    Sto notando che la coda accasa quando ci sono nel database commissioni aventi lo stesso nome, invece se li metto diversi non succede.

    http://s4.imagestime.com/out.php/i59...esseesatta.jpg

    preciso che nel database i dati sono inseriti correttamente e quando li prelevo che ottengo duplicati!!!
    Ultima modifica di alemoppo : 12-09-2011 alle ore 20.14.19 Motivo: Meglio usare i tag [þhp]

  2. #2
    Guest

    Predefinito

    Devi verificare i dati nelle tabelle e come hai fatto le join.

    In generale se hai, ad esempio, due tabelle dove ad record X della prima corrispondono 2 (o più) record nella seconda, quando estrai i dati relativi al record X in join con la seconda tabella ottieni 2 (o più) righe e non un raggruppamento.
    Se vuoi i dati in forma ragruppata, devi usare la clausola GROUP BY.

    Se alcuni dai non ti compaiono, devi verificare ancora le stesse cose.
    Riprendendo lo stesso esempio se nella tabella 1 c'è il record Y ma nella tabella 2 non ci sono record correlati a questo, se metti i dati in join non otterrai risultati.
    Se vuoi che comunque ti vengano restituiti (anche vuoti) usa le LEFT JOIN.

    Una domanda: ma perchè per definire un intervallo di date usi DATEDIFF?
    Se vuoi estrarre i dati la cui data è compresa tra due estremi puoi impostare una condizione tipo

    Codice:
    date(data) BETWEEN 'aaaa-mm-gg' AND 'aaaa-mm-gg'
    Ti chiederei, per poter essere più precisi, come hai strutturto le tabelle e cosa vuoi ottenere dall'estrazione.

  3. #3
    Guest

    Predefinito

    ciao Simpleticket,
    grazie per averi risposto. Dunque, per il confronto delle date ottengo lo stesso risultato con entrambe le digiture
    le tabelle sono :
    commessa con i seguenti record
    id_commessa,username,data,nome_commessa,ore, minuti
    impiegato con i seguenti record:
    username,password,nome,cognome,admin
    turno con i seguenti record
    id_turno,useraname,data,ora_ingresso,ora_uscita,ip

    come chiave principale ho usato username, dalla tabella commessa vorrei ottenere :
    nome_commessa,data,ore,minuti

    ma quando prelevo i dati và tutto bene se i nome delle commesse sono diversi,
    appena vi sono diverse commesse con lo stesso nome ma di data diversa, vengono ripetuti i nomi delle commesse con lo stesso nome e stessa data ed esclusi quelli con data diversa. Dove sbaglio?

  4. #4
    Guest

    Predefinito

    Ho visto solo superficialmente la struttura ma a naso ti ripeto di badare bene a cosa vuoi estrarre e come lo fai.

    Se ad esempio, per una commessa, in una data fissa, ci sono due turni, quando fai l'estrazione mettendo in relazione e tre tabelle (JOIN) è corretto che trovi due righe

    riga 1 - COMMESSA > DATA > TURNO1
    riga 2 - COMMESSA > DATA > TURNO2

    ora di questo te ne accorgi subito se nella SELECT estrai anche il turno, mentre se quest'ultimo manca ti sembra che la riga sia duplicata

    riga 1 - COMMESSA > DATA
    riga 2 - COMMESSA > DATA

    Ma è solo l'effetto per quanto sopra.

    Potresti essere più preciso su come conservi i dati e cosa vuoi ottenere?

  5. #5
    Guest

    Predefinito

    forse mi sono espresso male, i turni vengono gestiti in un altra tabella.
    A me in questa servirebbe che mi ritorni il nome della commessa, la data, ora e minuti di quanto è durata la commessa.
    Se ho commesse diverse mi funziona, se ho commesse dello stesso tipo è giusto che la data deve essere la stessa se fatta nello stesso giorno se fatta in giorni diversi deve dare anche le altre date, così come le ore e i minuti, invece mi dà il nome della commessa, la data sempre uguale così come le ore ed i minuti e non prende le altre.
    Se vuoi posto l'intero programma compreso di database esportato, mi rendo conto che in questo modo è difficile risalire all'errore, anche se il problema sarà proprio in questo file postato nel modo di confrontare le date e le 2 query non fatte come si deve

  6. #6
    Guest

    Predefinito

    Intanto ti ho fatto degli esempi per farti capire che le join non sono proprio cose così semplici.

    Poi, in merito ai turni, non importa se non li estrai, ma il fatto che ad un record di una tabella corrispondano due su un'altra in relazione con questa, comporta di per se un'estrazione di due righe. Posso anche fare un SELECT tabella1.nome FROM tabella11, tabella2 dove in tabella2 ci sono 2/3/.../n record correlati ad un nome, otterrai, anche se NOME è unico, 2/3/.../n righe.

    Ti chiedo, se puoi, senza arrivare ad esportare il db, se puoi descrivere come hai salvato i dati (quali eventi vengono registrati e come) e quello che vuoi, magari con uno schema.

  7. #7
    Guest

    Predefinito

    ecco intanto delle videate per rendere meglio l'idea:

    http://s4.imagestime.com/out.php/i59...commessaOK.jpg

    in questo esempio và tutto liscio, il nome delle commesse è diverso e quindi prende giusto anche le ore ed i minuti mentre la data è la stessa ed è normale in quanto sono state fatte tutto oggi.

    http://s4.imagestime.com/out.php/i59...essaerrata.jpg

    in questo invece si vede il nome uguale di una commessa ma non torna quella con ora e minuti diversa, ripete solo la prima

    http://s4.imagestime.com/out.php/i59...cocommesse.jpg

    e questa come si può notare è la lista delle commesse dove si nota che la commessa fatta dall'utente pollo chiamata Czar Gymnasium ha due valori diversi di ore e minuti ed invece viene ripetuta la prima

  8. #8
    Guest

    Predefinito

    questo è il codice di come sono state create le tabelle:
    Codice:
    -- -----------------------------------------------------
    
    -- Table `entratee`.`impiegato`
    
    -- -----------------------------------------------------
    
    DROP TABLE IF EXISTS `entratee`.`impiegato` ;
    
    
    
    CREATE  TABLE IF NOT EXISTS `entratee`.`impiegato` (
    
      `username` VARCHAR(20) NOT NULL ,
    
      `password` VARCHAR(20) NOT NULL ,
    
      `nome` VARCHAR(45) NOT NULL ,
    
      `cognome` VARCHAR(45) NOT NULL ,
    
      `admin` INT NOT NULL ,
    
      PRIMARY KEY (`username`) )
    
    
    
    
    
    
    
    -- -----------------------------------------------------
    
    -- Table `entratee`.`turno`
    
    -- -----------------------------------------------------
    
    DROP TABLE IF EXISTS `entratee`.`turno` ;
    
    
    
    CREATE  TABLE IF NOT EXISTS `entratee`.`turno` (
    
      `idturno` INT NOT NULL AUTO_INCREMENT ,
    
      `username` VARCHAR(20) NOT NULL ,
    
      `data` DATE NOT NULL ,
    
      `oraingresso` TIME NOT NULL ,
    
      `orauscita` TIME NOT NULL ,
    
      `ip` VARCHAR(15) NOT NULL ,
    
      PRIMARY KEY (`idturno`) )
    
    
    
    
    
    
    
    -- -----------------------------------------------------
    
    -- Table `entratee`.`commessa`
    
    -- -----------------------------------------------------
    
    DROP TABLE IF EXISTS `entratee`.`commessa` ;
    
    
    
    CREATE  TABLE IF NOT EXISTS `entratee`.`commessa` (
    
      `idcommessa` INT NOT NULL AUTO_INCREMENT ,
    
      `username` VARCHAR(20) NOT NULL ,
    
      `data` DATE NOT NULL ,
    
      `nomecommessa` VARCHAR(25) NOT NULL ,
    
      `commessa1` INT NOT NULL ,
    
      `visibile` TINYINT(1)  NULL DEFAULT true ,
    
      PRIMARY KEY (`idcommessa`) )
    
    
    
    
    
    
    
    -- -----------------------------------------------------
    
    -- Table `entratee`.`turno_has_impiegato`
    
    -- -----------------------------------------------------
    
    DROP TABLE IF EXISTS `entratee`.`turno_has_impiegato` ;
    
    
    
    CREATE  TABLE IF NOT EXISTS `entratee`.`turno_has_impiegato` (
    
      `turno_idturno` INT NOT NULL AUTO_INCREMENT ,
    
      `impiegato_username` VARCHAR(20) NOT NULL ,
    
      PRIMARY KEY (`turno_idturno`, `impiegato_username`) ,
    
      INDEX `fk_turno_has_impiegato_impiegato1` (`impiegato_username` ASC) ,
    
      INDEX `fk_turno_has_impiegato_turno1` (`turno_idturno` ASC) ,
    
      CONSTRAINT `fk_turno_has_impiegato_turno1`
    
        FOREIGN KEY (`turno_idturno` )
    
        REFERENCES `entrate`.`turno` (`idturno` )
    
        ON DELETE NO ACTION
    
        ON UPDATE NO ACTION,
    
      CONSTRAINT `fk_turno_has_impiegato_impiegato1`
    
        FOREIGN KEY (`impiegato_username` )
    
        REFERENCES `entrate`.`impiegato` (`username` )
    
        ON DELETE NO ACTION
    
        ON UPDATE NO ACTION)
    
    
    
    
    
    
    
    -- -----------------------------------------------------
    
    -- Table `entratee`.`impiegato_has_commessa`
    
    -- -----------------------------------------------------
    
    DROP TABLE IF EXISTS `entratee`.`impiegato_has_commessa` ;
    
    
    
    CREATE  TABLE IF NOT EXISTS `entratee`.`impiegato_has_commessa` (
    
      `impiegato_username` VARCHAR(20) NOT NULL ,
    
      `commessa_idcommessa` INT NOT NULL ,
    
      `prymaryk` INT NOT NULL AUTO_INCREMENT ,
    
      INDEX `fk_impiegato_has_commessa_commessa1` (`commessa_idcommessa` ASC) ,
    
      INDEX `fk_impiegato_has_commessa_impiegato1` (`impiegato_username` ASC) ,
    
      PRIMARY KEY (`prymaryk`) ,
    
      CONSTRAINT `fk_impiegato_has_commessa_impiegato1`
    
        FOREIGN KEY (`impiegato_username` )
    
        REFERENCES `entrate`.`impiegato` (`username` )
    
        ON DELETE NO ACTION
    
        ON UPDATE NO ACTION,
    
      CONSTRAINT `fk_impiegato_has_commessa_commessa1`
    
        FOREIGN KEY (`commessa_idcommessa` )
    
        REFERENCES `entrate`.`commessa` (`idcommessa` )
    
        ON DELETE NO ACTION
    
        ON UPDATE NO ACTION)

  9. #9
    Guest

    Predefinito

    Potresti provare a mettere prima della riga in cui fai

    Codice PHP:
    mysql_query($query);
    un

    Codice PHP:
    echo $query."<br />";

    mysql_query($query);
    e poi postare il testo della query che viene eseguita (soprattutto quella dove ci sono "errori"?

  10. #10
    Guest

    Predefinito

    ecco cosa ho ottenuto dopo avere inserito il break
    http://s4.imagestime.com/out.php/i59...utputbreak.jpg

    EDIT: ecco cosa succede prima che confermo la data inizio e data fine
    http://s4.imagestime.com/out.php/i59...nfermadata.jpg

    EDIT 2
    : quindi prima che confermo la data entra nel primo if, poi entra nell'else, ma non riesco a capire cosa mi sfugge, perchè per nomi uguali di commesse sfasa e nomi diversi funge?
    Ultima modifica di javascripter : 12-09-2011 alle ore 19.39.49 Motivo: niente up, usa il tasto edita.

  11. #11
    Guest

    Predefinito

    Forse una luce nel buio...

    Nella seconda query (quella dove nel FROM c'è pure la tabella turno), indichi le relazioni tra le tabelle IMPIEGATI, COMMESSA e IMPIEGATO_HAS_COMMESSA, ma nessuna relazione con TURNI.
    Ecco allora che quello che ottieni è un prodotto cartesiano (righe prima tabella x righe seconda tabella) e quindi il moltiplicarsi delle righe.

    Se non ho capito male la relazione mancante dovrebbe essere impiegato.username = turno.username
    Ultima modifica di simpleticket : 12-09-2011 alle ore 21.04.52

  12. #12
    Guest

    Predefinito

    scusa simpleticket, ho sbagliato a postare le query con la relazione alla tabella turno, quella era una prova che avevo fatto, ma inserendo quella relazione la tabella non mi funziona completamente, vediamo di fare un pò di chiarezza sia per me che sto facendo un pò di confusione che per te per farti capire meglio

    Dunque io ho queste tabelle:

    commessa
    idcommessa|username|data|nomecommessa|ora|minuti

    impiegato
    username|password|nome|cognome|admin

    impiegato_has_commessa
    impiegato_username|commessa_idcommessa|primaryK

    turno
    idturno|username|data|oraingresso|orauscita|ip

    turno_has_impegato
    turno_idturno|impiegato_username

    voglio mettere in relazione le tabelle commessa, impiegato, impiegato_has_commessa

    per ottenere la tabella relativa alla visualizzazione delle commesse:

    il nome dell'username (comune alle tabelle: commessa, impiegato, impiegato_has_commessa con il suo campo impiegato_username),

    nomecommessa dalla tabella commessa, data dalla tabella commessa (quì il mio dubbio è che dato che il campo data c'è l'ha pure la tabella turno la devo mettere pure in relazione?) ,

    oracommessa dalla tabella commessa (diverso dal campo turno dove ci stanno due record con oraingresso e orauscita, da gedstire nella tabella turni)

    minuti dalla tabella commessa

    ottenendo la tabella finale visualizzacommesse
    in alto username:caio
    i record
    commessa|data|ora|minuti

    attualmente ottengo una ripetizione quando la data, ora e i minuti cambiano, tralasciano i valori diversi e ripertendo solo la prima voce

    esempio:
    nella tabella ho la commessa palestra:

    palestra 12-09-2011 3 15
    palestra 13-09-2011 2 30
    palestra 14-09-2011 1 15

    ottendo
    palestra 12_09_2011 3 15
    palestra 12_09_2011 3 15
    palestra 12_09_2011 3 15

    non visualizzando le altre due

    sarà che ci sto sopra molto che ho confusione in testa e non vedo l'errore nelle query, spero di essere stato un pò più chiaro per risalire alla mancaza
    grazie per il tuo aiuto

  13. #13
    Guest

  14. #14
    Guest

    Predefinito

    Prima di leggere con calma tutto, ti volevo far notare dove manca la relazione.

    Facendo riferimento a questa http://s4.imagestime.com/out.php/i59...nfermadata.jpg

    si legge

    select * from impiegato, commessa, impiegato_has_commessa, turno where (impiegato.username='pollo') AND (impiegato.username=impiegato_has_commessa.impiega to_username) AND (impiegato_has_commessa.commessa_idcommessa=commes sa.idcommessa) AND (DATEDIFF(commessa.data, DATE('--'))>0) AND DATEDIFF(commessa.data, DATE('--'))<0)

    Come vedi in FROM inserisci la tabella turno, mentre il WHERE non metti le relazioni, cosa invece presente per impiegato, commessa, e impiegato_has_commessa.

  15. #15
    Guest

    Predefinito

    si infatti come ti ho spiegato nel post era una dimenticanza che ho lasciato, quando ho fatto la prova ad inserire la tabella turno, se lo faccio non mi funziona completamente quindi ti ho postato le query come sono adesso mettendo in relazione solo le tabelle: impiegato, commessa e impiegato_has_commessa

  16. #16
    Guest

    Predefinito

    Scusami, mi sa che ci stiamo incartando.

    Ma i dati che vuoi visualizzare (Commessa, Data, Ore, Minuti - filtro su username) non sono TUTTI presenti nella tabella commessa?
    E allora perchè andare a cercare le altre?
    Se magari voveli visualizzare nome e cognome dell'utente, avresti effettuato una join con la tabella utenti, ma visto che, ti ripeto, tutti i dati che vuoi estrarre sono in una tabella, perchè le join?

    O non ho capito qualcosa?

  17. #17
    Guest

    Predefinito

    hai ragione
    si esatto i dati sono tutti nella tabella commessa filtro username
    il fatto e che non ho incominciato da molto a fare php e mysql, vedendo in giro avevo trovato una cosa simile, ma mi sono fatto la stessa domanda, perchè questa
    query se i dati sono tutti nella tabella commessa, io avevo provato a tirare i dati con un pò di prove di query ma mi tirava fuori tutto quello che vi era nel database della tabella commessa ed invece io volevo che prendesse solo i dati di un certo utente, poi ho visto sto esempio, che mi tira i dati di un solo utente specificato ma ha sta cosa dei dati ripetuto. Secondo le info avute in questo momento come sarebbe la query giusta per avere quello che voglio?
    all'inizio avevo fatto così ma erano errate:

    Codice:
     $query = "select * from impiegato, commessa where (impiegato.username = '".htmlspecialchars($_REQUEST['username'])."') AND (commessa.nomecommessa)AND (commessa.data) AND (commessa.commessa1) AND (commessa.minuti)AND(DATEDIFF(commessa.data, DATE('".$datainizio."')) > 0) AND  (DATEDIFF(commessa.data, DATE('".$datafine."')) < 0)"; 
    
    
      
                
    
    	$query = "select * from impiegato, commessa where (impiegato.username = '".htmlspecialchars($_REQUEST['username'])."') AND (commessa.nomecommessa)AND (commessa.data) AND (commessa.commessa1) AND (commessa.minuti)";

  18. #18
    Guest

    Predefinito

    Io farei semplicemente

    Codice PHP:
    $query = "SELECT nomecommessa, data, ora, minuti FROM commessa WHERE username = '".mysql_real_escape_string($_REQUEST['username'])."'";

  19. #19
    Guest

    Predefinito

    funziona, ti faccio la statua, sono impazzito perchè prendevo per buono un esempio fatto sulla rete e mi sono incartato come pazzi quando come hai notato pure te i dati sono in una tabella, grazie mille simpleticket, erano giorni che ci sbattevo sopra
    adesso posso dormire un pò la notte
    e gestire le altre cose che sono simili e non inoltrarmi in cose che non occorre

  20. #20
    Guest

    Predefinito

    Di nula.

    Mi dimostri solo che prendere del codice e ricopiarlo, senza sapere cosa si sta facendo, non solo non produce l'effetto sperato, ma non aiuta per nulla ad imparare.

    Solo sbattendoci sopra, come hai fatto, si impara qualcosa

  21. #21
    Guest

    Predefinito

    si simpleticket e farò sempre così da adesso è la migliore cosa
    una precisazione della query
    nell'if và aggiunta la stringa per in confronto della data altrimenti non funge

    quindi :

    Codice PHP:

    $query
    = "SELECT nomecommessa, data, commessa1, minuti FROM commessa WHERE username = '".mysql_real_escape_string($_REQUEST['username'])."' AND DATE('".$datainizio."')) > 0) AND (DATEDIFF(commessa.data, DATE('".$datafine."')) < 0)";
    grazie ancora

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •