mysql-Suche nach bestimmten Datum

stega

Erfahrenes Mitglied
Hallo ihr,

ich habe eine kurze Frage. Folgendes Szenario: ich habe eine Datenbank mit ner Menge Einträgen. Die haben alle ein date-Feld, wann sie angelegt wurden. Das Format is 0000-00-00.

Jetzt habe ich ein Formular, das mir einerseits "Jahre" als auch "Monate" anzeigt. Wenn der user jetzt ein Jahr und einen Monat auswählt, dann soll das Script schauen, ob es in der Datenbank mindestens einen Eintrag gibt, der an diesem Tag angelegt wurde.

Sprich:
1) Auswahl: 2009 und Januar
2) Script soll in DB suchen nach einem Eintrag der 2009-01-XYZ
3) Wenn es mindestens einen Eintrag gibt, dann soll er nen Link anzeigen.

Bisher hab ich folgendes gebastelt:

PHP:
// wenn Formular abgesendet ist
if (isset($_REQUEST["senden"])) {
$monat = mysql_real_escape_string($_POST["monat"]);
$year = mysql_real_escape_string($_POST["jahr"]);

$suchdatum = $year."-".$monat;


// jetzt schauen, ob es überhaupt Kurse gibt, die Monat + Jahr enthalten

$query = "SELECT datum FROM ks_tl WHERE monat LIKE %$suchdatum%";
$res = mysql_query($query);

$anz = mysql_num_rows($res);

if ($anz > 0) {
     print "LINK";
}

Leider sucht er mir nie ein Datum raus. Ich weiß, dass es einen Eintrag gibt, aber er findet ihn nicht.

Könnt ihr mir sagen, wie ich die Suchanfrage ändern muss, damit der Tag im Datum variabel sein kann und ich allein mit Jahr und Monat den Eintrag finde?

Vielen Dank für eure Hilfe,

liebe Grüße
stega
 
'n Abend!

Spuckt er denn Fehlermeldungen aus? (Zur Not anschalten...)
Ansonsten vermisse ich eigentlich nur noch die Anführungzeichen:
PHP:
$query = "SELECT datum FROM ks_tl WHERE monat LIKE \"$suchdatum%\"";
Sollte das nicht helfen - welchen Typ hat die Spalte?

Gruß
Enum

Nachtrag:
Vielleicht fehlen auch führende Nullen beim Monat?
Verbinde dich doch mal mit 'nem Clientprogramm für MySQL und teste das Query bis es läuft.
Wenn es dann nach dem Übertrag in PHP noch Probleme gibt, ist es immer ganz hilfreich mal
ein "echo $query" auszuführen...
 
Zuletzt bearbeitet:
Vielleicht funktioniert meine Abfrage besser:
PHP:
$sql = 'SELECT `datum` FROM `ks_t1` WHERE TO_DAYS(`monat`) >= TO_DAYS("'.$year.'-'.$month.'-01") AND TO_DAYS(`monat`) < TO_DAYS(DATE_ADD("'.$year.'-'.$month.'-01" + INTERVAL 1 MONTH))';
 
Das ganze ist jetzt Auf einen monat bezogen, aber wie suche ich nach einem Tag, also beispiel ich suche Heute.
Dann suche ich ja mit $now.
PHP:
$datum = date("Y-m-d");
$now = strtotime($datum);

Wenn ich jetzt falsch liege berichtigt mich bitte.
Bzw. könnte man mir das ganze anhand eines Beispiels erklären?
 
Das ganze ist jetzt Auf einen monat bezogen, aber wie suche ich nach einem Tag, also beispiel ich suche Heute.

Wie liegen die Datumsangaben denn bei Dir vor? Als Timestamp oder String? Du musst doch in jedem Fall einfach nur auf Gleichheit prüfen...

Gruß
Enum


By the way: Warum machen die Leute es sich immer so schwer?
Pure Datumsangaben ohne Zeitzone und Uhrzeit, mit denen man nicht viele Figuckchen anstellen will, speichert man am besten als Integer-Wert im Format "yyyymmdd".
Dann werden auch die Queries leichter - und schneller:
SQL:
SELECT was_auch_immer FROM woher_auch_immer WHERE datum = 20091203;
SELECT dies, und, das FROM dort WHERE datum > 20091200 AND datum < 20100000;
 
Das datum liegt bei mir als Timestamp d m y h:i in der db also 1253829600.
Das ist mal definitiv eine ziemlich merkwürdige Beschreibung von UNIX Timestamps...
Wie auch immer, was hälst Du davon:
SQL:
SELECT irgend_etwas FROM irgendwoher WHERE TO_DAYS(datum) = TO_DAYS($datum);
Natürlich musst Du dabei $datum kompatibel zur MySQL-Funktion TO_DAYS gestalten.
Aber das dürfte mit den Datums- und Zeitfunktionen von PHP nicht allzu schwer sein - egal welches Ausgansformat vorliegt.

Gruß
Enum
 
möööp.

Ok, ich muss meinen letzen Eintrag löschen. Es gab einen kleinen Fehler in der query :) Es musste natürlich heißen
PHP:
$query = "SELECT datum FROM ks_tl WHERE datum LIKE \"$suchdatum%\"";

sobald man hinten WHERE datum setzte, hat er alles gefunden.

Danke für euer Hilfe! :)
 
Zuletzt bearbeitet:
Nach ein paar tagen downzeit da Internet probleme bin ich wieder da.

Ich hab mein Script folgender Maßen zum eintragen geändert. (einige Zietangaben sind zur kontrolle.

PHP:
<script language="JavaScript" src="calendar_us.js"></script>
<link rel="stylesheet" href="calendar.css">
<?php if(!$save_error and $_REQUEST['speichern']){
$show = $_POST["show"];
$start = $_POST["start"];
$end = $_POST["ende"];
$termin = $_POST["termin"];
$dj_id = $umsSystem->user_id;
$dj_name = $umsSystem->nic;
$gast_dj = $_POST['gdj'];

$date1 = "$termin";
list($month, $day, $year) = split('/', $date1);

$date2 = "$start";
list($sh, $sm) = split(':', $date2);
$tsstart = mktime($sh, $sm, 0, $month, $day, $year);

$date3 = "$end";
list($sth, $stm) = split(':', $date3);
$tsstop = mktime($sth, $stm, 0, $month, $day, $year);
echo $tsstart."<br>";
echo $tsstop."<br>";
$sstart = date("Y-m-d H:i:00", $tsstart);
$sstop = date("Y-m-d H:i:00", $tsstop);
echo $sstart;
echo $sstop;
     if($show == "")
{
    die("Fehler: Keine Show Gewählt!");
}
else{
    if($termin == ""){
        die("Fehler: Kein Sendetag Gewählt!");
    }
    else{
        
        
$link = mysql_connect("localhost","phost138395","tibird1982") or die ("Keine Verbindung moeglich");
mysql_select_db("phost138395") or die ("Die Datenbank existiert nicht");

$eintrag = "INSERT INTO sp_send (id, start_time, stop_time, tag, dj_id, dj_name, show_id, gast_dj) VALUES ('', '$sstart', '$sstop', '$termin', '$dj_id', '$dj_name', '$show', '$gast_dj')";

$eintragen = mysql_query($eintrag)or die(mysql_error());

if($eintragen == true)
   {
       echo "Eintragen Erfolgreich!<br>";
       echo "Sendezeit: ".$termin." ".$start."<br>";
       echo "Bis: ".$termin." ".$end."<br>";
       echo "Sendung: ".$show."<br>";
       echo "Mit: ".$gast_dj;
       }
else{
    echo"Fehler: Sendung Konnte nicht gespeichert Werden!";
}
    }
}

//}   
}?>

<form name="form2" method="post" action="senden.php">
  <table width="550" border="0" cellspacing="0">
  <tr>
    <th align="left" scope="col">Sendetag:</th>
    <th align="left" scope="col">
        <input type="text" name="termin" />
    <script language="JavaScript">
    new tcal ({
        // form name
        'formname': 'form2',
        // input name
        'controlname': 'termin'
    });

    </script></th>
  </tr>
  <tr>
    <td align="left">Start:</td>
    <td align="left">
        <label>
          <input name="start" type="text" id="start" value="00:00" size="8" maxlength="5">
        </label>
    </tr>
    <tr> 
        <td align="left">Ende:</td>
        <td>
            <label>
              <input name="ende" type="text" id="stop" value="00:00" size="8" maxlength="5">
            </label>
        </td>
      </tr>
  <tr>
    <td align="left">Show</td>
    <td align="left"><label>
      <select name="show" size="1" id="show">
      
    <?
        $Verbindung = mysql_connect ($conf_pass->db_host, $conf_pass->db_user,$conf_pass->db_pass)
            or die ( 'Konnte keine Verbindung zur Datenbank herstellen' );
        $Anfrage = "SELECT * FROM sp_show WHERE user_id = $umsSystem->user_id";
        $res=mysql_db_query ( $conf_pass->db_name, $Anfrage , $Verbindung)
            or die ("Fehler in der Ausführung");
        while ( $row = mysql_fetch_array ( $res ) )
        {
            echo '<option value="'.$row['id'].'">'.$row['show_name']."</option>";
        }
    ?>
      </select>
    </label></td>
  </tr>
  <tr>
    <td align="left">Gast Dj:</td>
    <td align="left"><label>
      <select name="gdj" size="1" id="gdj">
      <option selected value="">-</option>
      
    <?
        $Anfrage2 = "SELECT * FROM fa_pass0_login WHERE level > '5'";
        $res2=mysql_db_query ( $conf_pass->db_name, $Anfrage2 , $Verbindung)
            or die ("Fehler in der Ausführung");
        while ( $row = mysql_fetch_array ( $res2 ) )
        {
            echo '<option value="'.$row['nic'].'">'.$row['nic']."</option>";
        }
        
    ?>
      </select>
    </label></td>
  </tr>
  <tr>
    <td align="left">&nbsp;</td>
    <td align="left"><label>
      <input type="submit" name="speichern" id="Speichern" value="Speichern">
    </label></td>
  </tr>
</table>
Ein eintrag aus der Datenbank sieht nun so aus.
PHP:
 id | start_time | stop_time | tag | dj_id | dj_name | show_id | gast_dj
37 | 2009-09-29 22:00:00 | 2009-09-29 00:00:00 | 09/29/2009 | 1  |   nijo | 11 | 0
alternativ dazu:
37 | 1254254400 | 1254175200 | 09/29/2009 | 1  |   nijo | 11 | 0

Ich hoffe so stimmt nun die Formatierung.
Und kann beim auslesen der Datenbank die Termine Auslesen, die Heute, und Jeweils einen Woche danach kommen.

Edit:
Meine Datenbank Hat folgende Struktur:

Feld Typ Null Standard Kommentare MIME
id int(30) Nein
start_time datetime Nein 0000-00-00 00:00:00
stop_time datetime Nein 0000-00-00 00:00:00
tag varchar(30) Nein
dj_id int(30) Nein
dj_name text Nein
show_id int(30) Nein
gast_dj int(30) Nein
 
Zuletzt bearbeitet:
Zurück