Autor Zpráva
nyllo
Profil
Dobrý den..

dělám si časový program.



SQL

<database name="d37609_prog">
        <!-- Tabulka progplan -->
        <table name="progplan">
            <column name="time">06:00:00</column>
            <column name="name">Ranní rozjezd</column>
            <column name="id">1</column>
        </table>
        <table name="progplan">
            <column name="time">18:00:00</column>
            <column name="name">Noční playlist</column>
            <column name="id">2</column>
        </table>
        <table name="progplan">
            <column name="time">10:00:00</column>
            <column name="name">Dopolední show</column>
            <column name="id">3</column>
        </table>
        <table name="progplan">
            <column name="time">14:00:00</column>
            <column name="name">Odpolední mix</column>
            <column name="id">4</column>
        </table>
        <table name="progplan">
            <column name="time">00:00:00</column>
            <column name="name">After party</column>
            <column name="id">5</column>
        </table>
    </database>

PHP

 <?php
             
echo 'Právě na programu:';
 
include 'config.php'; 
            mysql_connect($dbserver, $dblogin, $dbheslo); 
            mysql_select_db($dbnazev);  
            mysql_query("SET NAMES 'UTF-8'");     
 

//******************* nastavení navigace a výběr dat z databáze ******************
$start = $_GET['start'];
if(!$start)
    $start=0; 
    $prispevku = "1"; // počet příspěvků které se vypíší na stránku
    $datum = Date("H:i:s", Time());
    echo($datum);
    $query = "SELECT * FROM `progplan` where `time` <= '".$datum."' order by `time` asc limit ".$start.", ".$prispevku;
$vypis =  mysql_query($query);
if (FALSE === $vypis) {//nastala chyba, vypis ju (na ostrom webe radsej zaloguj)
    echo mysql_errno() . ": " . mysql_error();
}
 
//********************************* výpis článků *********************************
if (mysql_num_rows($vypis) === 0) {
    echo '<p>Na dnes nejsou žádné události.</p>';
} else {
    while($row = mysql_fetch_array($vypis))
    {
        echo '<div class="prog">'.$row["time"].''.$row["name"].'</div>';
    }
};
                             
                
mysql_close(); 
?>


PHP sic vypisuje a však buď první nebo poslední položku v SQL.
juriad
Profil
Za předpokladu, že chceš zobrazit následujících události, tak je vhodnější chtít počítat celých 24 hodin, protože po 18. hodině neexistuje už žádná události. Navíc událost v 0 hodin by se zobrazila jen první sekundu po půlnoci.

$sql  = "SELECT * FROM progplan ORDER BY time >= '".$datum."' DESC, time ASC LIMIT ".$start.", ".$prispevku;
První podmínka řazení říká, že chceš takové události, pro které platí, že nastávají později než je aktuální čas (tedy jsou to události, které budou ještě dnes). Pokud je nerovnost splněná, tak má hodnotu 1, pokud není splněná (událost je až zítra), tak má hodnotu 0; proto řazení sestupně.
Druhá podmínka seřadí události správně podle času.


MariaDB [pokus]> SELECT * FROM udalosti ORDER BY cas >= CURTIME() DESC, cas ASC;
+----------+-------------+----+
| cas      | name        | id |
+----------+-------------+----+
| 18:00:00 | vecere      |  2 |
| 00:00:00 | after party |  5 |
| 06:00:00 | rozcvicka   |  1 |
| 10:00:00 | dopoledne   |  3 |
| 14:00:00 | odpoledne   |  4 |
+----------+-------------+----+
nyllo
Profil
pokud jsem to pochopil dobře musím nadefinovat událost ještě v 23:59:59 a poté tu samou v 00:00:00 to pokryje celý den.


tento řádek
    $query = "SELECT * FROM `progplan` where `time` <= '".$datum."' order by `time` asc limit ".$start.", ".$prispevku;

nahradím tímto

    $query = "SELECT * FROM progplan ORDER BY `time` >= '".$datum."' DESC, time ASC LIMIT ".$start.", ".$prispevku;

SQL upravím takto

<!--
    - Databáze: 'd37609_prog'
    -->
    <database name="d37609_prog">
        <!-- Tabulka progplan -->
        <table name="progplan">
            <column name="time">00:00:00</column>
            <column name="name">After party</column>
            <column name="id">0</column>
        </table>
        <table name="progplan">
            <column name="time">06:00:00</column>
            <column name="name">Ranní rozjezd</column>
            <column name="id">1</column>
        </table>
        <table name="progplan">
            <column name="time">10:00:00</column>
            <column name="name">Dopolední show</column>
            <column name="id">2</column>
        </table>
        <table name="progplan">
            <column name="time">14:00:00</column>
            <column name="name">Odpolední mix</column>
            <column name="id">3</column>
        </table>
        <table name="progplan">
            <column name="time">18:00:00</column>
            <column name="name">Noční playlist</column>
            <column name="id">4</column>
        </table>
        <table name="progplan">
            <column name="time">23:59:59</column>
            <column name="name">After party</column>
            <column name="id">5</column>
        </table>
    </database>
juriad
Profil
nyllo:
Nemusíš, speciální událost není třeba, stačí, když použiješ můj dotaz. Otestoval jsem jej a jak je vidět na výsledku, tak funguje.
V podstatě jen seřadí všechny události podle času, přičemž přednost dává těm, které nastanou do konce dne.
nyllo
Profil
toto je celé php výsledek je Noční playlist - a měl by být Odpolední mix

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Web API</title>

<!-- zečátek meta -->

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- konec meta -->

<link rel="stylesheet" href="style.css" media="screen">

<!-- začátek skriptů -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.0/jquery.min.js"></script>


<!-- konec skriptů -->                

</head>

<body>

<!-- začátek tabulky -->
    <div class="panel">
        <div class="singl">
            <?php
            $xml = @simplexml_load_file("http://api.spaceradio.cz/new/new.php");
            if($xml){
            echo '<div class="panel">';
            foreach ($xml->track as $value){
            echo '<div class="player-image">';
            print "<img src=".$value->cover." http://play.spaceradio.cz/img/spacer.png class=\"image\">";
            echo '</div>';
            echo '<div class="player-song" >';
            print "<div class=\"artists\">".$value->artists."</div>";
            print "<div class=\"title\">".$value->title."</div>";
            echo '</div>';
                }
            echo '</div>';
                }
            else{
            echo 'Error with the call_api.php!';
                }
            ?>
        </div>
        <div class="panel2">

<!-- začátek programu -->
            <div class="program">
             <?php
             
echo 'Právě na programu:';
 
include 'config.php'; 
            mysql_connect($dbserver, $dblogin, $dbheslo); 
            mysql_select_db($dbnazev);  
            mysql_query("SET NAMES 'UTF-8'");     
 

//******************* nastavení navigace a výběr dat z databáze ******************
$start = $_GET['start'];
if(!$start)
    $start=0; 
    $prispevku = "1"; // počet příspěvků které se vypíší na stránku
    $datum = Date("H:i:s", Time());
    $query = "SELECT * FROM progplan ORDER BY time >= '".$datum."' DESC, time ASC LIMIT ".$start.", ".$prispevku;
$vypis =  mysql_query($query);
if (FALSE === $vypis) {//nastala chyba, vypis ju (na ostrom webe radsej zaloguj)
    echo mysql_errno() . ": " . mysql_error();
}
 
//********************************* výpis článků *********************************
if (mysql_num_rows($vypis) === 0) {
    echo '<p>Na dnes nejsou žádné události.</p>';
} else {
    while($row = mysql_fetch_array($vypis))
    {
        echo '<div class="prog">'.$row["name"].'</div>';
    }
};
                             
                
mysql_close(); 
?>



<!-- konec programu -->

            </div>
        </div>
    </div>
<!-- konec tabulky -->

</body>
</html>
juriad
Profil
U mě ve střední Evropě je právě 15:40, tedy následující událost začíná až v 18:00.
Pokud chceš zobrazit napřed aktuálně probíhající událost (tedy například After party se bude zobrazovat až do 6:00), tak je třeba použít jiný SQL dotaz.
nyllo
Profil
query vypisuje toto

SELECT * FROM progplan ORDER BY time >= '15:38:54' DESC, time ASC LIMIT 0, 1

nemělo by být ASC LIMIT 0, 100


dle plánu v SQL by to mělo ukazovat Odpolední mix který běží od 14:00:00
juriad
Profil
nyllo:
Tím bys vynutil zobrazení prvních 100 událostí; jelikož jich 100 neexistuje, zobrazily by se všechny. Limit ovlivňuje jen počet nikdy ne pořadí.

Myslím, že máme spíše problém s tím, že jsi zatím neposal dostatečně svůj program. Například, která událost se má zobrazit v 15:00?
1) Ta, která začala bezprestředně před 15:00, tedy v tvém příkladu je to událost v 14:00. Má význam předchozí či probíhající události.
2) Ta, která začne bezprostředně po 15:00, tedy v tvém případě je to událost v 18:00. Má význam následující události.


Aha, tedy první předcházející akci.
nyllo
Profil
Abych to tedy dostatečně vysvětlil.

v SQL jsem definoval co a v kolik hodin začíná.


+----------+-------------+----+
| cas      | name        | id |
+----------+-------------+----+
| 00:00:00 | after party |  0 |
| 06:00:00 | rozcvicka   |  1 |
| 10:00:00 | dopoledne   |  2 |
| 14:00:00 | odpoledne   |  3 |
| 18:00:00 | vecere      |  4 |

+----------+-------------+----+


Vždy když padne určitá hodina definovaná v SQL začne určitý pořad a php výstup má říci co je nyní na programu.

Např:....
Je 16:00:00 a dle SQL právě běží odpoledne. až do 18:00:00 kdy začne vecer.
juriad
Profil
Konečně se někam dostáváme.
SELECT *
FROM   progplan
ORDER  BY time >= (SELECT time
                   FROM   progplan
                   ORDER  BY time <= CURTIME() DESC,
                             time DESC
                   LIMIT  1) DESC,
          time ASC
LIMIT 0, 1;  

Vnitřní select vypočítává čas předchozí události a vnější zobrazuje všechny události počínaje tím časem.
Zvýrazněné části můžeš upravit. Funkce CURTIME vrací aktuální čas; není ho tedy třeba předávat z PHP.

mm, navrhuji přesunout do kategorie databáze.
nyllo
Profil
jak to tam mám použít?? :O
juriad
Profil
Úplně snadno :) Samozřejmě, že to můžeš smrsknout na jeden řádek, ale pak aby se v tom prase vyznalo.
$query = "SELECT *
FROM   progplan
ORDER  BY time >= (SELECT time
                   FROM   progplan
                   ORDER  BY time <= CURTIME() DESC,
                             time DESC
                   LIMIT  1) DESC,
          time ASC
LIMIT $start, $prispevku";

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: