php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.02.2012, 16:19  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard [Erledigt] DateTime Daten aus Datebank in Wochentage und Jahre ausgeben

Hallo Freunde,

ich versuche alle Einträge aus meiner Datenbank als Tabelle auszugeben, in der man sehen kann wieviel "Punkte" man am welchen Wochentag im Jahr erreicht hat.

Wie das ganze aussehen soll seht ihr im Anhang als Screenshot.

Soweit bin ich schon gekommen:
PHP-Code:
// Tabelle ausgeben
        
echo '<table id="tbl_statistic" class="tbl">
            <thead>
                <tr>
                    <td></td>
                    <th scope="col">Montag</th>
                    <th scope="col">Dienstag</th>
                    <th scope="col">Mittwoch</th>
                    <th scope="col">Donnerstag</th>
                    <th scope="col">Freitag</th>
                    <th scope="col">Samstag</th>
                </tr>
            </thead>
            <tbody>'
;
            
        
// 
        
$sql "SELECT `date_from` FROM `".$table."` WHERE `user_id` = '".$id."';";
        
$query mysql_query($sql) or die(mysql_error());
        
        if(
$query)
        {
            while(
$row mysql_fetch_array($query))
            {    
                
// Zahl des Wochentages 0=Montag
                
$datum_from_day = (strftime("%w"strtotime($row["date_from"])) - 1);

                
//Jahr des Datums
                
$datum_from_year strftime("%Y"strtotime($row["date_from"]));
                
                
//Alles Jahre der DB in Array laden
                
$years[] = strftime("%Y"strtotime($row["date_from"]));
                
                
//Doppelte Einträge löschen
                
$years array_unique($years);
                
                
//Index des Arrays neu setzen
                
$years array_values($years);
                
                echo 
$datum_from_day."<br/>";
                
                
$sql_t "SELECT SUM(`absence_time`) AS `absence_time` FROM `".$table."` WHERE WEEKDAY(`date_from`) = ".$datum_from_day." AND YEAR(`date_from`) = ".$datum_from_year." AND `user_id` = '".$id."';";
                
$query_t mysql_query($sql_t) or die(mysql_error());
                
                while(
$row_t mysql_fetch_array($query_t))
                {
                    
//Montag
                    
if($datum_from_day == 0)
                    {
                        
                        echo 
"Montag(".$datum_from_year.")<br/>";
                        
$time_mo[] = $row_t["absence_time"];
                        
print_r($time_mo);
                        echo 
"<br/>";
                        
                    }
                    
//Dienstag
                    
if($datum_from_day == 1)
                    {
                        
                        echo 
"Dienstag(".$datum_from_year.")<br/>";
                        
$time_di[] = $row_t["absence_time"];
                        
print_r($time_di);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Mittwoch
                    
if($datum_from_day == 2)
                    {
                        
                        echo 
"Mittwoch(".$datum_from_year.")<br/>";
                        
$time_mi[] = $row_t["absence_time"];
                        
print_r($time_mi);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Donnerstag
                    
if($datum_from_day == 3)
                    {
                        
                        echo 
"Donnerstag(".$datum_from_year.")<br/>";
                        
$time_do[] = $row_t["absence_time"];
                        
print_r($time_do);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Freitag
                    
if($datum_from_day == 4)
                    {
                        
                        echo 
"Freitag(".$datum_from_year.")<br/>";
                        
$time_fr[] = $row_t["absence_time"];
                        
print_r($time_fr);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Samstag
                    
if($datum_from_day == 5)
                    {
                        
                        echo 
"Samstag(".$datum_from_year.")<br/>";
                        
$time_sa[] = $row_t["absence_time"];
                        
print_r($time_sa);
                        echo 
"<br/>";
                        
                        
                    }
                    
                }
                
            }
            
            
// Array auf gleicher Länge setzen und fehlender Index mit 0 Wert hinzufügen
            
$time_mo array_pad($time_mocount($years), 0);
            
$time_di array_pad($time_dicount($years), 0);
            
$time_mi array_pad($time_micount($years), 0);
            
$time_do array_pad($time_docount($years), 0);
            
$time_fr array_pad($time_frcount($years), 0);
            
$time_sa array_pad($time_sacount($years), 0);
            
            
// Tabelle ausgeben
            
for ($i 0$i count($years); $i++) 
            {
                echo
'<tr style="text-align:center;" class="tbl_row_'.($i ).'">
                        <th scope="row">'
.$years[$i].'</th>
                        <td>'
.$time_mo[$i].'</td>
                        <td>'
.$time_di[$i].'</td>
                        <td>'
.$time_mi[$i].'</td>
                        <td>'
.$time_do[$i].'</td>
                        <td>'
.$time_fr[$i].'</td>
                        <td>'
.$time_sa[$i].'</td>
                    </tr>'
;
            }

            
        }
            
        echo
' </tbody>
        </table>'

Das Problem ist, dass es in diesem Fall(Anhang) im Jahr 2011 Montage gibt, wo punkte erzielt wurden. Diese werden addiert. insgesamt gibt es also 16 Punkte. Aber im Jahr 2012 gibt es in der DB keinen Eintrag...trotzdem wird dem Array weiter Werte hinzugefügt.

Woran könnte das liegen?

Hier die DB(datum_from,punkte):

Zitat:
2011-12-05 07:40:00,1
2011-12-07 13:17:58,3
2011-01-18 06:00:00,2
2011-02-03 00:00:00,6
2011-02-04 00:00:00,4
2011-02-14 00:00:00,8
2011-02-21 07:40:00,7
2012-02-07 00:00:00,5
2012-02-27 00:00:00,9


Hier noch die Ausgabe:
Zitat:
Montag(2011)
Array ( [0] => 16 )
2
Mittwoch(2011)
Array ( [0] => 3 )
1
Dienstag(2011)
Array ( [0] => 2 )
3
Donnerstag(2011)
Array ( [0] => 6 )
4
Freitag(2011)
Array ( [0] => 4 )
0
Montag(2011)
Array ( [0] => 16 [1] => 16 )
1
Dienstag(2012)
Array ( [0] => 2 [1] => 5 )
0
Montag(2011)
Array ( [0] => 16 [1] => 16 [2] => 16 )
0
Montag(2012)
Array ( [0] => 16 [1] => 16 [2] => 16 [3] => 9 )
Vielen Dank im voraus.
Miniaturansicht angehängter Grafiken
erledigt-datetime-daten-aus-datebank-wochentage-und-jahre-ausgeben-unbenannt-2.jpg  

Geändert von thiagojonas (08.02.2012 um 16:25 Uhr).
thiagojonas ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.02.2012, 16:24  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Zitat:
Das Problem ist, dass es in diesem Fall(Anhang) im Jahr 2011 Montage gibt, wo punkte erzielt wurden. Diese werden addiert. insgesamt gibt es also 16 Punkte. Aber im Jahr 2012 gibt es in der DB keinen Eintrag...trotzdem wird dem Array weiter Werte hinzugefügt.
...das Du evtl. dein Array für jedes neue Jahr nicht leerst, sondern einfach ergänzt! 2011 hast du 16 Punkte und für 2012 werden auch 16 angezeigt...klingt verdammt danach ohne deinen Code jetzt genauer angeschaut zu haben.

mfg Wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 09.02.2012, 10:42  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Ohje... ich glaube du hast recht...aber wenn ich vorher das jeweilige array lösche, so wird in der for-schleife nur der letzte eintrag gezeigt.

Das liegt daran, dass ich im array years alle jahre die in der db vorkommen hinzugefügt habe.

wenn ich das ohne for-schleife mache... werden alle daten von 2011 bzw. 2012 in der tabelle angezeigt.

Wenn ich im ersten query ein GOUP BY YEAR(date_from) setze, so werden die jahre jeweils nur einmal angzeigt...aber die anderen daten stimmen dann natürlich nicht...

wie kann ich das lösen?
thiagojonas ist offline   Mit Zitat antworten
Alt 09.02.2012, 10:45  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Entweder machst du das direkt mit nem SQL Statement, oder du baust dir 2 Schleifen; die äussere für das jeweilige Jahr und die innere summiert die gewünschten Werte und hält die in einem Array mit index als Jahr fest.

mfg Wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 09.02.2012, 11:37  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Wie könnte ich denn das mit dem SQL Statement machen? Das habe ich doch schon oder?

Edit: Wäre auch bestimmt die saubere Art...
thiagojonas ist offline   Mit Zitat antworten
Alt 09.02.2012, 11:59  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Tipp (verschachtelte Unterabfragen): http://www.datenschwamm.de/4/sql.php?p=unterabfrage

mfg Wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 09.02.2012, 14:18  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Danke wolf29,

aber irgendwie komme ich nicht weiter...habe es jetzt den ganzen vormittag und mittag probiert.

Bevor das Array gefüllt wird, wird es vorher geleert.
PHP-Code:
//Montag
                    
if($datum_from_day == 0)
                    {
                        
                        echo 
"Montag (".$datum_from_year.")<br/>";
                        unset(
$time_mo);
                        
$time_mo[] = $row_t["absence_time"];
                        
print_r($time_mo);
                        echo 
"<br/>";
                        
                    }
                    
//Dienstag
                    
if($datum_from_day == 1)
                    {
                        
                        echo 
"Dienstag (".$datum_from_year.")<br/>";
                        unset(
$time_di);
                        
$time_di[] = $row_t["absence_time"];
                        
print_r($time_di);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Mittwoch
                    
if($datum_from_day == 2)
                    {
                        
                        echo 
"Mittwoch (".$datum_from_year.")<br/>";
                        unset(
$time_mi);
                        
$time_mi[] = $row_t["absence_time"];
                        
print_r($time_mi);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Donnerstag
                    
if($datum_from_day == 3)
                    {
                        
                        echo 
"Donnerstag (".$datum_from_year.")<br/>";
                        unset(
$time_do);
                        
$time_do[] = $row_t["absence_time"];
                        
print_r($time_do);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Freitag
                    
if($datum_from_day == 4)
                    {
                        
                        echo 
"Freitag (".$datum_from_year.")<br/>";
                        unset(
$time_fr);
                        
$time_fr[] = $row_t["absence_time"];
                        
print_r($time_fr);
                        echo 
"<br/>";
                        
                        
                    }
                    
//Samstag
                    
if($datum_from_day == 5)
                    {
                        
                        echo 
"Samstag (".$datum_from_year.")<br/>";
                        unset(
$time_sa);
                        
$time_sa[] = $row_t["absence_time"];
                        
print_r($time_sa);
                        echo 
"<br/>";
                        
                        
                    } 
Aber wie gesagt...jetzt wird durch die For-Schleife bei der Ausgabe am Ende des Codes nur der letze Eintrag der jeweiligen Arrays angezeigt...

Kannst du mir vielleicht eine grobe Struktur geben? Egal ob mit den For-Scheifen oder dem SQL Statement.

Was ich ja eigentlich nur brauch ist, dass nicht alle Jahre der einzelnen Einträge angezeigt werden, sondern halt nur die Jahre jweils nur einmal.

Danke
thiagojonas ist offline   Mit Zitat antworten
Alt 09.02.2012, 16:59  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

- Keine Querys absetzen in Schleifen.
- Querys so aufbauen das sie automatisch den wochentag als rückgabefeld ausliefern.
- Arrays die jedesmal vorm hinzufügen eines Therms gelöscht werden sind sinnfrei, oder ein (array)-cast beim print_r()'n
- IF's die aufeinanderfolgen werden auch aufeinanderfolgend konsultiert, wenn du immerwieder eine Variable hintereinander auf einen Wert testes rufst du somit 100te ( übertrieben ) IF's auf. Auch das ist Murks:

PHP-Code:
$a 0;

if ( 
$a == ) { /* ... */ // checked every time
if ( $a == ) { /* ... */ // checked every time
if ( $a == ) { /* ... */ // checked every time 
besser:
PHP-Code:
if ( $a == ) { /* ... */ }
elseif ( 
$a == ) { /* ... */ // skipped if $a has value 1
elseif ( $a == ) { /* ... */ // skipped if $a has value 1 
oder der übersicht wegen:
PHP-Code:
switch ( $a ) {
   case 
1:
      
/* ... */
      
break;
   case 
2:
      
/* ... */
      
break;
   case 
3:
      
/* ... */
      
break;

Datums-Identifikation kannst du am anfachsten so testen ( als Beispiel Wochentag ):
PHP-Code:
if ( date_create($datumAusDB)->format('w') == // montag 
Hinsichtlich übersicht:
PHP-Code:
switch( (int)date_create($datumAusDB)->format('w') ) {
   case 
0: echo 'montag'; break;
   case 
1: echo 'dienstag'; break;
   case 
2: echo 'mittwoch'; break;
   case 
3: echo 'donnerstag'; break;
   case 
4: echo 'freitag'; break;
   case 
5: echo 'samstag'; break;
   case 
6: echo 'sonntag'; break;
   default: echo 
'dateTime-Klasse war besoffen oder außerirdischer Wochentag entdeckt.';

__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.

Geändert von tr0y (10.02.2012 um 13:33 Uhr).
tr0y ist offline   Mit Zitat antworten
Alt 10.02.2012, 13:19  
Erfahrener Benutzer
 
Registriert seit: 03.10.2008
Beiträge: 227
thiagojonas zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Okay...vielen Dank für die Hilfe.

Ich habe es jetzt wie folgt gelöst:


PHP-Code:
        //For-Schleife für die Jahre
        
for ($i 0$i count($years); $i++) 
        {
            
//For-Schleife für Wochentage
            
for ($j 0$j count($days); $j++) 
            {
                
$sql_t "SELECT `date_from`,SUM(`absence_time`) AS `absence_time` FROM `".$table."` WHERE WEEKDAY(`date_from`) = ".$days[$j]." AND YEAR(`date_from`) = ".$years[$i]." AND `user_id` = '".$id."';";
                
$query_t mysql_query($sql_t) or die(mysql_error());
                
                
$row_t mysql_fetch_array($query_t);    

                switch( (int)(
date_create($row_t["date_from"])->format('w') - 1)) 
                {
                    
                   case 
0$time_mo[] = $row_t["absence_time"]; break;
                   case 
1$time_di[] = $row_t["absence_time"]; break;
                   case 
2$time_mi[] = $row_t["absence_time"]; break;
                   case 
3$time_do[] = $row_t["absence_time"]; break;
                   case 
4$time_fr[] = $row_t["absence_time"]; break;
                   case 
5$time_sa[] = $row_t["absence_time"]; break;

                }  
            }            
        }
        

        
// Array auf gleicher Länge setzen und fehlender Index mit 0 Wert hinzufügen
        
$time_mo array_pad($time_mocount($years), 0);
        
$time_di array_pad($time_dicount($years), 0);
        
$time_mi array_pad($time_micount($years), 0);
        
$time_do array_pad($time_docount($years), 0);
        
$time_fr array_pad($time_frcount($years), 0);
        
$time_sa array_pad($time_sacount($years), 0);

print_r($time_mo);echo"<br/>";
        
print_r($time_di);echo"<br/>";
        
print_r($time_mi);echo"<br/>";
        
print_r($time_do);echo"<br/>";
        
print_r($time_fr);echo"<br/>";
        
print_r($time_sa);echo"<br/>";



        
//Tabelle ausgeben
        
for ($i 0$i count($years); $i++) 
        {
            echo
'<tr style="text-align:center;" class="tbl_row_'.($i ).'">
                    <th scope="row">'
.$years[$i].'</th>
                    <td>'
.$time_mo[$i].'</td>
                    <td>'
.$time_di[$i].'</td>
                    <td>'
.$time_mi[$i].'</td>
                    <td>'
.$time_do[$i].'</td>
                    <td>'
.$time_fr[$i].'</td>
                    <td>'
.$time_sa[$i].'</td>
                </tr>'
;
        } 
Es klappt wunderbar, außer beim Freitag...bei der Ausgabe der Arrays erhalte ich da auch einen komischen Wert:

Zitat:
Array ( [0] => 16 [1] => 9 )
Array ( [0] => 2 [1] => 5 )
Array ( [0] => 3 [1] => 0 )
Array ( [0] => 6 [1] => 12 )
Freitag: Array ( [0] => 4 [1] => [2] => [3] => )
Array ( [0] => 11 [1] => 0 )
Index 0 steht für eine Jahr, Index 1 für ein anderes Jahr.

Bei den anderen funktioniert es es super....woran liegt das?
thiagojonas ist offline   Mit Zitat antworten
Alt 10.02.2012, 13:36  
Erfahrener Benutzer
 
Benutzerbild von tr0y
 
Registriert seit: 26.07.2010
Beiträge: 4.874
PHP-Kenntnisse:
Fortgeschritten
tr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblicktr0y ist ein wunderbarer Anblick
tr0y eine Nachricht über MSN schicken
Standard

!! querys nix in schleife tun !! Menge / Range festlegen und menge an datensätze selektieren !

Ich schnall noch nicht ganz was du mit array_pad rumfummelst, statt daten die du brauchst direkt per dateTime::format() vorzuhalten.
__________________
Lasse mir ohne Anwendung von Gewalt Dinge schenken, Amazon weiß darüber bald mehr.
tr0y ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Daten aus Datenbank abfragen und ausgeben - Schleife verzweifelt gesucht Q_5 PHP Einsteiger 7 17.04.2011 23:25
MySQL Daten in bestimmte Zellen/Zeilen ausgeben MCBurner Datenbanken 15 16.04.2011 22:31
Daten aus DB ausgeben Alex67 HTML, Usability und Barrierefreiheit 2 19.02.2011 09:40
Komplette Daten aus Datenbank in editierbarer Form ausgeben zzzboard PHP Tipps 2010 1 21.08.2010 13:29
[Erledigt] Daten zufällig aus Datenbank ausgeben jul3m4us Datenbanken 9 19.12.2008 13:25
CSV Daten alphabetisch ausgeben pfump PHP Tipps 2008 14 15.12.2008 19:15
Daten nur an bestimmten Tag ausgeben? Onemillion PHP Tipps 2008 2 07.12.2008 16:12
Daten aus php Datei einlesen und ausgeben Pearl PHP Tipps 2008 13 28.08.2008 17:34
Daten als Rotation ausgeben superskunk PHP Tipps 2008 16 24.05.2008 21:15
[Erledigt] Daten in einem Formular ausgeben und ändern PHP Tipps 2004-2 7 07.12.2004 17:22
Daten in Spalten ausgeben, wo ist mein fehler?? PHP Tipps 2004 5 28.09.2004 12:37
highscore-msql daten in php ausgeben PHP Tipps 2004 4 14.09.2004 18:41
Daten ausgeben PHP Tipps 2004 3 25.08.2004 14:14
Daten aus MySQL-Datenabnk ab Zeile X ausgeben PHP Tipps 2004 2 09.08.2004 19:17
daten in umgekehrter reihenfolge ausgeben, ohne order by Datenbanken 3 31.07.2004 18:10

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql datetime ausgeben php, wochentage wann th

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:01 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum