String mit substr "schneiden"

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • String mit substr "schneiden"

    Hallo, ich habe das Problem, mit substr aus einer Variable die gewünschten Zeichen zu erhalten.

    Und zwar habe ich in einer Tabelle die Spalte 'datum', die vom Typ (varchar 30) ist, ein paar Daten nach folgendem Muster stehen => 01.01.2008; 01.02.2008; (...); 01.01.2007; 01.02.2007; (...) 2005; 2004; 2003 usw.

    Die abgeschlossenen Jahre sind vollständig mit 12 Monaten.

    Mein Ziel ist es, in einer select-Box, nur die Jahre auswählen zu können, ohne Tag und Monat davor. Wenn es also Einträge für das Jahr 2008 gibt, möchte ich in der Select-Box nur 2008 stehen haben und nicht 01.01.2008, 01.02.2008 usw.

    Select-Box => 2003, 2004, 2005, 2005, 2006...

    Die Auswahl vom Benutzer möchte ich in eine Variable schreiben und dann mit einer select-Abfrage nur die Datensätze anzeigen lassen, die auch wirklich zu dem Jahr gehören.

    Bis jetzt habe ich folgendes:

    Quellcode

    1. echo"<h4>Jahr auswählen</h4>";
    2. echo"Auswahl:<select name='jahr' size='1'>";
    3. $abfrage="select datum from hallo";
    4. $drow=datenarray($abfrage); //Funktion
    5. $anzahl=count($drow);
    6. for($i=0;$i<$anzahl;$i++){
    7. echo "<option value='".$drow[$i]["id"]."'> substr(".$drow[$i]["datum"].",6,4)</option>"; //mit substr versuche ich nur an das Jahr zu kommen, 6te Stelle wegen (Tag.Monat.Jahr)
    8. }
    9. echo"</select>";


    Das Jahr der Auswahl möchte ich bei der Abfrage dann berücksichtigen.

    Quellcode

    1. $Abfrage = "select * from hallo where datum = '%.%.'jahr'' order by id asc";


    Die Syntax ist irgendwie falsch, leider komme ich ohne Hilfe nicht weiter...Hilfe wäre klasse :)
  • Denn Datentyp könnte ich ändern, das ändert allerdings nicht viel.

    Die substr-Funktion an sich ist nicht schwer...

    Quellcode

    1. <?
    2. $test = "13.05.2008";
    3. echo substr($test,6,4); //2008 wird ausgegeben
    4. ?>


    Allerdings bekomm ich das in meinem Fall nicht hin, wo ich praktisch zeitgleich mit auslesen und ausgeben den String kürzen muss.
  • Billie schrieb:

    Ich hatte nämlich noch angenommen, dass ich dann noch group by machen müsste, um die gleichen Jahre zusammen zu fassen...das funktioniert allerdings schon so.

    Bist du dir über die Funktion von GROUP BY bewusst?
    Auch wenn die Ausgabe in manchen Konstellationen die selbe wie ohne GROUP BY ist, so ist es definitiv ein anderer Effekt wenn du die Funktion anwendest.
    Siehe Manual: dev.mysql.com/doc/refman/5.1/de/group-by-functions.html

    z.B. die Anzahl der Einträge pro Tag

    Quellcode

    1. SELECT YEAR(datum) AS year, COUNT(id) AS c FROM tbl GROUP BY year
  • d0nut schrieb:

    Billie schrieb:

    Ich hatte nämlich noch angenommen, dass ich dann noch group by machen müsste, um die gleichen Jahre zusammen zu fassen...das funktioniert allerdings schon so.

    Bist du dir über die Funktion von GROUP BY bewusst?
    Auch wenn die Ausgabe in manchen Konstellationen die selbe wie ohne GROUP BY ist, so ist es definitiv ein anderer Effekt wenn du die Funktion anwendest.
    Siehe Manual: dev.mysql.com/doc/refman/5.1/de/group-by-functions.html

    z.B. die Anzahl der Einträge pro Tag

    Quellcode

    1. SELECT YEAR(datum) AS year, COUNT(id) AS c FROM tbl GROUP BY year


    Eigentlich war ich mir der Funktion bewusst, da hatte ich in diesem Fall falsch gedacht.

    Ich wollte noch gern beim Problem von gestern einhaken...dass nur das Jahr ausgegeben wird, funktioniert auf diese Weise richtig.

    Quellcode

    1. echo "<option value=".$drow[$i]['id']."'>" . substr($drow[$i]["datum"], -4) . "</option>";


    Nun möchte ich die Benutzerauswahl aus der Select-Box in einer Variable speichern.

    Diese möchte ich dann in einer select-Abfrage benutzen, damit nur Einträge aus dem ausgewählten Jahr angezeigt werden.

    Quellcode

    1. echo"Auswahl:<select name='jahr' size='1'>";
    2. $abfrage="select datum from hallo";
    3. $drow=datenarray($abfrage);
    4. $anzahl=count($drow);
    5. for($i=0;$i<$anzahl;$i++){
    6. echo "<option value=".$drow[$i]['id']."'>" . $auswahl = substr($drow[$i]["datum"], -4) . "</option>";
    7. }
    8. echo"</select>";


    Wenn ich mich nich irre, wird die Auswahl im 'jahr' gespeichert.

    Bei der SELECT-Abfrage dachte ich an folgenden WHERE-Teil.

    Quellcode

    1. $Abfrage = "SELECT datum FROM hallo WHERE datum = '%.jahr' order by id asc";


    Könnt ihr mir da vielleicht weiterhelfen? Eigentlich ist das, glaub ich, nicht so schwer, aber ich kann das nicht richtig in der Syntax umsetzen.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Billie ()

  • Wenn der obere Teil funktionieren sollte, dann steht es wie du gesagt hast in "jahr".

    Dann kommt es drauf an in welcher superglobalen es steht.
    Entweder $_GET oder $_POST

    Das liegt an deinem Formular:

    nehmen wir an es wird per post übertragen:

    Quellcode

    1. <form method="POST" ...


    Dann sieht die Abfrage so aus:

    Quellcode

    1. $Abfrage = "SELECT datum FROM hallo WHERE datum LIKE '%".$_POST['jahr']."' order by id asc";


    Da es eine wildcardabfrage ist, benutzt du LIKE und nicht = !


    Was ich noch sehe ist, dass du als value die id übergibst. Das ist, wenn ich dich richtig verstehe falsch.

    Quellcode

    1. echo "<option value=".$drow[$i]['id']."'>" . $auswahl = substr($drow[$i]["datum"], -4) . "</option>";

    Der value ist der Wert, welcher übertragen wird. Da du das Jahr gerne hättest, müsstest du dort auch das Jahr nutzen.

    Quasi so:

    Quellcode

    1. $auswahl = substr($drow[$i]["datum"], -4) ; // wenn du variablen deklarierst, dann nutze diese auch. Jedes substr kostet performance ;)
    2. echo "<option value=".$auswahl."'>" .$auswahl. "</option>";



    Nachm 10. Edit klappts irgendwann auch mal mitm Editor :D

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von vince ()

  • vince schrieb:

    wenn du variablen deklarierst, dann nutze diese auch. Jedes substr kostet performance ;)


    Wenn ich mir das jetzt überlege, dann brauche ich diese Variable gar nicht. Die Auswahl vom Benutzer steht dann doch im jahr. Wozu also nochmal die Auswahl übergeben?

    Mit dem jetztigen Quellcode läuft das folgendermaßen ab. Die Tabelle, in die die Daten aus dem ausgewählten Jahr ausgelesen und eingetragen werden sollen steht zu beginn leer. Wenn ich aus der Select-Box ein Jahr auswähle, tut sich nichts. Also irgendwie funktioniert die Übergabe des Jahres an den Select Teil noch nicht.

    Quellcode

    1. <?include ("verbindung.php");
    2. function datenarray ($Abfrage)
    3. {
    4. $res = mysql_query ($Abfrage);
    5. while($daten=mysql_fetch_array($res))
    6. {
    7. $speicher[]=$daten;
    8. }
    9. return $speicher;
    10. }
    11. $Abfrage = "SELECT * FROM hallo WHERE datum LIKE '%".$_POST['jahr']."' order by id asc";
    12. $daten = datenarray($Abfrage);
    13. $anz = count($daten);
    14. ?>
    15. <form action="" method="POST">
    16. <?
    17. echo"<table border=1>";
    18. echo"<tr>
    19. <th></th>
    20. <th>id</th>
    21. <th>Datum</th>
    22. <th>Wert</th>
    23. </tr>";
    24. for ($i=0;$i<$anz;$i++)
    25. {
    26. echo "<tr>
    27. <td><input type='checkbox' name='opt_haken[]' value='".$daten[$i]["id"]."'></td>
    28. <td>".$daten[$i]["id"]."</td>
    29. <td>".$daten[$i]["datum"]."</td>
    30. <td>".$daten[$i]["wert"]."</td>
    31. </tr>";
    32. }
    33. echo "</table>";
    34. echo"<br><h4>Jahr auswählen</h4>";
    35. echo"Auswahl:<select name='jahr' size='1'>";
    36. $abfrage="select datum from hallo";
    37. $drow=datenarray($abfrage);
    38. $anzahl=count($drow);
    39. for($i=0;$i<$anzahl;$i++){
    40. //echo "<option value=".$drow[$i]['id']."'>" . $auswahl = substr($drow[$i]["datum"], -4) . "</option>";
    41. $auswahl = substr($drow[$i]["datum"], -4) ;
    42. echo "<option value=".$auswahl."'>" .$auswahl. "</option>";
    43. }
    44. echo"</select>";
    45. ?>
    Alles anzeigen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Billie ()

  • btw.. 2 Korrekturen

    #1 $Abfrage = "SELECT * FROM hallo WHERE datum LIKE '%".intval($_POST['jahr']."' order by id asc";
    #2 echo "<option value='".$auswahl."''>" .$auswahl. "</option>";

    Außerdem solltest du kein Query machen, wenn $_POST['jahr'] nicht gesetzt ist.

    Zuletzt brauchst du noch einen submit button und musst das Formular schließen.
    Aber am besten du checkst deinen HTML Code einfach mal unter validator.w3.org
  • d0nut schrieb:

    btw.. 2 Korrekturen

    #1 $Abfrage = "SELECT * FROM hallo WHERE datum LIKE '%".intval($_POST['jahr']."' order by id asc";
    #2 echo "<option value='".$auswahl."''>" .$auswahl. "</option>";

    Außerdem solltest du kein Query machen, wenn $_POST['jahr'] nicht gesetzt ist.

    Zuletzt brauchst du noch einen submit button und musst das Formular schließen.
    Aber am besten du checkst deinen HTML Code einfach mal unter validator.w3.org


    Danke, die Korrekturen habe ich berücksichtigt und es fehlte tatsächlich ein Button, um die Auswahl "abzuschicken" :)

    Das funktioniert jetzt wunderbar, der Benutzer wählt das Jahr aus und es werden nur die Datensätze aus dem gewünschten Jahr angezeigt.

    Auf den Button hätte ich auch alleine drauf kommen können :pinch:
  • Ich habe jetzt mal ein paar Jahre in die Datenbank eingepflegt, jeweils mit 12 Datensätzen pro Jahr. Allerdings wird in der select-Box jeder Datensatz ausgegeben, sodass die Liste sehr lang ist und das Jahr 2006 beispielsweise 12x vorkommt. Gibt es eine Möglichkeit, Datensätze die aus einem Jahr kommen, zusammen zu fassen? Ich möchte pro Jahr nur einen Eintrag in der select-box.

    Quellcode

    1. echo"Auswahl:<select name='jahr' size='0'>";
    2. $abfrage="select datum from hallo";
    3. $drow=datenarray($abfrage);
    4. $anzahl=count($drow);
    5. for($i=0;$i<$anzahl;$i++){
    6. $auswahl = substr($drow[$i]["datum"], -4) ;
    7. echo "<option value='".$auswahl."''>" .$auswahl. "</option>";
    8. }
    9. echo"</select>";


    Dann hab ich noch ein kleines Problem...wenn ich das Jahr ausgewählte habe, werden die entsprechenden Datensätze angezeigt. Wenn ich nun einen Datensatz bearbeite und die Änderung speichere, wird die Seite neue geladen, dabei wird wieder das Jahr aus der select-Box genommen und da steht standardmäßig der erste Wert in der select-box. Sprich, ich muss erstmal wieder das richtige Jahr auswählen um zu sehen, ob die Änderung erfolgreich war. Ich hoffe, ihr könnt mir folgen. Kann man die Auswahl irgendwie speichern, dass nach der Auswahl nicht wieder der erste Wert in der Auswahlbox steht, sondern eben der ausgewählte?
  • für das Gruppieren scroll mal ein paar Zeilen hoch.

    Billie schrieb:

    Kann man die Auswahl irgendwie speichern, dass nach der Auswahl nicht wieder der erste Wert in der Auswahlbox steht, sondern eben der ausgewählte?

    Das andere Problem ist auch denkbar einfach gelöst ;)

    Quellcode

    1. if($_REQUEST['jahr'] == $auswahl) {
    2. echo '<option value="'.$auswahl.'" selected="selected">' .$auswahl. '</option>';
    3. }
  • Zum ersten Problem:

    Quellcode

    1. echo 'Auswahl: <select name="jahr" size="0">';
    2. $drow = datenarray('SELECT datum FROM hallo');
    3. $dateStore = array();
    4. for($i=0,$cnt=count($drow); $i < $cnt; $i++) {
    5. $selection = substr($drow[$i]["datum"], -4);
    6. if(in_array($selection, $dateStore)) {
    7. continue;
    8. } else {
    9. $dateStore[] = $selection;
    10. echo '<option value="'.$selection.'">'.$selection.'</option>';
    11. }
    12. }
    13. echo '</select>';
    Alles anzeigen
    MfG dynambee

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von dynambee ()

  • Danke d0nut und dynambee...beide Lösungen funktionieren.

    Ich möchte jetzt beide allerdings kombinieren, mit dynambee's Code geht das gruppieren, mit Hilfe von d0nut geht das merken.

    Quellcode

    1. echo 'Auswahl: <select name="jahr" size="0">';
    2. $drow = datenarray('SELECT datum FROM hallo');
    3. $dateStore = array();
    4. for($i=0,$cnt=count($drow); $i < $cnt; $i++) {
    5. $selection = substr($drow[$i]["datum"], -4);
    6. if(in_array($selection, $dateStore)) {
    7. continue;
    8. }
    9. else {
    10. $dateStore[] = $selection;
    11. if($_REQUEST['jahr'] == $selection) {
    12. echo '<option value="'.$selection.'" selected="selected">' .$selection. '</option>';
    13. }
    14. }
    15. }
    16. echo '</select>';
    Alles anzeigen


    Irgendwas mache ich falsch, wenn die Select-Box leer bleibt.
  • Kleiner Fehler ;)

    Quellcode

    1. echo 'Auswahl: <select name="jahr" size="0">';
    2. $drow = datenarray('SELECT datum FROM hallo');
    3. $dateStore = array();
    4. for($i=0,$cnt=count($drow); $i < $cnt; $i++) {
    5. $selection = substr($drow[$i]["datum"], -4);
    6. if(in_array($selection, $dateStore)) {
    7. continue;
    8. } else {
    9. $dateStore[] = $selection;
    10. echo '<option value="'.$selection.'"'.(($_REQUEST['jahr'] == $selection) ? ' selected="selected"' : '').'>' .$selection. '</option>';
    11. }
    12. }
    13. echo '</select>';
    Alles anzeigen
    MfG dynambee