Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606

    Sistema di news interno al sito

    Ciao
    ho un problema

    Sto creando un semplice sistema di news interno ad un sito.

    La tabella delle news è così costruita (mysql)
    CREATE TABLE `news` (
    `id_news` int(10) UNSIGNED NOT NULL,
    `id_ute` int(10) UNSIGNED NOT NULL,
    `data` timestamp NOT NULL DEFAULT current_timestamp(),
    `titolo` varchar(256) NOT NULL,
    `messaggio` varchar(2048) NOT NULL,
    `visibile` tinyint(4) NOT NULL DEFAULT 0 COMMENT '0=invisibile (predefinito), 1 = visibile'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='News al sito delle Apo / Leg';
    Dove id_ute è l'ID di chi ha inserito il messaggio, id_news è l'ID della news; titolo e messaggio sono intuitivi immagino, data è la data di inserimento del messaggio, visibile è un flag (zero o uno) per rendere il messaggio visibile o meno senza doverlo cancellare.

    Ogni utente poi è accreditato al sito tramite account e password e quando effettua il login dal database viene prelevata la data del suo ultimo ingresso, così da vedere se sono state generate news dall'ultima volta che si "loggato".

    Semplice no?

    Fino a qui sembra di sì, e in pratica dopo il login si viene portati nell'homepage dove c'è la finestra che mostra le eventuali news (se non ce ne sono non viene mostrata nemmeno la finestra).

    Quindi ecco il problema che mi si presenta: dovendo fare il check delle news ho pensato di verificare tramite query sql se la data riportata dal record utente fosse maggiore o uguale a quella dell'ultima news inserita, in pratica faccio:
    codice:
    SELECT * FROM news WHERE visibile = 1 AND data >= :data_ingresso_utente ORDER BY data ASC
    Per provarlo ho inserita una semplice news con questi dati:
    1, 2, '2020-02-21 06:44:51', 'News', 'Da oggi esiste un bellissimo sistema di news nel sito.', 1
    E dato che la data del mio ingresso al sito è quella di oggi 2022-01-12 08:42:11 non mi doveva dare nessuna news in quanto la data era precedente al mio ingresso.

    In realtà mi genera un errore:
    Fatal error: Uncaught PDOException: SQLSTATE[42000]:
    Syntax error or access violation: 1064 Errore di sintassi nella query SQL vicino a '> ? ORDER BY data DESC; --'
    linea 1 in C:\Apache\users\marco\apoleg-2\index.php on line 720( ! )
    PDOException: SQLSTATE[42000]:
    Syntax error or access violation: 1064 Errore di sintassi nella query SQL vicino a '> ? ORDER BY data DESC; --'
    linea 1 in C:\Apache\users\marco\apoleg-2\index.php on line 720
    Call Stack#TimeMemoryFunctionLocation10.0000466936{main }( )...\index.php:020.0312634584leggiNews( $pdo = class PDO { }, $dataUltimaNewsLetta = '2022-01-12 08:42:11' )...\index.php:75130.0312634584prepare( $statement = 'SELECT * FROM news WHERE visibile = 1 AND data => :data ORDER BY data DESC; --' )...\index.php:720
    Non si legge benissimo ma non riesco a formattarlo meglio.

    Questo se la query riporta data >= :data_ingresso_utente se invece inserisco come query data =< :data_ingresso_utente allora la news viene letta.

    Ovvio, viene letta in quanto gli ho chiesto di leggermi quelle più vecchie, ma se cambio la query mi da errore.
    Ho pensato: va bene , non ci sono altre news con data maggiore di oggi, quindi può dare adito ad un errore (bo!) cambio la data della news, la porto a febbraio 2022!
    Niente, stesso errore. Sono bloccato.

    Dato che mi chiederete il codice PHP ecco lo script che legge le news.
    Codice PHP:
    function leggiNews($pdo$dataUltimaNewsLetta null){
                
    $sql 'SELECT * FROM news WHERE visibile = 1 AND data >= :data ORDER BY data DESC; --';   
                 
    $handle $pdo->prepare($sql);    
                if(empty(
    $dataUltimaNewsLetta) === true)
                  
    //  Se è false leggo tutte le news        
                  
    $handle->bindValue(':data'nullPDO::PARAM_NULL);    
                else
                  
    //  Leggo le news a partire dalla data        
                  
    $handle->bindValue(':data'$dataUltimaNewsLettaPDO::PARAM_STR);
                
    $handle->execute();    
                
    $news $handle->fetchAll();
                unset(
    $handle);
                return 
    $news;

    Dove $pdo è la connessione al database, e $dataUltimaNewsLetta, è la data segnata nel login utente, che se non ha mai effettuato il login non è presente e per questo va a NULL e legge tutte le news presenti nel database (forse comunque dovrei limitare questa data in ogni caso o tra poco diventeranno centinaia )

  2. #2
    Utente di HTML.it L'avatar di Marcolino's
    Registrato dal
    May 2003
    residenza
    Udine
    Messaggi
    3,606
    RISOLTO:

    non potevo utilizzare data come nome di campo perché data è una parola riservata in mysql.

    E va be capita no?

  3. #3
    Quote Originariamente inviata da Marcolino's Visualizza il messaggio
    RISOLTO:

    non potevo utilizzare data come nome di campo perché data è una parola riservata in mysql.

    E va be capita no?
    A volte capita pure a me, ma fa sempre riderissimo.
    Mi permetto solo di segnalarti una cosa che ho notato, tu inserisci l'id utente direttamente in tabella, io preferisco creare una tabella relativa dove definisco le associazioni di questo tipo, ti consiglio tale metodo per ovviare a modifiche importanti future, ti lascai più "comodo" nel cambiare architettura

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.