Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: ! include a orario !

  1. #1

    ! include a orario !

    Salve a tutti!
    premetto che non sono molto pratico con php...cmq, avrei bisogno di uno script che mi visualizzi in base all'orario (in questo caso dopo le 11:00) un banner situato su una pagina tipo www.miodominio.it/mia.php

    dunque avevo pensato:

    <?php
    $a=time();
    $b=date('d M y - H:i:s', $a);
    echo$b;
    if (time()>11:00:00
    {
    <? include "www.miodominio.it/mia.php" ?>;
    exit();
    }
    ?>


    In questo modo non funziona!!

    Sapreste darmi qualche aiuto? E fattibile?

  2. #2
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Certo che si puo' fare devi solo stare attento a :

    - i tag <? e ?> servono per far capire ad apache dove e' presente del codice php
    se hai gia' aperto nn serve che riapri.

    - formato delle date che usi e alle stringhe di controllo.
    Usa sempre nei controlli le date in formato unix YYYY-MM-GG HH:II:SS che sono opportunamente formattate per effettuare i controlli sulle date sfruttando il controllo lessicografico.

    - sintassi dei controlli, mancata chiusura della parentesi dell'if, e i parametri di controllo.


    Codice PHP:

    <?php
    $a
    =time();
    //$b=date('d M y - H:i:s', $a);
    $b=date('Y-m-d H:i:s'$a); // HO SIA DATA CHE ORA
    $c date('H:i:s'$a); // HO SOLO L'ORA
    echo $b."
    "
    .$c;

    $control_time "11:00:00";

    if ( 
    $c>$control_time )
    {
         include 
    "www.miodominio.it/mia.php" ;
    }
    else
    {
         include 
    "www.miodominio.it/mia2.php" ;
    }

    ?>
    Se hai piu' banners puoi usare uno switch al posto di tanti if

  3. #3

    purtroppo non funziona...

    Purtroppo non funziona...
    mi da questo errore... mi segna l'orario ma non la pagina che voglio includere!

    2009-10-08 12:06:00
    12:06:00
    Warning: include() [function.include]: URL file-access is disabled in the server configuration in D:\inetpub\webs\www.miodominio.it\mia.php on line 12

    Warning: include(http://www.miodominio.it\mia.php) [function.include]: failed to open stream: no suitable wrapper could be found in D:\inetpub\webs\www.miodominio.it\paginascript.php on line 12

    Warning: include() [function.include]: Failed opening 'http://www.www.miodominio.it\mia.php for inclusion (include_path='.;c:\php\includes') in D:\inetpub\webs\www.miodominio.it\paginascript.php on line 12

    quale può essere l'errore???

  4. #4
    Nel percorso devi usare il path assoluto non l'host del sito prova:
    D:\inetpub\webs\miodominio\mia.php
    Coltiva Linux, Windows si pianta da solo!

  5. #5
    A parte i problemi sui percorsi, con php non si possono fare operazioni matematiche con le date (date/orari intesi come 08/10/2009, 13:41:99 o entrambi)

    Per verificare se è stao superato un dato orario va usato time ed mktime con qualcosa del genere

    codice:
    // Acquisisco l'orario attuale
    $now = time();
    
    // Confronto gli orari
    if ($now >= /* quindi è maggiore o uguale */ mktime(23, 0, 0, date('m', $now), date('d', $now), date('Y', $now))
    {
    // banner
    }
    else
    {
    // no banner
    }
    Un'altro modo altenativo per farlo era

    codice:
    // Acquisisco l'orario e la data attuale
    $now = time();
    
    // Detraggo l'inizio della giornata dall'orario attuale
    $timeFromToday = $now - mktime(0, 0, 0, date('m', $now), date('d', $now), date('Y', $now));
    
    // Confronto
    if ($timeFromToday >= 11 * 3600 /* ovvero 11 * 60 minuti * 60 secondi)
    {
    // banner
    }
    else
    {
    // no banner
    }
    Un modo ancora più efficente di scriverlo è usando il modulo, ovvero se una giornata dura SEMPRE tot secondi posso fare il modulo dell'orario corrente per ottenere il numero di secondi trascorso dall'inizio della giornata quindi

    codice:
    // Effettuo l'operazione ed il confronto
    if ((time() % (24 * 60 * 60 /* una giornata è composta da 24 ore per 60 minuti per 60 secondi */ )) >= 11 * 3600)
    {
    // banner
    }
    else
    {
    // no banner
    }
    In realtà ci sono dei metodi/classi per fare delle operazioni tra date ma, personalmente, preferisco evitarli non tanto perché potrebbero essere esosi di risorse ma perché poco flessibili ... poco flessibile per poco flessibile preferisco usare l'ultima versione del codice che ho postato per ottenere il massimo delle performance.

    E' vero che la funzione mktime fa una semplice operazione matematica per restituire lo unix timestamp ma è anche vero che se il sito ha MOLTI visitatori questa micro ottimizzazione può fare risparmiare risorse preziose al server.

    Inoltre mentre richiamare una data funzione comporta al processore tutta una serie di operazioni effettuare il modulo ne comporta MOLTE di meno
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    Vero, pero' puoi fare controlli lessicografici con i formati unix.

    2009-12-14 12:34:45
    2009-12-14 12:34:46

    etc...
    Il controllo lessicografico su questo tipo di stringhe funziona perfettamente (anche se ovviamente leggermente meno performate di quello numerico con le tiemestamps).

    Inoltre il problema dell'iclude riguarda il fatto che il tuo server ha disabilitato il remote linking (il che vuol dire sicurezza).
    Se vuoi accedere a pagina web nel tuo server devi usare il percorso relativo/assoluto del file

    se i file sono sulla stessa dir :
    include("./miofile.php")

    se sono in una sottodirectory chiamata test
    include("./test/miofile.php")

    sel la dir e' un livello sopra
    include("../miofile.php")

    Navigando cosi' i percorsi per accedere correttamente il file bersaglio.

  7. #7

    grazie mille!!

    Grazie mille! Grazie mille funziona perfettamente!!!
    se volessi gestire a tempo più banner?
    esempio:

    dalle 10 alle 12 il banner1
    dalle 12 alle 14 il banner2
    ..................................ecc

    come si può fare?

  8. #8
    Utente di HTML.it L'avatar di Virus_101
    Registrato dal
    Sep 2008
    Messaggi
    2,497
    in questo caso devi configurare da qlke parte i banner

    esempio su un array

    Codice PHP:

    $banner_default 
    = array(
    "path"=>"miofile.php" ,
    "time_start" =>"" ,
    "time_end" => ""
    ) ;

    $banners =array();

    $banners["banner_1"] = array(
    "path"=>"miofile.php" ,
    "time_start" =>"10:00" ,
    "time_end" => "11:59"
    );

    $banners["banner_2"] = array(
    "path"=>"miofile.php" ,
    "time_start" =>"12:00" ,
    "time_end" => "12:59"
    ) ;


    // OVVIAMENTE : dovrai gestire te mano i tempi e stare attento a non farli cozzare.

    $time date("H:i:s",time() ) ;
    $found =false;
    foreach( 
    $banners as $n=>$v )
    {
          if(  
    $v[time_start]>= $time && $v[time_end]<= $time  )  
          {
                
    $found $v ;
                break;
          }
    }

    if( !
    $found )
          
    $found $banner_default ;

    include( 
    $found[path] ); 

    Ovviamente questa e' un possibile soluzione come tante altre.

  9. #9

    non funziona...

    purtroppo non funziona...si visualizza sempre lo stesso banner cioè il primo (quello default)


  10. #10
    @virus_1010

    C'è un piccolo errore nel codice che hai postato

    Scrivere

    Codice PHP:
    $v[time_start
    è sbagliato, time_start cosi (come time_end) sono delle costanti per la sintassi (poi php se non trova corrispondenza tra la tabella delle costanti registrate da un notice e prova a trasformarla in stringa) e si dovrebbe scrivere cosi

    Codice PHP:
    $v['time_start'
    o

    Codice PHP:
    $v["time_start"
    Detto questo, non è conveniente gestire i confronti per come dici tu, ed anche per un motivo banale: nel codice che hai postato utilizzi date. Date deve richiedere al sistema operativo di dargli la data per poi convertirla come stringa (nota: la data al sistema operativo viene richiesta sotto forma di unix timestamp).

    E' come se hai il macellaio sotto casa e uno si fa 10 km per andare al supermercato dove ci sta la macelleria ... che fornisce le stesse cose fornite dalla macelleria sotto casa con la stessa qualità senza avere la necessità di acquistare altro ... per sfizio praticamente.

    Detto questo ... guarda le differenze di performance

    Codice PHP:
    <?php

    $begin 
    microtime(true);

    for(
    $index 0$index <= 10000$index++)
    {
        
    $startTime '23:00:00';
        
    $currentTime date('H:i:s');
        
    $res $startTime >= $currentTime;
    }

    printf('%0.6f'microtime(true) - $begin);
    echo 
    '
    '
    ;

    $begin microtime(true);

    for(
    $index 0$index <= 10000$index++)
    {
        
    $res = (time() % (24 60 60)) >= (23 60 60);
    }

    printf('%0.6f'microtime(true) - $begin);

    ?>
    Sulla mia macchina (ovviamente su altre macchine cambieranno i valori ma il rapporto tra questi sarà simile) i valori restituiti sono:
    codice:
    0.114025
    0.004278
    Se togli date e la data la scrivi a mano la differenza diventa praticamente nulla (in teoria ci sarebbe una considerevole differenza perché il processore dovrebbe fare molte più operazioni però nella pratica i processori moderni possono eseguire operazioni su stringhe con una certa velocità perché sono funzionalità previste e gestite tramite appositi componenti del processore)

    Ora, vero è che non avrai mai 10000 richieste fatte a ripetizione, ma è anche vero che quest'operazione che fai li e magari, per altre cose, in altri sul conteggio finale delle performance. Non usare il date ed il confronto tra stringhe ed usare invece un confronto utilizzando un modulo e lo unix timestamp (ergo time, che si limita a richiedere lo unix timestamp e passarlo al tuo codice) rende (secondo me) più leggibile il codice e nel contempo lo rende non poco più performante.

    Comunque, qui c'è un esempio di codice funzionante per come dici tu (giusto per completezza)
    Codice PHP:
    <?php

    $startTime 
    '23:00:00';
    $currentTime date('H:i:s'mktime(225959date('m'), date('d'), date('Y')));

    echo 
    "Confronto #1 tra {$currentTime} &gt;= {$startTime} 
    "
    ;
    var_dump($currentTime >= $startTime);

    echo 
    "

    "
    ;

    $currentTime date('H:i:s'mktime(2300date('m'), date('d'), date('Y')));
    echo 
    "Confronto #2 tra {$currentTime} &gt;= {$startTime} 
    "
    ;
    var_dump($currentTime >= $startTime);

    echo 
    "

    "
    ;

    $currentTime date('H:i:s'mktime(001date('m'), date('d'), date('Y')));
    echo 
    "Confronto #3 tra {$currentTime} &gt;= {$startTime} 
    "
    ;
    var_dump($currentTime >= $startTime);

    ?>
    Ho scritto più volte il confronto per far vedere le varie casistiche.
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

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 © 2025 vBulletin Solutions, Inc. All rights reserved.