• User Attivo

    Problema Inserimento campi in database

    Salve ragazzi...sto cercando di realizzare uno script che mi visualizzi il nickname del profilo che visita un altro utente provvisto di data e ora della visita...
    il nickname di chi visita me lo ricavo tramite
    _SESSION
    mentre il nick di chi si va a visitare tramite _GET

    Questo lo script

    [php]
    <?
    //Apro la sessione e...
    session_start();

    //verifico se esiste la variabile destinatario per il voto
    if(isset($_GET['nickname']) OR $_GET['nickname'] != ""){
    $destinatario=$_GET['nickname'];
    }
    $nickdichivisita=$_SESSION['nickname'];
    $nicknamevisitato=$_GET['nickname'];

    //parte relativa alla data e all ora delle visite ricevute da utenti
    $date3 = date("Y/m/s H");

    //data ultima visita
    $ultimavisita3=strftime("%A %d %B %Y");
    //ora ultima visita
    $ultimavisitaora3=strftime("%T");

    //valore che assegno al campo letto relativo al nick di chi visita
    $letto='1';

    //seleziono le visite e controllo se l utente che visita abbia nel campo letto il valore 1...se si aggiorni cioè fai un update altrimenti invece
    //se il campo letto e vuoto inserisci i dati

    //mi connetto al datase
    $link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
    $query1 = @mysql_query("SELECT id,nickvisitato1,nickdichivisita1,letto
    FROM visiteutenti WHERE nickvisitato1='$nicknamevisitato' AND nickdichivisita1='$nicknamevisitato'",$link);

    while($row=mysql_fetch_array($query1)){

     $nickdichivisita=$row['nickdichivisita1'];
     $nickvisitato=$row['nickvisitato1'];
    

    $haivisitato=$row['letto'];

    }
    if($nickdichivisita=$haivisitato){

    $query = "UPDATE visiteutenti SET nickdichivisita1 = '$nickdichivisita'";
    $query2 = "UPDATE visiteutenti SET nickvisitato = '$nickvisitato1'";
    $query3 = "UPDATE visiteutenti SET letto = '1'";
    $query4 = "UPDATE visiteutenti SET datadellavisita = '$ultimavisita3'";
    $query5 = "UPDATE oradellavisita SET datadellavisita = '$ultimavisitaora3'";
    $query6 = "UPDATE oradellavisita SET data3 = '$date'";

    } else{

    //Se quell utente non ha ancora visitato quell utente Invio i dati al database
    $query2 = @mysql_query("INSERT INTO visiteutenti VALUES ('$id','$nickdichivisita','$nickvisitato'
    ,'$letto','$ultimavisita3','$nickvisitato','$ultimavisitaora3','$date3')",$link);

    }
    [/php]Succede però che nel database non mi inserisce nulla..come mai??


  • ModSenior

    Ciao,

    Metti:
    [php] or die(mysql_error()) [/php]
    E vedi se ci sono errori.


  • User Attivo

    [PHP]

    //seleziono il database
    mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());

    [/PHP]

    L ho aggiunto ma non mi da nessun errore...:():


  • ModSenior

    Devi aggiungerlo a tutte le query, altrimenti se continui a nascondere gli errori con le @, non potrai capire mai niente.


  • User Attivo

    Mi ritrovo questo errore..

    Errore apertura database: Column count doesn't match value count at row 1


  • ModSenior

    Gli insert sarebbe sempre meglio farli specificando a quale campo dare quel valor.
    Probabilmente stai saltando qualche campo della tabella.


  • User Attivo

    @Thedarkita said:

    Gli insert sarebbe sempre meglio farli specificando a quale campo dare quel valor.
    Probabilmente stai saltando qualche campo della tabella.
    Su quello script non ci capivo piu' nulla..ne sto facendo un altro...

    [PHP]
    <?
    //Apro la sessione e...
    session_start();

    //verifico se esiste la variabile destinatario per il voto
    if(isset($_GET['nickname']) OR $_GET['nickname'] != ""){
    $destinatario=$_GET['nickname'];
    }
    $nickdichivisita=$_SESSION['nickname'];
    $nicknamevisitato=$_GET['nickname'];
    //parte relativa alla data e all ora delle visite ricevute da utenti

    setlocale(LC_TIME, 'it_IT');

    $date3 = date("Y/m/s H");

    //data ultima visita
    $ultimavisita3=strftime("%A %d %B %Y");
    //ora ultima visita
    $ultimavisitaora3=strftime("%T");

    //valore che assegno al campo letto relativo al nick di chi visita
    $letto='1';

    //mi connetto al database
    $link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
    //seleziono la tabella
    mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());

    $strsql="INSERT INTO visiteutenti (id,nickdichivisita1,nickvisitato1,letto,datadellavisita,oradellavisita,data3)

    VALUES ('','$nickdichivisita','$destinatario','1','$ultimavisita3','$ultimavisitaora3',NOW())";

    mysql_query("$strsql",$link) or die("Errore query database: " . mysql_error());

    [/PHP]

    Fino a qui funziona tutto...ora dovrei fare in modo che se un utente rivisita quell utente
    eseguire un aggiornamento dei campi..
    Per come e strutturatro lo script ora ad ogni visita aggiunge delle nuove righe..invece io vorrei che aggiornasse non che aggiungesse..
    Come potrei proseguire lo script per far ciò?


  • ModSenior

    Puoi usare insert on duplicate key se utilizzi gli indici.
    Altrimenti fai una query che controlli se già è stato visitato fai un update se no aggiungi.

    La seconda solzuione ti obbliga a fare 2 query e quindi la CPU lavora di più, è preferibile la prima però dipende da come hai impostato in discorso.


  • User Attivo

    Lo script è in via di sviluppo...quindi modificabile.
    Riguardo la tua prima ipotesi dovrei assegnare al campo id auto_increment chiave primaria giusto?
    Funziona cosi'?


  • ModSenior

    No perchè se è autoincrement non può avere mai un duplicate key. Sarebbe da mettere come chiave primaria una cosa tipo idvisitatore-idvisitato per poter sfruttare la prima soluzione.


  • User Attivo

    Quindi devo togliere il campo con l auto increment dalla tabella...e assegnare chiave primaria al mio campo "nickdichivisita" ?


  • ModSenior

    Come ti ho scritto primo sarebbe da mettere come chiave primaria una cosa tipo idvisitatore-idvisitato per poter sfruttare la prima soluzione.
    Altrimenti usi la seconda soluzione se ti viene più facile da implementare per ulteriori funzionalità dello script finale.


  • User Attivo

    @Thedarkita said:

    Come ti ho scritto primo sarebbe da mettere come chiave primaria una cosa tipo idvisitatore-idvisitato

    :mmm:
    Scusami ma non ho capito...

    idvisitatore-idvisitato sarebbe un unico campo??
    Se si in questo campo dovrei salvarmi il nick di chi visita??


  • ModSenior

    Supponendo che io guardo il tuo profilo nel campi id metti: thedarkita-carlitos1982.
    Anche se è sempre preferibile mettere l'id al nick.


  • User Attivo

    Quindi devo fare in modo che nel campo id con chiave primaria mi vadano a finire il nick di chi visita e dell utente che viene visitato nel formato

    idvisitatore-idvisitato

    Giusto?


  • ModSenior

    Si, ma come ti ho detto prima se apposto del nick metti l'id è meglio, oltre ad occuparti meno memoria se ai tuoi utenti dai la possibilità di cambiare nick ti sballa tutto.


  • User Attivo

    Giusto..non ci avevo pensato....
    Forse e meglio che uso la seconda soluzione..
    Per quanto riguarda gli Update e possibile utilizzare un solo Update su piu' campi???


  • ModSenior

    Si, basta separare con la virgola.


  • User Attivo

    Per quanto riguarda il ocntrollo...
    io do al campo"letto" il valore 1 ogni volta che un utente visita un altro utente...
    ora come faccio per..
    se io utente carlitos ho il valore 1 nel campo "letto" relativo all utente nicola fai update con i nuovi valori....
    altrimenti inserisci...

    [php]
    //verifico se esiste la variabile destinatario per il voto
    if(isset($_GET['nickname']) OR $_GET['nickname'] != ""){
    $destinatario=$_GET['nickname'];
    }
    $nickdichivisita=$_SESSION['nickname'];

    //seleziono i campi
    $strsql="SELECT id,nickdichivisita1,nickvisitato1,letto,datadellavisita,oradellavisita,data3 FROM visiteutenti

    WHERE nickvisitato1='$destinatario'

    ";

    $rs=@mysql_query("$strsql",$link) or die("Errore query database: " . mysql_error());
    //faccio un ciclo while
    while ($riga = mysql_fetch_array($rs)) {
    $str_nickdichivisita = $riga['nickdichivisita1'];
    $str_datadellavisita = $riga['datadellavisita'];
    $str_oradellavisita = $riga['oradellavisita'];

    if($str_nickdichivisita
    //qui nn ho capito come fare il ocntrollo..[/php]


  • User Attivo

    Ho fatto cosi'...
    [PHP]
    //mi connetto al database
    $link = mysql_connect("$db_host", "$db_database", "$db_username", "$db_password") or die("Errore connessione: ". mysql_error());
    //seleziono il database
    mysql_select_db('my_italiawebchat') or die("Errore apertura database: " . mysql_error());
    //seleziono i campi da visualizzare per singolo utente
    $strsql="SELECT id,nickdichivisita1,nickvisitato1,letto,datadellavisita,oradellavisita,data3 FROM visiteutenti

    WHERE nickvisitato1='$destinatario'

    ";

    $rs=@mysql_query("$strsql",$link) or die("Errore query database: " . mysql_error());
    //faccio un ciclo while
    while ($riga = mysql_fetch_array($rs)) {
    $str_nickdichivisita = $riga['nickdichivisita1'];
    $str_datadellavisita = $riga['datadellavisita'];
    $str_oradellavisita = $riga['oradellavisita'];
    $haivisitato=$riga['letto'];

    }if($str_nickdichivisita =$haivisitato)

    $queryaggiorna = mysql_query("UPDATE visiteutenti SET nickdichivisita1 = '$nickdichivisita' , nickvisitato1 = '$destinatario', letto = '1', datadellavisita = '$ultimavisita3'

    , oradellavisita = '$ultimavisitaora3', data3 = NOW()

    WHERE nickvisitato1='$destinatario'");

    else{
    $strsql="INSERT INTO visiteutenti (id,nickdichivisita1,nickvisitato1,letto,datadellavisita,oradellavisita,data3)

    VALUES ('','$nickdichivisita','$destinatario','1','$ultimavisita3','$ultimavisitaora3',NOW())";

    mysql_query("$strsql",$link) or die("Errore query database: " . mysql_error());

    }
    [/PHP]
    Funziona...ora devo dedicarmi alla parte della visualizzazione...
    :smile5: