Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 12 Web Services
  gp 12.1 Services_Google
  gp 12.2 Services_Amazon
  gp 12.3 Services_Weather
    gp 12.3.1 weather.com
    gp 12.3.2 Globalweather
  gp 12.4 Services_Ebay


Rheinwerk Computing

12.3 Services_Weather  downtop


Besprochene Version: 1.3.1 Lizenz: PHP-Lizenz 2.02
Klassendatei(en): Services/Weather.php

Sie wollten schon immer mal wissen, welches Wetter draußen ist, ohne aus dem Fenster gucken zu müssen? Services_Weather gibt Ihnen die Möglichkeit dazu. Das Paket kann bei vier verschiedenen Anbietern Informationen zum aktuellen Wetter und auch Vorhersagen abrufen. Die Daten können via Ejse, METAR, weather.com und Globalweather übernommen werden.

Da Ejse zurzeit nur Wetterdaten für die USA liefert, werde ich nicht darauf eingehen.

Für jeden der Informationsanbieter ist eine eigene Klasse definiert, die eine Erweiterung der Klasse Services_Weather_Common darstellt. Um ein Objekt dieser Klassen abzuleiten, ist in der Klasse Services_Weather die statische Methode service() definiert. Diese bekommt den Namen des gewünschten Services übergeben und liefert das entsprechende Objekt zurück. Für Ejse übergeben Sie den String 'ejse', für METAR die Konstante 'metar', für Globalweather den Wert 'globalweather' und für den Anbieter weather.com den String 'weatherdotcom'.

In dieser Klasse sind einige allgemein gültige Methoden definiert, die in jeder Klasse zur Verfügung stehen. Daher werde ich diese Methoden zuerst erläutern.

Der erste Satz der Methoden dient dazu, Informationen zu berechnen, die durch die Dienstanbieter nicht immer zurückgeliefert werden. So kann die Methode calculateDewPoint() den Taupunkt berechnen. Dazu benötigt sie die Temperatur in Grad Celsius und die relative Luftfeuchtigkeit in Prozent. Die Berechnung erfolgt auf Basis der Magnus-Formel, wobei der Sättigungsdampfdruck über Wasser ermittelt wird.

Um auf Basis von Temperatur und Taupunkt die relative Luftfeuchtigkeit zu bestimmen, ist die Methode calculateHumidity() vorgesehen, die als ersten Wert die Temperatur und als zweiten den Taupunkt übergeben bekommt.

Der Wind-Chill-Faktor, also die »gefühlte Kälte«, wird von der Methode calculateWindChill() ermittelt. Sie bekommt die Temperatur sowie die Windgeschwindigkeit übergeben. Achtung: Die Temperatur ist in diesem Fall in Grad Fahrenheit und die Windgeschwindigkeit in Meilen pro Stunde (mph) anzugeben.

Wie Sie an dieser Methode schon erkennen können, haben Sie es bei der Ermittlung von Wetterdaten mit den verschiedensten Maßeinheiten zu tun. Daher ist außerdem ein Satz von Funktionen definiert, mit denen Sie Daten von einer Maßeinheit in eine andere konvertieren können.

convertDistance() dient dazu, eine Entfernung von einer Einheit in eine andere umzurechnen. Als ersten Wert müssen Sie hier die Strecke angeben. Der zweite Wert ist die Maßeinheit, in der die Entfernung angegeben wurde, und der dritte Wert ist die Einheit, in der die Ausgabe erfolgen soll. Um die Einheit anzugeben, stehen 'm' für Meter, 'km' für Kilometer, 'ft' für Fuß und 'sm' für Meilen (Statue Mile/Landmeile) zur Verfügung.

Um einen (Luft-)Druck von einem System in ein anderes umzurechnen, können Sie convertPressure() nutzen. Auch hier wird der ursprüngliche Wert zuerst übergeben. Danach folgen die Maßeinheiten für die Quell- und die Ziel-Einheit. Als Einheiten können Sie 'in' (Inch Hg / Inch Quecksilber), 'hpa' (Hektopascal), 'mb' (Millibar), 'mm' (Millimeter Hg / Millimeter Quecksilber) und 'atm' (Atmosphären) angeben.

Natürlich können Sie auch Geschwindigkeiten umrechnen, wozu convertSpeed() gedacht ist. Die Geschwindigkeit, die als erster Parameter angegeben wird, wird von der Maßeinheit, die als zweiter Parameter angegeben wird, in die konvertiert, die als dritte angegeben wird. Als Maßeinheiten unterstützt die Methode 'mph' (Meilen pro Stunde), 'kmh' (Kilometer pro Stunde), 'kt' (Knoten), 'mps' (Meter pro Sekunde) und 'fps' (Fuß pro Sekunde). Des Weiteren können Sie als Ziel noch 'bft' angeben. Hiermit erfolgt die Ausgabe in der Maßeinheit Beaufort, die auf Deutsch auch oft als »Windstärke« bezeichnet wird. Beaufort kann nicht als Quelle genutzt werden, da es dabei nur eine Abstufung von 0 [Einige Quellen sprechen auch davon, dass die Skala von 1 bis 12 geht, da 0 Windstille bedeutet und somit auch keine Windstärke gemessen werden kann. ] bis 12 Windstärken gibt. Somit handelt es sich nicht um eine exakte Einheit, die wieder zurückgerechnet werden kann. Wenn Sie 'bft' als Quelle angeben, gibt die Methode false zurück.

Die letzte Konvertierungsmethode kann eine Temperatur von Grad Celsius nach Fahrenheit umrechnen und umgekehrt. Hierzu benötigt convertTemperature() als ersten Parameter die Grad-Angabe. Die Einheiten können Sie in diesem Fall über 'f' für Fahrenheit und 'c' für Celsius definieren.

Lesen Sie Daten bei einem der Wetterdienste aus, werden diese natürlich in einer Maßeinheit zurückgegeben. Um zu definieren, welche Maßeinheiten Sie zur Rückgabe der Werte bevorzugen, können Sie die Methode setUnitsFormat() nutzen. Wenn Sie ihr 'standard' übergeben, werden alle Werte im angloamerikanischen System (Meilen, Fuß, Fahrenheit, …) zurückgegeben. Mit dem Wert 'metric' geben die Methoden die Werte in metrischen Einheiten zurück. Die dritte Variante ist, dass Sie 'custom' und ein Array übergeben, das definiert, welche Einheiten zu nutzen sind:

$obj->setUnitsFormat("custom", array( 
                     "wind"   => "kt", 
                     "vis"    => "km", 
                     "height" => "ft", 
                     "temp"   => "c", 
                     "pres"   => "hpa", 
                     "rain"   => "in"));

Der Schlüssel wind definiert, in welcher Einheit die Windgeschwindigkeit ausgegeben werden soll. vis ist die Abkürzung für Visibility, also die Sichtweite. height bezieht sich auf Höhenangaben (Wolken), temp auf die Temperatur, pres auf den Luftdruck, und die Maßeinheit der Niederschlagsmenge wird mit rain verändert.

Möchten Sie wissen, welche Maßeinheiten genutzt werden, können Sie diese mit getUnitsFormat() auslesen. Die Methode liefert ein Array mit den Schlüsseln zurück, die bei setUnitsFormat() erläutert werden.

Wie Datum und Uhrzeit formatiert werden, können Sie über die Methode setDateFormat() bestimmen. Diese akzeptiert zwei Strings, von denen der erste für das Datum und der zweite für die Uhrzeit zuständig ist. Die Strings können Sie entsprechend der Vorgaben für die Methode date() aufbauen. Diese finden Sie unter http://de.php.net/date.

Sinnvoll ist in den meisten Fällen auch ein Aufruf der Methode setCache(). Diese schaltet das Caching für die Wetterdaten ein, so dass diese nicht bei jedem Aufruf abgefragt werden müssen. Der Methode können zwei Parameter übergeben werden, von denen der erste den Typ des Caches und der zweite die Optionen beschreibt. Weitere Informationen hierzu finden Sie in Abschnitt 13.2 über PEAR::Cache.


Rheinwerk Computing

12.3.1 weather.com  downtop

Um den Service von weather.com nutzen zu können, benötigen Sie eine Partner-ID und einen Lizenzschlüssel. Diese können Sie kostenlos unter der URL http://www.weather.com/services/xmloap.html beantragen. Als Bestätigung Ihrer Registrierung erhalten Sie eine E-Mail, in der Ihnen die Daten mitgeteilt werden. Des Weiteren ist in der E-Mail ein Link enthalten, unter dem Sie das Software Developers Kit (SDK) herunterladen können. Dieses benötigen Sie, wenn Sie die Wetterdaten mit den grafischen Symbolen aufwerten wollen, die hierin enthalten sind. In den Unterverzeichnissen 32x32, 64x64 und 128x128 finden Sie jeweils identische PNG-Dateien in unterschiedlichen Größen.

Bitte beachten Sie auch die Nutzungsbedingungen, die Sie in der Datei guide.pdf finden.

Um Wetterdaten zu einem bestimmten Ort zu beziehen, müssen Sie als Erstes prüfen, ob weather.com Daten zu diesem Ort bereitstellt. Leider können Sie über die XML-Schnittstelle deutlich weniger Orte abfragen als über die deutsche Webseite (de.weather.com). Des Weiteren scheint es auch keine Liste zu geben, die aufführt, welche Orte verfügbar sind und welche nicht, so dass Sie an dieser Stelle nur mit Ausprobieren weiterkommen. Erfahrungsgemäß sind große und – aus Sicht eines Amerikaners – bekannte Städte verfügbar.

Um einen Ort zu finden, nutzen Sie die Methode searchLoaction(). Sie bekommt den Namen der Stadt, gefolgt von einem Komma und dem Land, übergeben und liefert eine ID zurück. Konnte der Ort nicht gefunden werden, liefert die Methode false zurück. Suchen Sie einen Ort in den USA, kann es schnell passieren, dass Ihre Suchabfrage nicht eindeutig ist. In diesem Fall gibt die Methode ein Array mit möglichen Orten zurück.

Um die ID von Hamburg herauszufinden, würde die Abfrage so lauten:

$id = $weather->searchLocation("Hamburg, Germany");

Die Nutzung von Umlauten ist übrigens unproblematisch. Mit "Düsseldorf, Germany" erhalten Sie die Daten zu Düsseldorf. Kann der Ort nicht gefunden werden, liefert die Methode einen Services_Weather-Error zurück. Hierbei handelt es sich um eine Klasse, die von PEAR_Error abgeleitet ist. Der Fehlercode entspricht in diesem Fall der Konstante SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION, wobei aber auch andere Fehler auftreten können.

Mit der zurückgelieferten ID können Sie dann die Methoden getLocation(), getWeather() und getForecast() bestücken. Alle Methoden liefern Ihnen Arrays mit den ermittelten Daten zurück. Jedes dieser Arrays verfügt über das Element 'cache', in dem entweder 'MISS' oder 'HIT' enthalten ist. Im ersten Fall kommen die Daten »frisch« vom Server und im zweiten aus dem Cache.

getLocation() liefert allgemeine Informationen zu dem Ort zurück. Das Array beinhaltet die Schlüssel aus Tabelle 12.3.


Tabelle 12.3 Informationen zum Ort
Schlüssel Erläuterung
name Name des Ortes, wie er bei weather.com genutzt wird
time Lokale Uhrzeit
latitude Breitengrad
longitude Längengrad
sunrise Sonnenaufgang
sunset Sonnenuntergang
timezone Zeitzone (Unterschied zu UTC)

Mit getWeather() erhalten Sie die Daten zum aktuellen Wetter am gewünschten Ort, wobei das Array die Schlüssel aus Tabelle 12.4 enthält.


Tabelle 12.4 Angaben zum aktuellen Wetter
Schlüssel Erläuterung
update Datum und Uhrzeit, wann die Daten aktualisiert wurden. Die Formatierung erfolgt entsprechend der Vorgaben von setDateTime- Format().
updateRaw Datum und Uhrzeit der Aktualisierung im ursprünglichen Format
station Ortsname
temperature Aktuelle Temperatur
feltTemperature Gefühlte Temperatur (Wind-Chill-Faktor)
condition Textuelle Beschreibung des Wetters auf Englisch
conditionIcon Nummer des Icons für die bildliche Darstellung des Wetters
pressure Luftdruck
pressureTrend Entwicklung des Luftdrucks auf Englisch (steady, rising, …)
wind Windgeschwindigkeit
windGust Geschwindigkeit von Böen
windDegrees Windrichtung in Grad
windDirection Windrichtung als Himmelsrichtung (englische Angabe – N, S, E, W, NNE, ENE etc.)
humidity Luftfeuchtigkeit in Prozent
visibility Sichtweite
uvIndex UV-Index
uvText UV-Index als englischer Text
dewPoint Taupunkt

Die dritte Methode im Bunde, getForecast(), bekommt als ersten Parameter auch den Code der Stadt übergeben. Übergeben Sie keinen zweiten Parameter, gibt die Methode die Vorhersage für die nächsten zwei Tage zurück. Sie können als zweiten Parameter aber eine Zahl zwischen 1 und 10 angeben, um zu definieren, für wie viele Tage die Vorhersage erfolgen soll.

Auch hier wird ein Array zurückgegeben, das allerdings mehrfach verschachtelt ist und sich zum großen Teil aus den Schlüsseln zusammensetzt, die auch in den anderen Arrays genutzt werden. In der ersten Dimension befinden sich die Schlüssel 'cache', 'update', 'upadateRaw' und 'days'. Unterhalb von 'days' befindet sich ein indiziertes Array, in dem für jeden Tag ein Feld enthalten ist. Jeder Tag wird hierbei wiederum durch ein assoziatives Array beschrieben. In der ersten Dimension sind in den Elementen 'temperatureHigh' und 'temperatureLow' die erwartete Maximal- und Minimaltemperatur enthalten. 'sunrise' und 'sunset' verhalten sich wie bereits beschrieben.

In den Feldern 'day' und 'night' sind zwei identisch aufgebaute Arrays enthalten, die die erwarteten Daten für Tag und Nacht enthalten. Beide bestehen aus den bereits beschriebenen Feldern 'condition', 'conditionIcon', 'wind', 'windGust', 'windDegrees', 'windDirection' und 'humidity'. Zusätzlich ist noch das Feld 'precipitation' definiert, in dem die erwartete Niederschlagsmenge enthalten ist.

require_once ('Services/Weather.php'); 
 
// Pfad, in dem die Bilder liegen 
$img_path="./weather/32x32/"; 
 
// Neues Objekt ableiten 
$weather = Services_Weather::service("WeatherDotCom"); 
 
if (true === PEAR::isError($weather)) 
{ 
    die($weatherDotCom->getMessage()); 
} 
 
// Authentifikationsdaten, hier muessen Sie die Daten eintragen, 
// die weather.com Ihnen geschickt hat 
$weather->setAccountData('1007183228', '2b0661f882b0b4b6'); 
 
$weather->setUnitsFormat("metric"); 
$weather->setDateTimeFormat("d.m.Y", "H:i"); 
 
// Stadt festlegen 
$city = $weather->searchLocation("Hamburg, Germany"); 
 
// Ist ein Fehler aufgetreten? 
if (true===Services_Weather::isError($city)) 
{ 
   if (SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION=== 
                                             $city->getCode()) 
   { 
      die ('Der Ort kann nicht gefunden werden'); 
   } 
   else 
   { 
      die($forecast->getMessage()); 
   } 
} 
 
// Ortsdaten holen 
$data_loc = $weather->getLocation($city); 
if (true===Services_Weather::isError($data_loc)) 
{ 
      die ($data_loc->getMessage()); 
} 
 
// Aktuelles Wetter holen 
$data_weather = $weather->getWeather($city); 
if (true===Services_Weather::isError($data_weather)) 
{_$ret_      die ($data_weather->getMessage()); 
} 
 
// Vorhersage fuer 2 Tage holen 
$data_forecast = $weather->getForecast($city,2); 
if (true===Services_Weather::isError($data_forecast)) 
{ 
      die ($data_forecast->getMessage()); 
} 
 
// Daten ausgeben 
echo '<table border="1"><tr><td colspan="3">'; 
 
// Ortsinformationen 
echo "Daten f&uuml;r: $data_loc[name], 
      Breitengrad:$data_loc[latitude], 
      L&auml;ngengrad: $data_loc[longitude], 
      Daten vom: $data_weather[update]"; 
echo '</td></tr><tr><td>'; 
 
// Wetterdaten fuer den aktuellen Tag 
echo "<table><tr><td> 
   <img src='$img_path{$data_weather['conditionIcon']}.png' /> 
      </td> 
      <td> 
      Daten f&uuml;r Heute <br /> 
      Temperatur: $data_weather[temperature] C<br> 
      Luftdruck: $data_weather[pressure] mb<br /> 
      Wind: $data_weather[wind] km/h<br /> 
      Windrichtung:$data_weather[windDegrees] Grad<br /> 
      Sichtweite: $data_weather[visibility] km<br /> 
      </td></tr></table> 
      </td>"; 
 
// Vorhersage in Schleife ausgeben 
foreach ($data_forecast['days'] as $day) 
{ 
   echo "<td> 
      <table><tr><td> 
      <table><tr><td>Tag:</td><td> 
     <img src='$img_path{$day['day']['conditionIcon']}.png' /> 
      </td></tr></table> 
      <br /> 
      <table><tr><td>Nacht:</td><td> 
   <img src='$img_path{$day['night']['conditionIcon']}.png' /> 
      </td></tr></table> 
      </td> 
      <td> 
      Temperatur: $day[temperatureHigh]C 
                  bis $day[temperatureLow] C<br> 
      Wind Tag: {$day['day']['wind']} km/h<br /> 
      Windrichtung Tag: {$day['day']['windDegrees']} 
                                        Grad<br /> 
      Wind Nacht: {$day['night']['wind']} km/h<br /> 
      Windrichtung Nacht: {$day['night']['windDegrees']} Grad<br /> 
      </td></tr></table> 
      </td>"; 
} 
echo '</tr></table>';

Listing 12.5 Auslesen von Wetterdaten bei weather.com

Abbildung 12.4 Ausgabe der Wetterdaten von weather.com


Rheinwerk Computing

12.3.2 Globalweather  toptop

Globalweather ist ein Service der Firma CapeScience. Allerdings ist die Eigenleistung von CapeScience recht gering. CapeScience übernimmt nur fertige METAR-Daten von der NOAA (National Oceanic and Atmospheric Administration). Die Abkürzung METAR steht für »Meteorological Aerodrome Report« bzw. in der englischen Version für »Meteorological Aviation Routine« und bezeichnet Wetterbeobachtungen von Flugplätzen. [Zwar sieht das Paket eine Methode vor, um eine Vorhersage auszulesen, zurzeit liefert sie aber immer false. Ob es sich um einen Bug handelt oder ob eine Vorhersage nicht mehr verfügbar ist, konnte ich leider nicht in Erfahrung bringen. ] CapeScience ruft die METAR-Daten einmal stündlich bei der NOAA ab. Somit sind die Daten vielleicht nicht ganz so aktuell, aber Globalweather hat zwei Vorteile gegenüber METAR: Zum einen ist die Abfrage schneller, zum anderen ist die Selektion des Flughafens etwas einfacher. METAR unterstützt im Original nur Flugplatzkennungen nach dem ICAO-Standard. CapeScience unterstützt aber auch eine Abfrage mit WMO und vor allem mit den bekannten IATA/FAA-Kennzeichnungen. Die Abkürzungen nach IATA sind in der Verkehrsfliegerei üblich und entsprechen den Abkürzungen, die Sie auf einem Flugschein finden (MUC für München, HAM für Hamburg etc.). Den IATA Location Identifier Code eines Flughafens können Sie unter http://www.iata.org/ps/publications/codes/ demo.htm in Erfahrung bringen. Möchten Sie mit ICAO-Codes arbeiten, können Sie diese unter der URL http://www.airport-technology.com/icao codes/ nachschlagen.

Die Klasse kennt allerdings auch die Methode searchLocation(), mit der Sie die Kennung eines Flughafens auslesen können. Sie bekommt den Namen des gewünschten Flughafens übergeben und liefert die dazugehörige Kennung zurück.

Mit den Methoden getLocation() und getWeather() können Sie auch hier wieder Informationen zum Ort und zum aktuellen Wetter abrufen. Wie bei weather.com erwarten sie die Ortskennung als Parameter.

Das Array, das getLocation() zurückgibt, beinhaltet die Schlüssel 'name', 'latitude', 'longitude' und 'elevation'. Die ersten drei entsprechen den Schlüsseln von weather.com. Der vierte enthält die Höhe des Flugplatzes.

Auch der Rückgabewert von getWeather() entspricht weitgehend den Informationen von weather.com. Auch hier sind die Schlüssel 'update', 'updateRaw', 'station', 'wind', 'windDegrees', 'windDirection', 'visibility', 'temperature', 'feltTemperature', 'humidity' und 'pressures' vorhanden. Darüber hinaus ist in 'visQualifier' noch eine englischsprachige Definition der Sichtverhältnisse wie »Beyond« enthalten. Der Schlüssel 'clouds' beherbergt darüber hinaus noch ein indiziertes Array. Hier verweist jeder Eintrag noch einmal auf ein Array, das Informationen über die Wolkenschichten enthält. Für jede Wolkenschicht ist ein eigenes Array definiert. Jedes verfügt mindestens über die Schlüssel 'amount' und 'height'. In 'amount' ist die Menge der Wolken zu finden, die durch Begriffe wie 'few', 'scattered' oder 'broken' beschrieben wird. 'height' definiert die Höhe der Wolkenschicht. Zusätzlich kann noch ein Feld namens 'type' enthalten sein, in dem der Name des Wolkentyps, also beispielsweise CUMULONIMBUS, enthalten ist.

require_once ('Services/Weather.php'); 
 
// IATA-Code des Flughafens Hamburg 
$airport='HAM'; 
 
// Objekt ableiten und auf Fehler pruefen 
$weather = Services_Weather::service("GlobalWeather"); 
if (true===Services_Weather::isError($weather)) 
{ 
    die($weather->getMessage()); 
} 
 
// Grundeinstellungen setzen 
$weather->setUnitsFormat("metric"); 
$weather->setDateTimeFormat("d.m.Y", "H:i"); 
 
// Location-Daten auslesen 
$data_loc = $weather->getLocation($airport); 
if (true === Services_Weather::isError($data_loc)) 
{ 
   die ($data_loc->getMessage()); 
} 
 
// Wetterdaten auslesen 
$data_weather = $weather->getWeather($airport); 
if (true === Services_Weather::isError($data_loc)) 
{ 
   die ($data_loc->getMessage()); 
} 
 
// Daten ausgeben 
echo <<<EOW 
Aktuelle Wetterdaten f&uuml;r: $data_loc[name]<br /> 
Daten aktualisiert am: $data_weather[update]<br /> 
Temperatur: $data_weather[temperature] Grad Celsius<br /> 
Gef&uuml;hlte Temperatur: $data_weather[feltTemperature] 
Grad Celsius<br /> 
Luftfeuchtgkeit: $data_weather[humidity] %<br /> 
Luftdruck: $data_weather[pressure] mb<br /> 
Wolken: 
EOW; 
// Wolkenschichten ausgeben 
foreach ($data_weather['clouds'] as $clouds) 
{ 
   echo "<br />Wolkenschicht in $clouds[height] m"; 
}

Listing 12.6 Auslesen von Wetterdaten via GlobalWeather

Abbildung 12.5 Ausgabe von GlobalWeather-Wetterdaten

 <<   zurück
     
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: PHP PEAR
PHP PEAR
Jetzt Buch bestellen!
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Rheinwerk-Shop: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Rheinwerk-Shop: MySQL 5.6






 MySQL 5.6


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern