+ Rispondi al Thread
Pagina 3 di 3 primaprima 123
Visualizzazione dei risultati da 21 a 23 su 23

Discussione: Codice accetta solo identificatore numerico

  1. #21
    Jessi45 non è in linea Scolaretto
    Post
    85
    Si, ogni click sulla pagina lo memorizza nel db. Il codice funziona benissimo se come identificatore pagina metto un numero es: $pagina = 1;, il problema (non estrae il numero che c'è nel campo "volte") è se al posto del numero metto un nome es: pagina = "'a-istinti-del-body'";

    Questo crea la tabella:

    Codice PHP:
    CREATE TABLE IF NOT EXISTS `phpbb_contatore` (
      `
    paginavarchar(50COLLATE utf8_bin NOT NULL,
      `
    visiteint(11NOT NULL,
      
    PRIMARY KEY (`pagina`),
      
    KEY `visite` (`visite`)
    ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

  2. #22
    L'avatar di Brontolo
    Brontolo non è in linea Very Important Person
    Post
    2,798
    Jessi45, se il tuo desiderio è semplicemente quello di inserire un contatore di visite in una pagina, ti consiglio di usare uno dei numerosi contatori gratuiti disponibili, ad esempio ShinyStat tanto per citarne uno.
    Diversamente dovresti acquisire quel minimo di conoscenza di programmazione PHP e SQL che evidentemente ti manca e alla quale non sembri molto interessato.
    Questa discussione è ormai sterile.
    Il regolamento del forum: la prima cosa da leggere.

  3. #23
    L'avatar di +m+
    +m+
    +m+ non è in linea Scribacchino
    Post
    922
    Come ti avevo accennato c'è un errore di base, ovvero l'utilizzo di un campo chiave.
    Non puoi operare come hai scritto, perchè non ha proprio una logica.

    Devi fare così: inserire il valore 1 (se la pagina non esiste), oppure aggiornare il numero di visite (se la pagina esiste già).
    Il "trucco" funziona se PAGINA è una chiave primaria (e lo è, visto il tuo describe)
    codice:
    INSERT INTO phpbb_contatore(pagina,visite) VALUES ("nomedellapagina",1)
    ON DUPLICATE KEY 
    UPDATE visite=visite+1
    Però devi togliere la
    codice:
    KEY `visite` (`visite`)
    con un ALTER TABLE (in effetti non deve affatto essere una chiave, e potresti aver problemi con "on duplicate"

    Infine, volendo, potremmo discutere su come si fa un contatore per utilizzi massivi in scrittura (cioè come shardare verticalmente
    per ridurre il tempo di lock della singola riga), "pagando" il tempo in lettura, ma velocizzando notevolmente la scrittura.
    Se non hai capito nulla della frase che ho scritto sopra, allora ti basta quella riga.

    Questo che hai messo non può funzionare perchè...

    codice:
    mysql_query("UPDATE phpbb_contatore SET visite = visite+ 1 WHERE pagina = $pagina");
    mysql_query("INSERT INTO phpbb_contatore (pagina, visite) VALUES ($pagina, 1)"); 
    mysql_query("SELECT visite FROM phpbb_contatore WHERE pagina = $pagina");
    1) la prima update fallisce se la pagina non è mai stata acceduta.
    2) la seconda (insert) fallisce se hai già visitato una pagina (cioè non ti consente di creare due righe
    "paginaX","1" e "paginaX","1", perchè pagina è una chiave
    3) non ritorna quindi dati affidabili.
    In sostanza ha proprio un buco di logica
    Ultima modifica di +m+; 31-05-2016 08:27 

+ Rispondi al Thread
Pagina 3 di 3 primaprima 123

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi