Zwischenraum zwischen 2 Stunden ausrechnen

Sn4ke16

Mitglied
Hi liebe Community.

Zurzeit arbeite ich an einer Webradio Page, und im Moment am Sendeplan. Dieser läuft auch bisher einwandfrei, allerdings gibts noch eine kleine Sache bei der ich nicht ganz weiter komm, ich hoffe ihr könnt mir da helfen.

Aaaalsooo..

Im Sendeplan steht zum Beispiel eine Show von 02-05 Uhr also Start-Ende. Und wenn sich nun jemand eine weitere Show einträgt, möchte ich eine Abfrage starten ob die angegebene Zeit im Zeitraum der bereits eingetragenene Shows liegt.

Beispiel:

Show im Sendeplan = 02-05 Uhr
Show eintrag = 03-06 Uhr

Start und End Zeit beider Shows sind natürlich verschieden, aber dazwischen liegen 2 Stunden an denen gleichzeitig gesendet werden würde, und solche Einträge möchte ich vermeiden. Das heißt ich muss irgendwie ausrechnen ob die Show die eingetragen werden soll im Zeitraum der anderen Shows liegt.

In der MySQL Tabelle, sind 2 Spalten (Start & Ende) für die Zeit gesetz. Diese können über ein weiteres Formular über eine <select> Auswahl gewählt werden. Das ganze geht in Stündlichen Schritten. Die Uhrzeiten sind einfach Zahlen, keine richtigen Uhrzeiten, somit wird eine Start- und Endzeit festgelegt, und den Zwischenraum müsste ich da irgendwie errechnen.

Ich hoffe ihr versteht mein Problem, und könnt mir da helfen *hope*
Naja schönen Samstag ;)
LG Sn4ke
 
Zuletzt bearbeitet:
Hallo!

Ich bin mir jetzt nicht sicher was passiert wenn sich der Sendetag überschneidet (z.B. bei einer Sendezeit von 23 bis 01 Uhr), aber ansonsten sollte es funktionieren:
PHP:
<?php
// Daten aus dem Formular
$sendezeit_start = 03;
$sendezeit_ende  = 06;
$sendetag        = "21.02.2009";
 
// Datenbankdaten
$db_host  = "localhost";
$db_admin = "*****";
$db_pass  = "*****";
$database = "*****";
$table    = "*****";
 
$link = mysql_connect($db_host, $db_admin, $db_pass) OR die(mysql_error());
mysql_select_db($database, $link) OR die(mysql_error());
$result = mysql_query("SELECT * FROM `".$table."` WHERE `sendetag`='".$sendetag."';", $link) OR die(mysql_error());
$row = mysql_fetch_array($result);
 
for($i = $sendezeit_start; $i <= $sendezeit_ende; $i++) {
    if($i >= $row['startzeit'] AND $i <= $row['endzeit']) {
        $error[] = $i;
    }
}
 
if(isset($error)) {
    echo "Die Sendezeit ist schon belegt!";
} else {
    echo "Neue Sendezeit wird hinzugefügt..... mysql_query(INSERT INTO..... )";
}
 
mysql_close($link);
?>
Gruss Dr Dau
 
Es sollte relative einfach sein, wenn du über die zwei Spalten ein UNIQUE legst. Dann kannst du beim INSERT den Fehler einfach abfangen und gut ist.

Edit: Vergiss, was ich geschrieben habe, ich hab dein Problem falsch interpretiert.
 
Zuletzt bearbeitet:
Vielen Dank für die Hilfe, das Script von dir Dr. Dau funktioniert soweit. Allerdings gibts noch einen Fehler.

Und zwar wenn die Startzeit der nächsten Show die gleiche Endzeit wie die vorrige hat.

Beispiel:

Eingetragene Show = 02-05 Uhr
Show Eintrag = 05-07 Uhr

Dann wird der Error ausgeführt. Wenn die Startzeit ne Stunde später ist dann gehts, aber wenn die gleich mit der Endzeit ist, dann gehts nicht.

EDIT: Nach dem Sendeplan hab ich noch ein Problem mit nem anderen Script. Das sich an sich auch auf den Sendeplan bezieht. Und zwar versuch ich eine Anzeige umzusetzen wer gerade auf dem Stream ist. Der einfachste Weg wäre natürlich mit der Shoutcast.class aber das ist mir zu doof, deswegen will ich die Anzeige mit dem Sendeplan verbinden. Sprich der DJ der zur jetzigen Stunde ($date[hours]) im Sendeplan steht soll angezeigt werden. Also muss ich da auch wieder den zwischenraum ausrechnen ^^ Die Idee ist an sich ganz einfach, ich bin aber scheinbar irgendwie zu doof das ganze zu realisieren ^^

Also, wenn die jetzige Stunde ($date[hours]) zwischen der Sendung 10-14 Uhr (Start-Ende) liegt, soll die Show ausgegeben werden, ansonsten die Playlist (sofern garkeiner im Plan um die Zeit steht)
 
Zuletzt bearbeitet:
Ich bin mir jetzt nicht sicher was passiert wenn sich der Sendetag überschneidet (z.B. bei einer Sendezeit von 23 bis 01 Uhr), aber ansonsten sollte es funktionieren:
Zwei Anmerkungen hierzu:
  • Es wird nur eine Sendung aus der Datenbank geholt, es sollten aber alle getestet werden (für den jeweiligen Tag).
  • Die Schleife ist nicht unbedingt nötig und könnte durch eine einzige if-Abfrage ersetzt werden:
PHP:
if (($sendezeit_start <= $row['startzeit'] && $sendezeit_ende > $row['startzeit']) ||
    ($sendezeit_start <  $row['endzeit']   && $sendezeit_ende > $row['endzeit']) ...
Sendungen, die über die Tagesgrenze hinweg gehen, werden dadurch allerdings auch noch nicht berücksichtigt.

Am elegantesten wäre es dann natürlich, diesen Test direkt in die Datenbankabfrage zu integrieren. Damit erhält man dann alle Sendungen, die sich mit der neu einzutragenden überschneiden.

Grüße, Matthias
 
Es wird nur eine Sendung aus der Datenbank geholt, es sollten aber alle getestet werden (für den jeweiligen Tag).
Stimmt, daran habe ich nicht gedacht. :(
Am elegantesten wäre es dann natürlich, diesen Test direkt in die Datenbankabfrage zu integrieren. Damit erhält man dann alle Sendungen, die sich mit der neu einzutragenden überschneiden.
Hast Du auch ein Beispiel?
Ich stehe da nämlich im Moment etwas auf dem Schlauch.

@Sn4ke16, ich bin davon ausgegangen dass die Endzeit den Beginn der letzten Sendestunde darstellt. ;)
Du musst also die erste if()-Abfrage anpassen:
PHP:
if($i >= $row['startzeit'] AND $i <= ($row['endzeit']-1)) {
    $error[] = $i;
}
Zeige uns doch mal Dein Formular und die Datenbankstruktur.
 
Okay hier der Code des Sendeplans. Sieht allerdings etwas spartanisch aus, und manche Sachen hätten mitsicherheit auch anders gelöst werden können, aber so hab ichs mir beigebracht xD

Sheduler.php
PHP:
<?php

$date = getdate();
$sql = "SELECT * FROM sendeplan WHERE (tag = '".$date[weekday]."')";
$query = mysql_query($sql, $con);
$check = mysql_fetch_array($query);
if ($check['ende'] = $date[hours]) {
	$sql = "DELETE FROM sendeplan WHERE (ende = '".$date[hours]."')";
	$query = mysql_query($sql, $con);
}
echo '<a href="?content=sheduler&action=showname&date=monday">Montag</a> | ';
echo '<a href="?content=sheduler&action=showname&date=tuesday">Dienstag</a> | ';
echo '<a href="?content=sheduler&action=showname&date=wednesday">Mittwoch</a> | ';
echo '<a href="?content=sheduler&action=showname&date=thursday">Donnerstag</a> | ';
echo '<a href="?content=sheduler&action=showname&date=friday">Freitag</a> | ';
echo '<a href="?content=sheduler&action=showname&date=saturday">Samstag</a> | ';
echo '<a href="?content=sheduler&action=showname&date=sunday">Sonntag</a>';
echo '<br>';
echo '<br>';
if (logged_in() && admin()) {
	echo '<a href="?content=sheduler&action=new">Show Eintragen</a>';
	echo '<br>';
	echo '<br>';
}
echo '<b>'.$datum.'</b><br>';
echo '<br>';
if (isset($_POST['submit'])) {
	$sql = "SELECT * FROM sendeplan WHERE (tag = '".$_POST['tag']."')";
	$query = mysql_query($sql, $con);
	$check = mysql_fetch_array($query);
	for($i = $_POST['beginn']; $i <= $_POST['ende']; $i++) {
    	if($i >= $check['beginn'] AND $i <= $check['ende']-1) {
        	$error[] = $i;
    	}
	}
 	if (isset($error)) {
		echo 'Es existiert bereits eine Show um diese Zeit!<br><br>';
	} else {
		$description = parse2html($_POST['nachricht']);
		$sql = "INSERT INTO sendeplan (tag, beginn, ende, dj, showname, style, description) VALUES ('".$_POST['tag']."', '".$_POST['beginn']."', '".$_POST['ende']."', '".$name."', '".$_POST['showname']."', '".$_POST['style']."', '".$description."')";
		$query = mysql_query($sql, $con);
		echo 'Show eingetragen!';
		echo '<br>';
		echo '<br>';
	}
}
if (isset($_GET['action']) && isset($_GET['date'])) {
	$sql = "SELECT * FROM sendeplan WHERE (tag = '".$_GET['date']."')";
	$query = mysql_query($sql, $con);
	$check = mysql_fetch_array($query);
	if ($check['id'] > 0) {
		$sql = "SELECT * FROM sendeplan WHERE (tag = '".$_GET['date']."') ORDER BY beginn";
		$query = mysql_query($sql, $con);
		while ($row = mysql_fetch_array($query)) {
			echo '<table width="100%">';
			echo '<tr>';
			echo '<td class="content" width="125"><b>'.$row['beginn'].':00</b> - <b>'.$row['ende'].':00</b></td>';
			echo '<td class="content" align="right"><b>'.$row['dj'].'</b></td>';
			echo '</tr>';
			echo '<tr>';
			echo '<td class="content"</td>';
			echo '<td class="news_author"><b>'.$row['showname'].'</b><br>Musikstyle: '.$row['style'].'<br><br>'.$row['description'].'<br><br>';
			echo '</td>';
			echo '</tr>'; 
			echo '</table>';
		}
	} else {
		echo 'Keine Sendeungen an diesem Tag!';
	}
} elseif (isset($_GET['action']) && $_GET['action'] == 'new') {
	echo '<table width="100%">';
	echo '<form action="?content=sheduler" method="post" name="form">';
	echo '<tr>';
	echo '<td class="content">DJ </td>';
	echo '<td class="content"><b>'.$name.'</b></td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td class="content">Show </td>';
	echo '<td class="content"><input type="text" name="showname"></td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td class="content">Musikstyle </td>';
	echo '<td class="content"><input type="text" name="style"></td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td class="content">Tag </td>';
	echo '<td class="content">
	<select name="tag">
	<option value="Monday">Montag</option>
	<option value="Tuesday">Dienstag</option>
	<option value="Wednesday">Mittwoch</option>
	<option value="Thursday">Donnerstag</option>
	<option value="Friday">Freitag</option>
	<option value="Saturday">Samstag</option>
	<option value="Sunday">Sonntag</option>
	</select></td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td class="content">Zeit </td>';
	echo '<td class="content">
	von <select name="beginn">
	<option value="0">00</option>
	<option value="1">01</option>
	<option value="2">02</option>
	<option value="3">03</option>
	<option value="4">04</option>
	<option value="5">05</option>
	<option value="6">06</option>
	<option value="7">07</option>
	<option value="8">08</option>
	<option value="9">09</option>
	<option value="10">10</option>
	<option value="11">11</option>
	<option value="12">12</option>
	<option value="13">13</option>
	<option value="14">14</option>
	<option value="15">15</option>
	<option value="16">16</option>
	<option value="17">17</option>
	<option value="18">18</option>
	<option value="19">19</option>
	<option value="20">20</option>
	<option value="21">21</option>
	<option value="22">22</option>
	<option value="23">23</option>
	<option value="00">00</option>
	</select>
	 bis <select name="ende">
	<option value="0">00</option>
	<option value="1">01</option>
	<option value="2">02</option>
	<option value="3">03</option>
	<option value="4">04</option>
	<option value="5">05</option>
	<option value="6">06</option>
	<option value="7">07</option>
	<option value="8">08</option>
	<option value="9">09</option>
	<option value="10">10</option>
	<option value="11">11</option>
	<option value="12">12</option>
	<option value="13">13</option>
	<option value="14">14</option>
	<option value="15">15</option>
	<option value="16">16</option>
	<option value="17">17</option>
	<option value="18">18</option>
	<option value="19">19</option>
	<option value="20">20</option>
	<option value="21">21</option>
	<option value="22">22</option>
	<option value="23">23</option>
	<option value="00">00</option>
	</select> Uhr</td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td class="content" align="center" colspan="2">Beschreibung</td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td colspan="2">';
	include 'includes/bbcode.php';
	echo '</td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td colspan="2"><textarea name="nachricht"></textarea></td>';
	echo '</tr>';
	echo '<tr>';
	echo '<td class="button" colspan="2" align="center"><input type="submit" name="submit" value="Abschicken" onmouseover="this.style.color=\'#007eff\'" onmouseout="this.style.color=\'#fff\'"></td>';
	echo '</tr>';
	echo '</form>';
	echo '</table>';
} else {
	$sql = "SELECT * FROM sendeplan";
	$query = mysql_query($sql, $con);
	$check = mysql_fetch_array($query);
	if ($check['id'] > 0) {
		$sql = "SELECT * FROM sendeplan WHERE (tag = '".$date[weekday]."') ORDER BY beginn";
		$query = mysql_query($sql, $con);
		while ($row = mysql_fetch_array($query)) {
			echo '<table width="100%">';
			echo '<tr>';
			echo '<td class="content" width="125"><b>'.$row['beginn'].':00</b> - <b>'.$row['ende'].':00</b></td>';
			echo '<td class="content" align="right"><b>'.$row['dj'].'</b></td>';
			echo '</tr>';
			echo '<tr>';
			echo '<td class="content"</td>';
			echo '<td class="news_author"><b>'.$row['showname'].'</b><br>Musikstyle: '.$row['style'].'<br><br>'.$row['description'].'<br><br>';
			echo '</td>';
			echo '</tr>'; 
			echo '</table>';
		}
	} else {
		echo 'Keine Sendeungen Heute!';
	}
}

?>

Zur sicherheit hier noch ein paar ausschnitte aus der Config.php

PHP:
// Admin-Check
function admin()
{
	$sql = "SELECT id FROM user_user WHERE session='".session_id()."' LIMIT 1";
	$query = mysql_query($sql);
	$data = mysql_fetch_array($query);
	$sql = "SELECT * FROM user_ref_team WHERE user = '".$data['id']."'";
	$query = mysql_query($sql);
	while ($check = mysql_fetch_array($query)) {
		$team = $check['team'];
		if ($team == '4' || $team == '5') {
			return true;
		}
	}
}

// BBcode & Sonderzeichen
function parse2html($bb)
{
    $bb = preg_replace('/\[B\](.*?)\[\/B\]/', '<b>$1</b>', $bb);
    $bb = preg_replace('/\[I\](.*?)\[\/I\]/', '<i>$1</i>', $bb);
	$bb = preg_replace('/\[U\](.*?)\[\/U\]/', '<u>$1</u>', $bb);
	$bb = preg_replace('/\[IMG\](.*?)\[\/IMG\]/', '<img src="$1">', $bb);
	$bb = preg_replace('/\[URL\](.*?)\[\/URL\]/', '<a href="$1">$1</a>', $bb);
    $bb = preg_replace('/\[COLOR=([[:alnum:]]{6}?).*\](.*?)\[\/COLOR\]/', '<font color="#$1">$2</font>', $bb);
    $bb = preg_replace('/\[URL=([^ ]+).*\](.*)\[\/URL\]/', '<a href="$1">$2</a>', $bb);
	$bb = preg_replace('/\[b\](.*?)\[\/b\]/', '<b>$1</b>', $bb);
    $bb = preg_replace('/\[i\](.*?)\[\/i\]/', '<i>$1</i>', $bb);
	$bb = preg_replace('/\[u\](.*?)\[\/u\]/', '<u>$1</u>', $bb);
	$bb = preg_replace('/\[img\](.*?)\[\/img\]/', '<img src="$1">', $bb);
	$bb = preg_replace('/\[url\](.*?)\[\/url\]/', '<a href="$1">$1</a>', $bb);
    $bb = preg_replace('/\[color=([[:alnum:]]{6}?).*\](.*?)\[\/color\]/', '<font color="#$1">$2</font>', $bb);
    $bb = preg_replace('/\[url=([^ ]+).*\](.*)\[\/url\]/', '<a href="$1">$2</a>', $bb);
	$bb = preg_replace('/&(.*?)/', '&amp;', $bb);
	$bb = preg_replace('/ä(.*?)/', '&auml;', $bb);
	$bb = preg_replace('/Ä(.*?)/', '&Auml;', $bb);
	$bb = preg_replace('/ö(.*?)/', '&ouml;', $bb);
	$bb = preg_replace('/Ö(.*?)/', '&Ouml;', $bb);
	$bb = preg_replace('/ü(.*?)/', '&uuml;', $bb);
	$bb = preg_replace('/Ü(.*?)/', '&Uuml;', $bb);
	$bb = preg_replace('/ß(.*?)/', '&szlig;', $bb);
    $bb = preg_replace('/\n/', "<br/>\n", $bb);

    return $bb;

}

// Datum-Check
	$datum = getdate();
	if ($datum[weekday] == 'Monday') {
		$datum = 'Montag';
	} elseif ($datum[weekday] == 'Tuesday') {
		$datum = 'Dienstag';
	} elseif ($datum[weekday] == 'Wednesday') {
		$datum = 'Mittwoch';
	} elseif ($datum[weekday] == 'Thursday') {
		$datum = 'Donnerstag';
	} elseif ($datum[weekday] == 'Friday') {
		$datum = 'Freitag';
	} elseif ($datum[weekday] == 'Saturday') {
		$datum = 'Samstag';
	} elseif ($datum[weekday] == 'Sunday') {
		$datum = 'Sonntag';
	} 
	
	if ($_GET['date'] == 'monday') {
		$datum = 'Montag';
	} elseif ($_GET['date'] == 'tuesday') {
		$datum = 'Dienstag';
	} elseif ($_GET['date'] == 'wednesday') {
		$datum = 'Mittwoch';
	} elseif ($_GET['date'] == 'thursday') {
		$datum = 'Donnerstag';
	} elseif ($_GET['date'] == 'friday') {
		$datum = 'Freitag';
	} elseif ($_GET['date'] == 'saturday') {
		$datum = 'Samstag';
	} elseif ($_GET['date'] == 'sunday') {
		$datum = 'Sonntag';
	}

PS: Ich hab keine Ahnung was ich falsch mache, aber da ist nun weiterhin ein blöder Fehler dabei. Und zwar lässt sich die Sendung trozdem eintragen, auch wenn sie eine dabei überschneidet.

EDIT: Der Sendeplan wird über Wochentage gesteuert, nicht mit Datum ^^ Evtl. liegts daran keine Ahnung xD Vllt. sollte ich das ganze doch mal mit Datum versuchen *grübel*
EDIT2: Hier noch ein paar Screenshots der ganzen Sachen ^^
Sendeplan_DB
Sendeplan_Form
Sendeplan_Shows
 
Zuletzt bearbeitet:
PS: Ich hab keine Ahnung was ich falsch mache, aber da ist nun weiterhin ein blöder Fehler dabei. Und zwar lässt sich die Sendung trozdem eintragen, auch wenn sie eine dabei überschneidet.

EDIT: Der Sendeplan wird über Wochentage gesteuert, nicht mit Datum ^^ Evtl. liegts daran keine Ahnung xD
Ist sehr gut möglich, denn ich vermute dass abgelaufene Sendungen nicht aus der DB gelöscht werden.
Vllt. sollte ich das ganze doch mal mit Datum versuchen *grübel*
Ein Datum wäre eindeutiger als wie ein Wochentag. ;)
Möglicherweise wäre aber auch ein Timestamp denkbar?! *Schultern zuck*
 
Zurück