• Consiglio Direttivo

    Quello dell'archivio news dovrebbe essere un prossimo step, bisogna solo trovare il tempo per dedicarcisi. 😄

    Vediamo un po':
    la data è memorizzata nel Db nel formato timestamp, quindi giostrandoti con l'utilizzo delle funzioni mktime e date dovresti riuscire senza troppa fatica ad isolarti i timestamp di ogni inizio a fine mese, partendo dall'attuale mese.
    Esempio:
    facendo time() adesso avrei come risultato: 1238622143
    Mi estratto mese ed anno corrente:
    [php]$time=time();
    $month=date("m", $time);
    $year=date("Y", $time);[/php]Per conoscere il timestamp di inizio mese (01/04/2009 00:00:00) mi basta usare la funzione mktime:
    [php]$data1=mktime(0,0,0,$month,1,$year);[/php]Che mi darà il timestamp 1238536800.

    Se voglio conoscere il timestamp dell'inizio mese precedente mi basterà diminuire il valore di $month:
    [php]$data2=mktime(0,0,0,$month-1,1,$year);[/php]ed otterro': 1235862000 (01/03/2009 00:00:00)

    A questo punto se voglio le news del mese di Marzo impostero' la query così:
    [php]$sql="SELECT * FROM news WHERE publish_data>='$data2' AND publish_data<'$data1'";[/php]

    Bisogna lavorare un po' con i cicli e dovrebbe andare. 😉

    Un metodo più veloce (anche a livello di esecuzione) e pratico potrebbe essere quello di creare una tabella con i timestamp di inizio e fine mese che si aggiorna al primo post del mese.

    Avrai così i dati di confronto pronti e non rischi di visualizzare mesi vuoti se per esempio un mese intero non hai postato news.

    Fai un ciclo padre sui record contenuti in questa tabella ed all'interno ci piazzi il ciclo per l'estrazione delle news, come da select di poco fa' solo che i timestamp di confronto li hai già belli che pronti. 😉

    Non so...a quest'ora e con il cervello cotto a puntino mi son passate queste due soluzioni in mente. :bigsmile:


  • User Newbie

    Grazie mille per i suggerimenti, mi sono stati davvero utilissimi! Sono infatti riuscito a creare un archivio di news nel quale l'utente, attraverso delle combobox, può scegliere mese e anno e leggere le news corrispondenti (magari potrei postare tutto il codice, sicuramente sarà un pò rozzo, ma può sempre esservi di ispirazione per costruire il vostro archivio)

    Direi che a questo punto ho un ultimo problema, ovvero come gestire il fatto che un utente possa selezionare una data in cui non ci sono news.

    A questo propostito vorrei sapere una cosa...nella query

    [php]$sql= "SELECT * FROM news WHERE publish_data>='$data' AND publish_data<'$datafine'
    ORDER BY publish_data ".$order."";
    $query=@mysql_query($sql) or die (mysql_error());[/php]Dove $data e $datafine rappresentano rispettivamente il primo giorno del mese e il primo giorno del mese successivo, e dove le date ricercate non siano presenti nel database... $query che valore assume? 0? stringa vuota? False? Qualche altra cosa?

    La mia idea infatti era di fare un controllo su questa variabile prima di cominciare il ciclo dei vari risultati, e nel caso fosse risultata 0/vuota/false/qualcos'altro, stampare a video il messaggio "Non ci sono news disponibili per questo mese"... Può funzionare? Oppure esiste un modo migliore?

    Grazie ancora per gli aiuti preziosi che mi hai fornito!


  • Consiglio Direttivo

    Il tuo contributo sarà certamente benvenuto, posta pure il codice se vuoi. 😉

    Se la query non estrae dati restituisce una risorsa vuota, potresti semplicemente verificare con mysql_num_rows() se il numero di righe è diverso da zero. 😉

    Diversamente potresti costruire la combobox direttamente con mesi dove ci sono le news, ovvero verificare a priori questa condizione. 🙂


  • User Newbie

    Grazie, ora è perfettamente funzionante!

    Appena ho un attimo di tempo pulisco il codice, lo commento e lo posto!

    Ora, vorrei segnalare un problema che ho scoperto e che riguarda la scrittura delle news: quando inserisco una news, se ho scritto una parola con l'apostrofo (ad esempio: l'albero) ottengo questo errore:

    [php]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'albero</p>', '1', '1238796000', '0')' at line 1[/php]Se ho capito bene, dipende dal fatto che l'apostrofo viene riconosciuto come sintassi del codice. Io al momento risolvo semplicemente racchiudendo l'apostrofo tra i backslash ('), ma sarei curioso di sapere il perchè di questo errore, visto che nella vostra demo questo non si verifica.


  • Consiglio Direttivo

    :mmm:

    Strano dovrebbe pensarci l'editor a renderlo un entità HTML, difatti mi funziona sulla demo.

    Pero' mi hai fatto notare che mi ero dimenticato una cosa. 😄

    Apri il file admin_action.php ed alle righe 12-13-15-16-100-101 (dove c'è la chiamata alla funzione htmlentities()) aggiungi l'ENT_QUOTES, ovvero così:
    [PHP]$title=htmlentities($_POST['new_title'], ENT_QUOTES);[/PHP]

    😉


  • User Newbie

    Ottimo, adesso funziona tutto alla perfezione!!

    Ok, ecco qua quello che sono riuscito a combinare per realizzare il mio archivio.

    Innanzitutto abbiamo il form, che trasmette i parametri ricevuti attraverso il metodo POST alla pagina archivionews.php:

    [php]
    <form action="archivionews.php" method="post">
    <select name="mese">
    <option value="1">Gennaio</option>
    <option value="2">Febbraio</option>
    <option value="3">Marzo</option>
    <option value="4">Aprile</option>
    <option value="5">Maggio</option>
    <option value="6">Giugno</option>
    <option value="7">Luglio</option>
    <option value="8">Agosto</option>
    <option value="9">Settembre</option>
    <option value="10">Ottobre</option>
    <option value="11">Novembre</option>
    <option value="12">Dicembre</option>
    </select>
    <select name="anno">
    <option value="2009">2009</option>
    <option value="2010">2010</option>
    </select>
    <input type="submit" value="Ricerca" />
    </form>
    [/php]E questo è il codice relativo a archivionews.php:

    [php]
    <?
    //controllo che le variabili siano settate e che non siano vuote
    if(isset($_POST['mese'])&& isset ($_POST['anno']))
    {
    if(($_POST['mese']!="")&& ($_POST['anno']!=""))
    {
    $connessione = mysql_connect("localhost", "user", "psw")
    or die("Connessione non riuscita: " . mysql_error());
    mysql_select_db("miodb",$connessione)
    or die("Connessione al database non riuscita: " . mysql_error());

            //$data e $anno contengono i parametri che gli sono stati passati dall'utente
            $data=$_POST['mese'];
            $anno=$_POST['anno'];
            
            if ($data!="0" && $anno!="0")
            {    
                //Eseguo l'istruzione switch per assegnare ad ogni valore che può assumere
                // la variabile $data il timestamp del primo giorno del mese corrispondente.
                switch ($data) {
                    case 1:
                    $data= mktime(0,0,0, 1, 1, $anno);
                    break;
                    case 2:
                        $data=mktime(0,0,0,2,1,$anno);
                    break;
                    case 3:
                        $data=mktime(0,0,0,3,1,$anno);
                    break;
                    case 4:
                        $data=mktime(0,0,0,4,1,$anno);
                    break;
                    case 5:
                        $data=mktime(0,0,0,5,1,$anno);
                    break;
                    case 6:
                        $data=mktime(0,0,0,6,1,$anno);
                    break;
                    case 7:
                        $data=mktime(0,0,0,7,1,$anno);
                    break;
                    case 8:
                        $data=mktime(0,0,0,8,1,$anno);
                    break;
                    case 9:
                        $data=mktime(0,0,0,9,1,$anno);
                    break;
                    case 10:
                        $data=mktime(0,0,0,10,1,$anno);
                    break;
                    case 11:
                        $data=mktime(0,0,0,11,1,$anno);
                    break;
                    case 12:
                        $data=mktime(0,0,0,12,1,$anno);
                    break;
                }
                
                //Per assegnare un valore $datafine eseguo un controllo: se $data è dicembre,
                //$datafine diventa il primo gennaio dell'anno successivo, altrimenti diventa il primo
                //giorno del mese successivo.
                $mese=date("m", $data);
                
                if($data!=mktime(0,0,0,12,1,$anno))
                {
                    $datafine=mktime(0,0,0,$mese+1,1,$anno);
                }
                else
                {
                    $datafine=mktime(0,0,0,1,1,$anno+1);
                }
                
                //Con questa query, seleziono tutte le news comprese tra $data e $datafine, 
                //ovvero tra il primo giorno di un mese (compreso) e il primo giorno del mese successivo (non compreso).
                $order="DESC";
                $sql=    "SELECT * FROM news WHERE publish_data>='$data' AND publish_data<'$datafine'
                    ORDER BY publish_data ".$order."";
                $query=@mysql_query($sql) or die (mysql_error());
                
                //questa variabile conterrà il numero di righe restituite dalla query
                $numrighe= mysql_num_rows($query);
            }
        }
    

    }
    else
    {
    echo "le variabili non sono state settate";
    }
    ?>
    <div id="contentnews">
    <?
    //Se il numero di righe restituite è 0, dirò che non ci sono news disponibili.
    if ($numrighe!=0)
    {
    // cicliamo adesso il risultato della nostra query per visualizzare le nostre news
    while ($row=mysql_fetch_array($query))
    {
    ?>
    <span class="titlenews"><? echo $row['title']; ?></span><br />
    <span class="datanews">Data: <? echo date("d/m/Y", $row['publish_data']); ?></span><br /> <!-- avendo salvato il valore data in timestamp utilizziamo la funzione date per visualizzare la data nel formato italiano -->
    <? echo html_entity_decode($row['text']); // la funzione html_entity_decode serve a ritrasformare le entità HTML create dall'editor in tag ?>
    <p><img src="images/separatore.jpg" alt=""></p>
    <?
    }
    }
    else
    {
    ?>
    <span class="titlenews"><? echo "Non ci sono news disponibili per la data selezionata." ?></span>
    <?
    }
    ?>
    </div>

    [/php]Spero che vi possa essere utile, e grazie ancora per il supporto!


  • Consiglio Direttivo

    Ringraziamo noi te per aver condiviso questa tua chicca con noi. 😉


  • User Newbie

    Scusate, faccio tutto quello che indica la pagina ma, inesorabilmente, non mi accetta il login. Non mi da alcun messaggio di errore, semplicemente non va avanti (anche se vedo la pagina di login). Sapreste dirmi che fare?

    Grazie, GF


  • Consiglio Direttivo

    Ciao giafa. 🙂

    Facendo login ti torna alla stessa schermata vuota senza messaggio di errore?
    A primo acchitto mi sembra di capire che non parta la sessione, dato che l'impostazione delle pagine di amministrazione è quella di controllare se la sessione c'è e che questa abbia corrispondenza con la tabella user del Database. Se non si verifica uno dei due controlli ti reindirizza alla pagina di login.
    Hai provato con altri script che avviano sessioni, se te le attiva?
    Altra prova che puoi fare è, una volta fatto il login, digitare sull'url invece di .../news/login.php -> news/admin.php e vedere se ti fa tornare alla pagina di login o ti fa accedere.
    Testa un po' e facci sapere. 😉


  • User Newbie

    HOps! avevo inserito un link attivo e devo ricominciare da capo..

    Grazie per la risposta. Niente da fare in ogni caso (ne richiamando la pagina di login e ne direttamente l'admin.php, sia prima che dopo) eppure in locale funziona.

    Se ho ben capito il mio servizio hosting potrebbe inibirmi l'esecuzione di script? In effetti , ora che ci penso, potrebbe essere per questo che non riesco nemmeno a vedere una pagina php in cui scaricare con uno script i contenuti di una tabella di un database (appunto una serie di contenuti). Lo script funziona in locale ma quando provo a lanciarlo in remoto mi restituisce l'errore per cui non riconosce i dati di connessione con il db mysql.

    Ho ben capito? Che dovrei fare?

    (ps se potesse servire il sito di prova su cui sto lavorando è *****.info e le pagine che cerco di richiamare sono .info/news/admin.php, l'user è "", la pass "*")

    Grazie, Gianni


  • Consiglio Direttivo

    Ehm....come dire...

    Nome utente e/o password errati.

    Questo è un messaggio di errore ben preciso direi. 😄


  • User Newbie

    Heem, Scusa!
    hai ragione, l'altra notte ho fatto un pò di pasticci nel tentativo di risolvere (avevo modificato il file di login e lo avevo dimenticato caricato nel server) ...... ero cotto.
    Stamattina l'ho reinstallato ed ho rifatto tutta la procedura.
    Quando mi chiede di specificare nome e password inserisco "giafa" e "seneca" , come ti avevo detto, non succede niente.
    In effetti la pagina di login mi restituisce questo:

    <?
    if ($_POST['username'] || $_POST['password'])
    {
    $username="giafa";
    $password="seneca";

    $username=htmlentities($_POST['username']);
    $password=md5($_POST['password']);

    require_once ("config.php");
    $sql="SELECT username FROM user WHERE username='$username' AND password='$password'";
    $query=@mysql_query($sql) or die (mysql_error());

    $num=mysql_num_rows($query);
    if ($num==1)
    {
    session_start();
    session_unset();
    session_destroy;

    session_start();
    $_SESSION['user']=mysql_result($query,0);
    
    header("Location:admin.php");
    

    }
    else
    {
    $msg="Nome utente e/o password errati.";
    }
    }

    Scusami ancora per la disattenzione

    Gianni


  • Consiglio Direttivo

    Controllerei che l'inserimento sulla tabella del Db sia andato a buon fine.
    Apri la tabella user e controlla che i tuoi dati di accesso siano memorizzati giusti. Per la password basta che con un editor di testo PHP scrivi
    [php]<?
    echo md5("latuapassword");
    ?>[/php]
    E quindi fai il debug per vedere il valore hashato della password....che sul Db dovrà essere identico. 😉

    Attenzione che nel caso della password minuscole e maiuscole son considerati differenti. 😉


  • User Newbie

    No non corrisponde, che devo fare?


  • Consiglio Direttivo

    Cosa non corrisponde?
    La password hashata?
    Le posteresti entrambe così vediamo se è un problema di script? 😉


  • User Newbie

    Ok:

    questa la pagina che mi resituisce lo script che mi hai indicato:

    bf743a59ab5ccf1e53089c61588de50f

    questo il valore nel campo user del dbmysql

    bc76d2300d508c34112760682b572e60


  • Consiglio Direttivo

    @giafa said:

    questo il valore nel campo user del dbmysql

    bc76d2300d508c34112760682b572e60
    L'hash md5 è giusto, ma perché dici il campo user? :mmm:
    Questo dovrebbe essere il valore del campo password.


  • User Newbie

    Ok, sempre peggio.....
    è il campo password (ci starò più attento)


  • Consiglio Direttivo

    Non capisco dove sia il problema. Sicuro di non aver effettuato modifiche al codice?
    Riproverei a cancellare tutto ed a rifare l'installazione. 😞

    P.S.
    Questa modifica:
    [php]<?
    if ($_POST['username'] || $_POST['password'])
    {
    $username="giafa";
    $password="seneca";

    $username=htmlentities($_POST['username']);
    $password=md5($_POST['password']);
    ..............[/php]
    Ti restituirà sempre il messaggio di errore dato che il file prevede che i dati arrivino da un form. 😉


  • User Newbie

    Reistallato tutto per la quinta volta, questa volta cancellando prima dal server la cartella e le voci db corrispondenti. Tutto come prima mentre in locale tutto continua a funzionare.

    Questo il codice del file config:

    [php]<?
    if ($_POST['username'] || $_POST['password'])
    {
    $username="";
    $password="";

    $username=htmlentities($_POST['username']);
    $password=md5($_POST['password']);

    require_once ("config.php");
    $sql="SELECT username FROM user WHERE username='$username' AND password='$password'";
    $query=@mysql_query($sql) or die (mysql_error());

    $num=mysql_num_rows($query);
    if ($num==1)
    {
    session_start();
    session_unset();
    session_destroy;

    session_start();
    $_SESSION['user']=mysql_result($query,0);
    
    header("Location:admin.php");
    

    }
    else
    {
    $msg="Nome utente e/o password errati.";
    }
    }
    ?>[/php]
    Questo la password ashata che mi resituisce lo script :
    bf743a59ab5ccf1e53089c61588de50f

    Questo nel db
    88fa1171068d4d0895bfd57f6d989cd7

    Se hai tempo e voglia e puoi controllare, ho cambiato i nuovi dati.

    user: giafanews
    pass: senecanews

    Grazie.