Mittwoch, 5. November 2008
Nix neues von Google
Leider hat sich Google bis jetzt immer noch nicht auf meine Anfrage gemeldet. Ich werde also wohl bis in alle Ewigkeit für Adsense gesperrt bleiben. Schade.
Donnerstag, 31. Juli 2008
Sperrung bei Google Adsense
Völlig überraschend kam heute eine email, die sehr lapidar die Sperrung meines Accounts bei Google Adsense mitteilt.
Zitat:
"Hallo Sebastian Kleine,
beim Durchsehen unserer Aufzeichnungen haben wir festgestellt, dass Ihr
AdSense-Konto ein Risiko für unsere AdWords-Kunden darstellt. Würden
wir Ihr Konto weiterhin in unserem Publisher-Netzwerk zulassen, könnte
unseren Inserenten dadurch ein finanzieller Schaden entstehen. Deshalb
haben wir Ihr Konto deaktiviert.
Wir haben diese Maßnahme ergriffen, um sowohl die Interessen unserer
Inserenten als auch die unserer AdSense-Publisher zu wahren. Es ist uns
bewusst, dass dies zu einigen Unannehmlichkeiten führen kann. Wir
danken Ihnen im Voraus für Ihr Verständnis und Ihre Kooperation. ..."
Hah. Ich hatte schon fast gedacht, ich stelle eine Gefahr für Google dar. Aber doch nur für deren Kunden. Obwohl ich das nicht nachvollziehen kann. Die Klickrate war wirklich nicht hoch (so 0,1% oder niedriger) und sonstige Verstöße kann ich mir auch nicht erklären. Da ich Google Adsende auf mehreren Seiten eingesetzt habe, weiss ich noch nichtmal, ob es vielleicht nur um eine bestimmte Seite ging, mit der Google ein Problem hat.
Und mal ganz ehrlich. Ich glaube nicht, dass sich auch nur ein Google-Mitarbeiter die Sache persönlich angesehen hat. Das hat automatisch ein Computer irgendwie ermittelt und mich deswegen gesperrt. Als einzige Möglichkeit bleibt mir jetzt ein Wiederspruch. Den habe ich auch verfasst. Lustigerweise soll man im Wiederspruchsformular Tatsachen angeben, die Googles Meinung wiederlegen können. Nur leider teilt Google ja nicht mal einen Grund mit. Wie soll ich einen Grund wiederlegen, wenn ich den Grund nicht einmal kenne?
Hier jetzt mein Wiederspruchstext:
Leider teilen Sie in Ihrer email nur mit, dass "Ihr
AdSense-Konto ein Risiko für unsere AdWords-Kunden darstellt". Ich habe Adsense auf mehreren Seiten eingesetzt und weder Eigenklicks gemacht noch eine ungewöhnlich hohe Klickrate gehabt (soweit ich mich erinnern kann). Ich würde sie deswegen bitten, mir mitzuteilen, welche Webseite(n) sie als Risiko einstufen. Vielleicht können sie mir auch noch ein oder zwei Sätze mehr schreiben, warum sie zu dieser Einschätzung kommen. Aufgrund meiner Erfahrung gehe ich auch davon aus, dass diese Entscheidung automatisch von einem Computer getroffen wurde. Aber irgendeinen Grund muss es ja gegeben haben.
MfG
Sebastian Kleine
Ich fürchte ja nur, dass niemand das überhaupt lesen wird, sondern ich eine automatische Antwort bekommen und das wars.
Und falls ihr es noch nicht gesehen habt, dann schaut euch mal diesen Eintrag an:
Google wird historisch
Zitat:
"Hallo Sebastian Kleine,
beim Durchsehen unserer Aufzeichnungen haben wir festgestellt, dass Ihr
AdSense-Konto ein Risiko für unsere AdWords-Kunden darstellt. Würden
wir Ihr Konto weiterhin in unserem Publisher-Netzwerk zulassen, könnte
unseren Inserenten dadurch ein finanzieller Schaden entstehen. Deshalb
haben wir Ihr Konto deaktiviert.
Wir haben diese Maßnahme ergriffen, um sowohl die Interessen unserer
Inserenten als auch die unserer AdSense-Publisher zu wahren. Es ist uns
bewusst, dass dies zu einigen Unannehmlichkeiten führen kann. Wir
danken Ihnen im Voraus für Ihr Verständnis und Ihre Kooperation. ..."
Hah. Ich hatte schon fast gedacht, ich stelle eine Gefahr für Google dar. Aber doch nur für deren Kunden. Obwohl ich das nicht nachvollziehen kann. Die Klickrate war wirklich nicht hoch (so 0,1% oder niedriger) und sonstige Verstöße kann ich mir auch nicht erklären. Da ich Google Adsende auf mehreren Seiten eingesetzt habe, weiss ich noch nichtmal, ob es vielleicht nur um eine bestimmte Seite ging, mit der Google ein Problem hat.
Und mal ganz ehrlich. Ich glaube nicht, dass sich auch nur ein Google-Mitarbeiter die Sache persönlich angesehen hat. Das hat automatisch ein Computer irgendwie ermittelt und mich deswegen gesperrt. Als einzige Möglichkeit bleibt mir jetzt ein Wiederspruch. Den habe ich auch verfasst. Lustigerweise soll man im Wiederspruchsformular Tatsachen angeben, die Googles Meinung wiederlegen können. Nur leider teilt Google ja nicht mal einen Grund mit. Wie soll ich einen Grund wiederlegen, wenn ich den Grund nicht einmal kenne?
Hier jetzt mein Wiederspruchstext:
Leider teilen Sie in Ihrer email nur mit, dass "Ihr
AdSense-Konto ein Risiko für unsere AdWords-Kunden darstellt". Ich habe Adsense auf mehreren Seiten eingesetzt und weder Eigenklicks gemacht noch eine ungewöhnlich hohe Klickrate gehabt (soweit ich mich erinnern kann). Ich würde sie deswegen bitten, mir mitzuteilen, welche Webseite(n) sie als Risiko einstufen. Vielleicht können sie mir auch noch ein oder zwei Sätze mehr schreiben, warum sie zu dieser Einschätzung kommen. Aufgrund meiner Erfahrung gehe ich auch davon aus, dass diese Entscheidung automatisch von einem Computer getroffen wurde. Aber irgendeinen Grund muss es ja gegeben haben.
MfG
Sebastian Kleine
Ich fürchte ja nur, dass niemand das überhaupt lesen wird, sondern ich eine automatische Antwort bekommen und das wars.
Und falls ihr es noch nicht gesehen habt, dann schaut euch mal diesen Eintrag an:
Google wird historisch
Javascript Tooltips
Bestimmt habt ihr das auch schon gesehen. Schöne Tooltips auf Webseiten, die per Javascript gemacht werden. Bei der Suche darüber bin ich über eine sehr nette Library genau für diesen Zweck gestolpert: DHTML Tooltips von Walter Zom
http://www.walterzorn.de/tooltip/tooltip.htm
Sehr einfach einzubauen und funktionieren hervorragen. Dazu noch super konfigurierbar mit allen möglichen Sachen. Die Cross-Browser-Funktionalität habe ich nicht explizit getestet, aber es ist immer schön, wenn man sich darüber relativ wenig Gedanken machen muss.
http://www.walterzorn.de/tooltip/tooltip.htm
Sehr einfach einzubauen und funktionieren hervorragen. Dazu noch super konfigurierbar mit allen möglichen Sachen. Die Cross-Browser-Funktionalität habe ich nicht explizit getestet, aber es ist immer schön, wenn man sich darüber relativ wenig Gedanken machen muss.
Montag, 30. Juni 2008
CSS Problem bei border-style: double
Hatte eben ein Problem mit einem grafischen Button, der einen doppelten Rahmen bekommen sollte. Der Button bekommt als Hintergrundfarbe einen Wert:
Und dann noch den doppelten Rahmen:
Tja. Damit haben ich einen doppelten Rahmen, so wie hier . Dabei gibts nur ein Problem:
Es funktioniert nicht!
Das ist doch sehr ärgerlich, wenn es einfach nicht klappt. Aber die Erklärung ist relativ einfach. Der Zwischenraum zwischen den beiden Rahmenlinien bei "double" wird mit der Hintergrundfarbe gefüllt. Und in meinem Fall sind Hintergrundfarbe und Rahmenfarbe identisch.
Wie löst man das ganze. Es ist relativ einfach. Der Rahmen muss die Farbe weiß bekommen:
Und schon funktioniert das. Man muss nur bedenken, dass es jetzt noch einen 1px großen, unsichtbaren (weil Hintergrundfarbe) Rahmen um den Button gibt.
background-color:#0175a6;Und dann noch den doppelten Rahmen:
border-style: double;
border-color: #0175a6;
border-width:3px;Tja. Damit haben ich einen doppelten Rahmen, so wie hier . Dabei gibts nur ein Problem:
Es funktioniert nicht!
Das ist doch sehr ärgerlich, wenn es einfach nicht klappt. Aber die Erklärung ist relativ einfach. Der Zwischenraum zwischen den beiden Rahmenlinien bei "double" wird mit der Hintergrundfarbe gefüllt. Und in meinem Fall sind Hintergrundfarbe und Rahmenfarbe identisch.
Wie löst man das ganze. Es ist relativ einfach. Der Rahmen muss die Farbe weiß bekommen:
border-style: double;
border-color: #ffffff;
border-width:3px;Und schon funktioniert das. Man muss nur bedenken, dass es jetzt noch einen 1px großen, unsichtbaren (weil Hintergrundfarbe) Rahmen um den Button gibt.
Freitag, 25. April 2008
Update der Promotion-Tipps
Ich habe meine Seite mit Tipps zur kostenlosen Promotion von Webseiten um den Bereich "Social Bookmarks" erweitert. Schaut mal vorbei.
Mittwoch, 9. April 2008
Google wird historisch
Nein. Es geht hier nicht um irgendeine Ankündigung, was Google jetzt wieder neues plant, sondern um eine doch etwas merkwürdige Suche bei Google.
Eigentlich ging es mir nur darum ein paar interessante Seiten zum Thema Online-Recht aufzustöbern. Also schnell bei Google nach "online recht" gesucht. Falls jemand Google nicht findet, ist hier der Link: www.google.de
Und als erste Ergebnis kommt eine Seite namens "Wegweiser Online-Recht". Das hört sich doch gut an, oder? Also schnell auf die Seite gegangen. Sieht auch ganz ok aus, für eine Recht-Seite zumindest.

Und was entdeckt man auf den zweiten Blick?
Hinweis: Online-Recht wird seit 1999 nicht mehr aktualisiert. Für 2004 ist geplant, ein neues Content-Modell für Online-Recht vorzustellen. Bitte tragen Sie sich im Newsletter Online-Recht ein, wenn Sie vom Neustart informiert werden wollen.

Unglaublich. Die Seite wird seit 9 Jahren nicht mehr aktualisiert, aber schafft es bei diesem Thema auf den ersten Platz? Was imer 2004 geplant war (was bitte ist ein neues Content-Modell?), es scheint nie über die Planung hinausgekommen zu sein.
Wenn mir eine andere Suchmaschine eine 9 Jahre alte Seite als besten Treffer präsentiert, dann bekommt sie von mir ein mitleidiges Lächeln. Aber bei Google hätte ich wirklich was anderes erwartet.
Eigentlich ging es mir nur darum ein paar interessante Seiten zum Thema Online-Recht aufzustöbern. Also schnell bei Google nach "online recht" gesucht. Falls jemand Google nicht findet, ist hier der Link: www.google.de
Und als erste Ergebnis kommt eine Seite namens "Wegweiser Online-Recht". Das hört sich doch gut an, oder? Also schnell auf die Seite gegangen. Sieht auch ganz ok aus, für eine Recht-Seite zumindest.

Und was entdeckt man auf den zweiten Blick?
Hinweis: Online-Recht wird seit 1999 nicht mehr aktualisiert. Für 2004 ist geplant, ein neues Content-Modell für Online-Recht vorzustellen. Bitte tragen Sie sich im Newsletter Online-Recht ein, wenn Sie vom Neustart informiert werden wollen.

Unglaublich. Die Seite wird seit 9 Jahren nicht mehr aktualisiert, aber schafft es bei diesem Thema auf den ersten Platz? Was imer 2004 geplant war (was bitte ist ein neues Content-Modell?), es scheint nie über die Planung hinausgekommen zu sein.
Wenn mir eine andere Suchmaschine eine 9 Jahre alte Seite als besten Treffer präsentiert, dann bekommt sie von mir ein mitleidiges Lächeln. Aber bei Google hätte ich wirklich was anderes erwartet.
Dienstag, 8. April 2008
Neues Projekt: Kedoo.de
Jetzt ist es endlich fertig. Mein neues Projekt Kedoo.de.
Dabei handelt es sich um einen Webkatalog zum Thema Web-Design und Web-Entwicklung. Ein paar Seiten habe ich schon eingetragen.
Ich hoffe die Seite wird schnell bekannt und von vielen Leuten genutzt.
Dabei handelt es sich um einen Webkatalog zum Thema Web-Design und Web-Entwicklung. Ein paar Seiten habe ich schon eingetragen.
Ich hoffe die Seite wird schnell bekannt und von vielen Leuten genutzt.
Mittwoch, 13. Februar 2008
Show the Pictures
Jetzt ist es fertig: Show the Pictures in der Version 1.0
Was macht das Programm?
Ganz einfach. Man kann damit ganz bequem Bilder in einer Slideshow anzeigen. Das gibts schon ganz ganz oft, aber diese Programm ist etwas besonderes. Denn die Bilder werden auf einem zweiten Monitor oder Beamer angezeigt. Und jeder, der dies schonmal versucht hat, der wird wohl auch gescheitert sein.
Hier noch der Link: Show the Pictures
Was macht das Programm?
Ganz einfach. Man kann damit ganz bequem Bilder in einer Slideshow anzeigen. Das gibts schon ganz ganz oft, aber diese Programm ist etwas besonderes. Denn die Bilder werden auf einem zweiten Monitor oder Beamer angezeigt. Und jeder, der dies schonmal versucht hat, der wird wohl auch gescheitert sein.
Hier noch der Link: Show the Pictures
Donnerstag, 31. Januar 2008
LoaderLock bei ShowDialog
Es gibt Dinge die sind so unglaublich, dass man sie wirklich nicht glauben kann...
Ich habe in VB 2005 eine Anwendung entwickelt (eigentlich bin ich noch dabei...) und habe ein weiteres Formular hinzugefügt. Dieses Formular enthält 2 Textboxen und 2 Buttons (Abbrechen und OK). Jetzt soll der Button OK aber erst enabled sein, wenn in beiden Textboxen was drin steht und in der zweiten Textbox der Text genau 10 Zeichen lang ist. Soweit eigentlich recht einfach. Das Formular wird über ShowDialog() aufgerufen (bei Show() passiert aber genau das gleiche).
Ich starte meine Anwendung, öffne das Formular und tippe etwas in die erste Textbox. Und beim ersten Buchstaben erhalte ich eine "LoaderLock wurde erkannt"-Fehlermeldung. Da soll ich verwalteten Code wärend der Sperre für das Betriebsystemladeprogramm gestartet haben... Was? Ich prüfe doch nur die Länge des Texts.
Selber etwas rumprobiert und nix gefunden. Und dann im Internet gesucht. Die Lösung des Problems ist so absurd, dass man da nie drauf kommt. Es liegt an iTunes. Dem von Apple. Genau. Dem Musikprogramm. Und zwar (bei mir) in der Version 7.1.1.5. Wenn iTunes geladen ist (egal ob Musik läuft oder nicht), dann kommt dieser Fehler. Und wenn man iTunes beendet, dann kommt der Fehler nicht mehr. Jetzt liegts wahrscheinlich nicht direkt an iTunes, sondern an irgendeiner Windows-Merkwürdigkeit...
Mit einer neuern Version von iTunes (7.2) soll der Fehler nicht mehr auftreten. Aber das muss ich erst noch testen.
Ich habe in VB 2005 eine Anwendung entwickelt (eigentlich bin ich noch dabei...) und habe ein weiteres Formular hinzugefügt. Dieses Formular enthält 2 Textboxen und 2 Buttons (Abbrechen und OK). Jetzt soll der Button OK aber erst enabled sein, wenn in beiden Textboxen was drin steht und in der zweiten Textbox der Text genau 10 Zeichen lang ist. Soweit eigentlich recht einfach. Das Formular wird über ShowDialog() aufgerufen (bei Show() passiert aber genau das gleiche).
Ich starte meine Anwendung, öffne das Formular und tippe etwas in die erste Textbox. Und beim ersten Buchstaben erhalte ich eine "LoaderLock wurde erkannt"-Fehlermeldung. Da soll ich verwalteten Code wärend der Sperre für das Betriebsystemladeprogramm gestartet haben... Was? Ich prüfe doch nur die Länge des Texts.
Selber etwas rumprobiert und nix gefunden. Und dann im Internet gesucht. Die Lösung des Problems ist so absurd, dass man da nie drauf kommt. Es liegt an iTunes. Dem von Apple. Genau. Dem Musikprogramm. Und zwar (bei mir) in der Version 7.1.1.5. Wenn iTunes geladen ist (egal ob Musik läuft oder nicht), dann kommt dieser Fehler. Und wenn man iTunes beendet, dann kommt der Fehler nicht mehr. Jetzt liegts wahrscheinlich nicht direkt an iTunes, sondern an irgendeiner Windows-Merkwürdigkeit...
Mit einer neuern Version von iTunes (7.2) soll der Fehler nicht mehr auftreten. Aber das muss ich erst noch testen.
Mittwoch, 23. Januar 2008
PHP iCalWriter
Ich hatte einen kleinen Auftrag. Dabei sollten aus einer selbstgebauten Terminverwaltung die Daten als iCalender-Datei (*.ics) exportiert werden. Bei der Suche nach einer schon existierenden, guten Lösung mußte ich aber feststellen, dass dies nicht der Fall war. Die einzige schon vorhandene Lösung ist iCalCreator. Obwohl dies auf den ersten Blick recht gut aussieht, stellt man fest, dass man sich sehr detailiert mit RFC 2445 (darin wird das iCalender-Dateiformat beschrieben) befassen muss, um dieses Tool einsetzen zu können.
Deswegen habe ich mich selber daran gemacht, PHP-Klassen zu schreiben, mit denen der Export in iCalender auch ohne genaue Kentniss der RFC geht. Gehostet wird das ganze bei sourceforge.net. Eine kleine Erklärung (auf Englisch) ist hier zu finden. Ich hoffe, dass das Tool vielen Leuten eine Hilfe ist und sich auch einige an der Entwicklung beteiligen. Als Lizenz kommt die GNU Lesser Public License zum Einsatz.
Deswegen habe ich mich selber daran gemacht, PHP-Klassen zu schreiben, mit denen der Export in iCalender auch ohne genaue Kentniss der RFC geht. Gehostet wird das ganze bei sourceforge.net. Eine kleine Erklärung (auf Englisch) ist hier zu finden. Ich hoffe, dass das Tool vielen Leuten eine Hilfe ist und sich auch einige an der Entwicklung beteiligen. Als Lizenz kommt die GNU Lesser Public License zum Einsatz.
Freitag, 11. Januar 2008
Visual Basic: Generic Dictionary von Hand durchlaufen
Dictionaries sind toll. Man kann damit die Bedeutung von Wörtern aus anderen Sprachen herausfinden. Aber natürlich sind diese Wörterbücher hier garnicht gemeint. Es geht um die in VB 2005 enthaltenen Generics. Diese haben das Ziel, gleiche Elemente in Listen zusammenzufassen (ähnlich Collections), bieten aber gegenüber Collections, Arrays oder selber geschriebenen Listen einiges an Komfort und Sicherheit. Es gibt mehrere Arten von Generics, darunter das Dictionary. In diesem Dictionary wird mit jedem Wert ein Schlüssel verknüpft (Key->Value - Paare). Der Wert kann dabei jeder beliebige Datentyp und natürlich auch ein Objekt sein. Erstellt wird das ganze über:
Der Schlüssel ist damit ein String (er könnte auch eine Zahl oder ein anderer Datentyp sein) und die Werte sind vom Typ CBeispiel, welches eine Beispiel-Klasse sein soll (der Inhalt der Klasse ist egal). Werte hinzufügen ist ganz einfach:
beispiel1 muss natürlich ein Objekt der Klasse CBeispiel sein. Auch das Abrufen ist sehr einfach:
Sehr schön gelöst ist das durchlaufen aller Werte in einer Schleife. Mit Foreach kann man hier sehr einfach alle Elemente durchlaufen und bearbeiten:
Dabei wird das gesamte Dictionary hintereinander durchlaufen.
So weit so gut und schön. Aber was passiert, wenn man nicht auf einmal das gesamte Dictionary durchlaufen will. Sondern z.B. durch einen Timer gesteuert immer das nächste Element haben möchte. Dann ist For Each nicht das richtige. Allerdings kann man sich die For Each zugrunde liegende Struktur zunutze machen. Diese heißt Enumerator und ist auch ohne For Each einsetzbar. Zuerst muss ein entsprechender Enumerator erstellt werden:
Damit wird der Enumerator erstellt und er ist jetzt mit dem Dictionary myDic "verbunden". Mit myEnumerator.MoveNext kann ich zum nächsten Eintrag im Dictionary gehen und mit myEnumerator.Current() kann ich auf den aktuellen Wert zugreifen. Dabei gibts aber noch ein paar Stolperfallen:
Die Prüfung, ob MoveNext noch ein nächste Element gefunden hat, ist glücklicherweise sehr einfach. Wenn keine weiteren Elemente vorhanden sind, dann gibt MoveNext nämlich false zurück.
Mit diesen paar Zeilen Code kann man sehr schön selber durch das Dictionary wandern und ist nicht auf For Each angewiesen (was aber oft seine Berechtigung hat).
dim myDic as As New System.Collections.Generic.Dictionary(Of String, CBeispiel)Der Schlüssel ist damit ein String (er könnte auch eine Zahl oder ein anderer Datentyp sein) und die Werte sind vom Typ CBeispiel, welches eine Beispiel-Klasse sein soll (der Inhalt der Klasse ist egal). Werte hinzufügen ist ganz einfach:
myDic.add ("Schluessel1", beispiel1)beispiel1 muss natürlich ein Objekt der Klasse CBeispiel sein. Auch das Abrufen ist sehr einfach:
beispiel1 = myDic.Item ("Schluessel1")Sehr schön gelöst ist das durchlaufen aller Werte in einer Schleife. Mit Foreach kann man hier sehr einfach alle Elemente durchlaufen und bearbeiten:
For Each kvp As KeyValuePair(Of String, CBeispiel) In myDic
kvp.Value ' enthält den Wert
kvp.Key ' enthält den Schlüssel
Next kvpDabei wird das gesamte Dictionary hintereinander durchlaufen.
So weit so gut und schön. Aber was passiert, wenn man nicht auf einmal das gesamte Dictionary durchlaufen will. Sondern z.B. durch einen Timer gesteuert immer das nächste Element haben möchte. Dann ist For Each nicht das richtige. Allerdings kann man sich die For Each zugrunde liegende Struktur zunutze machen. Diese heißt Enumerator und ist auch ohne For Each einsetzbar. Zuerst muss ein entsprechender Enumerator erstellt werden:
Dim myEnumerator As System.Collections.Generic.Dictionary(Of String, CBeispiel).Enumerator
myEnumerator = myDic.GetEnumeratorDamit wird der Enumerator erstellt und er ist jetzt mit dem Dictionary myDic "verbunden". Mit myEnumerator.MoveNext kann ich zum nächsten Eintrag im Dictionary gehen und mit myEnumerator.Current() kann ich auf den aktuellen Wert zugreifen. Dabei gibts aber noch ein paar Stolperfallen:
- Die Reihenfolge, in der die Elemente kommen, ist nicht festgelegt.
- Nach der Erstellung des Enumerators ist seine Position vor dem ersten Element. Man muss also zuerst MoveNext aufrufen, bevor man mit Current() auf den ersten Eintrag zugreifen kann.
- Wenn das Ende des Dictionaries erreicht ist, dann geht es nicht von Vorne wieder los. Man muss diesen Fall selber prüfen.
Die Prüfung, ob MoveNext noch ein nächste Element gefunden hat, ist glücklicherweise sehr einfach. Wenn keine weiteren Elemente vorhanden sind, dann gibt MoveNext nämlich false zurück.
If myEnumerator.MoveNext ThenMit diesen paar Zeilen Code kann man sehr schön selber durch das Dictionary wandern und ist nicht auf For Each angewiesen (was aber oft seine Berechtigung hat).
Freitag, 7. Dezember 2007
PHP: Eigenen Script-Namen und übergebene Parameter ermitteln
In PHP gibt es eine Menge an Informationen, die man sich zu nutze machen kann. Einige davon stecken in der Variablen $_SERVER. Auf zwei solcher Informationen möchte ich hier kurz eingehen.
Die erste Info ist der eigene Scriptname. Diesen ermittelt man mittels
Allerdings liefert dies keine evtl. per GET übergebenen Parameter an das Script. Diese stehen in
Um also den kompletten Script-Namen mit allen Parametern zu erhalten genügt folgende Angabe:
Wofür kann das nützlich sein? Oft hat man Seiten mit Logins. Wenn man sich jetzt einloggt, dann möchte man aber immer wieder auf die selbe Seite kommen und nicht nach dem Einloggen auf der Startseite landen. Ich kann also dem Login-Formular den Script-Namen mit Parametern mitgeben (in einem hidden-Feld) und nach erfolgreichem Login zur entsprechenden Seite weiterleiten.
Dabei gibt es noch eine Stolperfalle: Wenn meine Logout-Seite auch die Möglichkeit zum Login bietet, dann darf ich natürlich nicht gleich wieder zur Logout-Seite weiterleiten. Ansonsten logge ich mich ja sofort wieder aus. Hier bietet sich eine Weiterleitung zur Startseite an.
Die erste Info ist der eigene Scriptname. Diesen ermittelt man mittels
$script = $_SERVER['PHP_SELF']; Normalerweise liefert dies aber auch noch den Pfad zum Script mit zurück. Wenn man diese nicht benötigt, dann kann man durch basename() nur den eigentlichen Namen zurückgeben.$script = basename($_SERVER['PHP_SELF']);Allerdings liefert dies keine evtl. per GET übergebenen Parameter an das Script. Diese stehen in
$_SERVER['QUERY_STRING'];Um also den kompletten Script-Namen mit allen Parametern zu erhalten genügt folgende Angabe:
$script=basename($_SERVER['PHP_SELF'])."?".$_SERVER['QUERY_STRING'];Wofür kann das nützlich sein? Oft hat man Seiten mit Logins. Wenn man sich jetzt einloggt, dann möchte man aber immer wieder auf die selbe Seite kommen und nicht nach dem Einloggen auf der Startseite landen. Ich kann also dem Login-Formular den Script-Namen mit Parametern mitgeben (in einem hidden-Feld) und nach erfolgreichem Login zur entsprechenden Seite weiterleiten.
Dabei gibt es noch eine Stolperfalle: Wenn meine Logout-Seite auch die Möglichkeit zum Login bietet, dann darf ich natürlich nicht gleich wieder zur Logout-Seite weiterleiten. Ansonsten logge ich mich ja sofort wieder aus. Hier bietet sich eine Weiterleitung zur Startseite an.
Montag, 26. November 2007
PHP: Das Alter einer Person ermitteln
Der letzte Eintrag ist schon ne Weile her, aber jetzt bin ich mal wieder über ein kleines Problem gestolpert. Wie ermittle ich in PHP das Alter einer Person? (oder von irgend etwas Anderem?)
Meine erste Idee war der Einsatz von Unix-Timestamps. Dies stellt ja die Sekunden seit dem 01.01.1970 dar. Ich könnte also vom aktuellen Timestamp ($jetzt) den Timestamp des Geburtstages ($geb) abziehen. Das Ergebnis müßte ich dann nur durch die Anzahl der Sekunden pro Jahr teilen, um die Anzahl an Jahren zu ermitteln:
60*60*24*365 bedeutet:
Gibt dabei aber zwei Probleme:
Deswegen muss eine andere Lösung her. Und hier ist sie:
Hier sind Geburtsdaten vor 1970 kein Problem und es werden auch alle Schaltjahre korrekt berücksichtig.
Meine erste Idee war der Einsatz von Unix-Timestamps. Dies stellt ja die Sekunden seit dem 01.01.1970 dar. Ich könnte also vom aktuellen Timestamp ($jetzt) den Timestamp des Geburtstages ($geb) abziehen. Das Ergebnis müßte ich dann nur durch die Anzahl der Sekunden pro Jahr teilen, um die Anzahl an Jahren zu ermitteln:
$alter = ($jetzt-$geb) / (60*60*24*365);60*60*24*365 bedeutet:
- 60 Sekunden = 1 Minute
- 60 Minuten = 1 Stunde
- 24 Stunden = 1 Tag
- 365 Tage = 1 Jahr
Gibt dabei aber zwei Probleme:
- Was ist mit Geburtstagen vor dem Jahr 1970?
- Was ist mit Schaltjahren? Alle 4 Jahre (grob gesagt) hat ein Jahre ja nicht 365 sondern 366 Tage. Die Berechnung wäre also nicht komplett korrekt.
Deswegen muss eine andere Lösung her. Und hier ist sie:
// Ermittelt aus dem String $gebDatum das Alter
// Der String muss dabei im deutschen Format (dd.mm.jjjj) vorliegen
function alter($gebDatum)
{
$tag = substr($gebDatum, 0, 2);
$monat = substr($gebDatum, 3, 2);
$jahr= substr($gebDatum, 6);
$now = getdate();
$age = $now['year'] - $jahr;
if ($now['mon'] < $monat || ($now['mon'] == $monat && $now['mday'] < $tag))
$age--;
return $age;
}Hier sind Geburtsdaten vor 1970 kein Problem und es werden auch alle Schaltjahre korrekt berücksichtig.
Mittwoch, 19. September 2007
PHP: Die Ergebnisse einer MySQL-Abfrage mehrmals durchlaufen
So ne Datenbank ist schon was tolles. Man stellt seine Abfrage und bekommt die richtigen Daten zurück (wenn die Abfrage richtig war...). Ganze einfache Geschichte.
Nachdem man mit diesem Code durch ist, hat man alle Ergebnisse einmal durchlaufen.
Manchmal ist es aber nötig, die Ergebnisse noch ein zweites Mal zu durchlaufen. Z.B. weil man in einer PHP-Datei die Daten an zwei verschiedenen Stellen auswerten muss und es sehr umständlich wäre, alle Auswertungen gleich an der ersten Stelle zu machen. Die naheliegenste Lösung wäre, die Abfrage einfach nochmals auszuführen. Das geht natürlich. Ist aber nicht wirklich effektiv, weil die Abfrage ja schonmal ausgeführt wurde. Warum genau das Gleiche nochmal machen?
Eine bessere Lösung ist die, das Ergebnis-Set so zurückzusetzen, dass man nochmal von vorne Anfangen kann. PHP bietet diese Möglichkeit mit dem Befehl mysql_data_seek(). Damit kann man den Zeiger im Ergebnis-Set an eine beliebige Stelle - auch an den Anfang - setzen. Der Anfang lautet dabei nicht 1, sondern 0!
Jetzt kann ich mein Ergebnis-Set $ergebnis nochmal mit der While-Schleife durchlaufen.
$ergebnis = mysql_query("select a1, a2, a3 from Test");
if (@mysql_num_rows($ergebnis)>0)
{
while ($zeile=mysql_fetch_row($ergebnis))
{
// Mache was mit dem Ergebnis
}
}
else
{
// Fehlermeldung weil keine Ergebnise
}Nachdem man mit diesem Code durch ist, hat man alle Ergebnisse einmal durchlaufen.
Manchmal ist es aber nötig, die Ergebnisse noch ein zweites Mal zu durchlaufen. Z.B. weil man in einer PHP-Datei die Daten an zwei verschiedenen Stellen auswerten muss und es sehr umständlich wäre, alle Auswertungen gleich an der ersten Stelle zu machen. Die naheliegenste Lösung wäre, die Abfrage einfach nochmals auszuführen. Das geht natürlich. Ist aber nicht wirklich effektiv, weil die Abfrage ja schonmal ausgeführt wurde. Warum genau das Gleiche nochmal machen?
Eine bessere Lösung ist die, das Ergebnis-Set so zurückzusetzen, dass man nochmal von vorne Anfangen kann. PHP bietet diese Möglichkeit mit dem Befehl mysql_data_seek(). Damit kann man den Zeiger im Ergebnis-Set an eine beliebige Stelle - auch an den Anfang - setzen. Der Anfang lautet dabei nicht 1, sondern 0!
mysql_data_seek($ergebnis, 0);Jetzt kann ich mein Ergebnis-Set $ergebnis nochmal mit der While-Schleife durchlaufen.
Donnerstag, 9. August 2007
ASP.NET mit Visual Studio 2005
Ich hab jetzt schon seit einigen Tagen mit einem ASP.NET 2.0 Projekt zu tun. Ursprünglich ging es nur darum, die Datenbank von MS SQL-Server 2005 auf MS SQL-Server 2000 zu portieren, was nicht so ganz ohne Tücken ist. Und dann kamen noch hier und dort weitere Kleinigkeiten, die zu ändern sind. Ist ne ganze Menge Arbeit und nicht immer einfach.
Was mich mittlerweile wirklich nervt, ist das Visual Studio keine Beziehung zwischen der Entwurfsansicht und dem Quellcode herstellt. Oder zumindest (wenn denn eine Beziehung vorhanden ist), diese nicht nutzt. Mal angenommen ich ändere im Quellcode eine Webseite (abcd.aspx) etwas und gehe dann in die Entwurfsansicht, um mir die Änderung anzusehen. Das funktioniert natürlich. Wenn ich jetzt aber wieder zurück in den Quellcode der Webseite gehe, dann ist der Cursor immer am Anfang der Seite. Immer. Und ich muss dann erst wieder den ganze Quellcode durchscrollen, um an die gewünschte Stelle zu kommen.
Warum kann Visual Studio sich nicht merken, an welcher Stelle ich zuletzt im Quellcode war? Kann doch nicht so schwer sein, oder?
Oder noch besser wäre folgendes: Wenn ich in der Entwurfsansicht ein Objekt anklicke und dann in den Quellcode wechsle, dann springt der Cursor automatisch an die Stelle, wo der Code des Objekts beginnt. Das würde die Arbeit echt erleichtern, weil es das ständige Quellcode-Durchsuchen erspart.
Wahrscheinlich möchte Microsoft, dass man möglichst garnicht im Quellcode arbeitet und alles nur in der Entwurfsansicht macht. Aber manche Sachen gehen halt im Quellcode einfach schneller.
Was mich mittlerweile wirklich nervt, ist das Visual Studio keine Beziehung zwischen der Entwurfsansicht und dem Quellcode herstellt. Oder zumindest (wenn denn eine Beziehung vorhanden ist), diese nicht nutzt. Mal angenommen ich ändere im Quellcode eine Webseite (abcd.aspx) etwas und gehe dann in die Entwurfsansicht, um mir die Änderung anzusehen. Das funktioniert natürlich. Wenn ich jetzt aber wieder zurück in den Quellcode der Webseite gehe, dann ist der Cursor immer am Anfang der Seite. Immer. Und ich muss dann erst wieder den ganze Quellcode durchscrollen, um an die gewünschte Stelle zu kommen.
Warum kann Visual Studio sich nicht merken, an welcher Stelle ich zuletzt im Quellcode war? Kann doch nicht so schwer sein, oder?
Oder noch besser wäre folgendes: Wenn ich in der Entwurfsansicht ein Objekt anklicke und dann in den Quellcode wechsle, dann springt der Cursor automatisch an die Stelle, wo der Code des Objekts beginnt. Das würde die Arbeit echt erleichtern, weil es das ständige Quellcode-Durchsuchen erspart.
Wahrscheinlich möchte Microsoft, dass man möglichst garnicht im Quellcode arbeitet und alles nur in der Entwurfsansicht macht. Aber manche Sachen gehen halt im Quellcode einfach schneller.
« vorherige Seite
(Seite 2 von 4, insgesamt 47 Einträge)
nächste Seite »
