Artikel mit ‘php’ getagged

Erstellen einer Facebook-Applikation

Samstag, 27. November 2010

Wie üblich, wenn ich einem Tutorial folge, um eine Facebook-Applikation zu erstellen, erhalte ich nicht (sofort) das vom Tutorialverfasser dargestellte Ergebnis, sondern in der Regel Fehlermeldungen an verschiedenen Stellen. Offenbar gibt es zu viele verschiedene Einstellungen und Serverkonfigurationen, um ein einziges Skript überall gleich lauffähig zu bekommen. *seufz*

In diesem Fall folgte ich Emanuele Feronatos Tutorial “Create a Facebook application like “Friend interview” und stieß nach Auruf meiner index.php im Browser auf die folgende Fehlermeldung:

Parse error: parse error in /mnt/web9/52/01/5163301/htdocs/hella/facebook.php on line 4

Fatal error: Cannot instantiate non-existent class: facebook in /mnt/web9/52/01/5163301/htdocs/hella/index.php on line 5

In den Kommentaren unter Emanueles Artikel riet jemand, die Dateiendung manuell in “php5″ umzubenennen.
Nachdem ich jetzt also keine index.php, sondern eine index.php5 auf meinem Testserver liegen hatte und diese aufrief, klappte dieser Teil schon mal.

Jedoch blieb die Applikation dann wieder mit einer Fehlermeldung hängen; diesmal stammte sie von Facebook und warnte mich durch Ausgabe des Fehlercodes “API Error Code: 191″, dass die angegebene URL nicht der Applikation gehöre — WTF?
Es hat einige Zeit gekostet, herauszufinden, wie ich diesen Eisberg umschiffen kann, aber die Lösung ist glücklicherweise einfach.
Emanuele übersah es in seinem Tutorial, darauf hinzuweisen, dass unter “Edit Settings” im Facebook Developer Bereich auch unter “Web Site” Einstellungen vorgenommen werden müssen. Vielleicht klappt es bei ihm ja auch ohne, bei mir allerdings ging es mit der Applikation erst weiter, nachdem ich folgendes eingetragen hatte:

Nach diesem Schritt lief die Applikation immerhin bis zur Anzeige des Autorisierungsdialogs. Der Moment der Erleichterung währte nicht allzu lang, denn direkt anschließend bockte PHP erneut:

Fatal error: Uncaught CurlException: 60: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed thrown in /mnt/web9/52/01/5163301/htdocs/hella/facebook.php on line 612

Dieses Problem scheint der Netzgemeinde bekannt zu sein. An verschiedenen (so auch hier) Stellen wird geraten, die Datei facebook.php geringfügig zu manipulieren, um das Problem zu beheben. In meinem Fall hat es gereicht, eine Zeile Code in facebook.php einzufügen (im folgenden Skript mit !!! markiert):

/**
* Makes an HTTP request. This method can be overriden by subclasses if
* developers want to do fancier things or use something other than curl to
* make the request.
*
* @param String $url the URL to make the request to
* @param Array $params the parameters to use for the POST body
* @param CurlHandler $ch optional initialized curl handle
* @return String the response text
*/
protected function makeRequest($url, $params, $ch=null) {
if (!$ch) {
$ch = curl_init();
}

$opts = self::$CURL_OPTS;
if ($this->useFileUploadSupport()) {
$opts[CURLOPT_POSTFIELDS] = $params;
} else {
$opts[CURLOPT_POSTFIELDS] = http_build_query($params, null, '&');
}
$opts[CURLOPT_URL] = $url;
$opts[CURLOPT_SSL_VERIFYPEER] = false; // !!!

// disable the 'Expect: 100-continue' behaviour. This causes CURL to wait
// for 2 seconds if the server does not support this header.
if (isset($opts[CURLOPT_HTTPHEADER])) {
$existing_headers = $opts[CURLOPT_HTTPHEADER];
$existing_headers[] = 'Expect:';
$opts[CURLOPT_HTTPHEADER] = $existing_headers;
} else {
$opts[CURLOPT_HTTPHEADER] = array('Expect:');
}

curl_setopt_array($ch, $opts);
$result = curl_exec($ch);
if ($result === false) {
$e = new FacebookApiException(array(
'error_code' => curl_errno($ch),
'error' => array(
'message' => curl_error($ch),
'type' => 'CurlException',
),
));
curl_close($ch);
throw $e;
}
curl_close($ch);
return $result;
}

Per GD-Library generiertes JPG lässt sich nicht herunterladen

Mittwoch, 24. März 2010

Über die Verwendung der GD-Library zur Bildmanipulation gibt es ja reichlich Quellen im Internet zu finden. Dass allerdings per PHP an den Browser gesendete Bilder in bestimmten Szenarien nicht herunterladbar sein können, wird eher selten erwähnt. Eine Lösung dafür findet sich entsprechend ähnlich schwierig.
In meinem Fall hatte ich es mit einer PHP-Datei zu tun, der per POST ein Dateipfad zu einem JPG übergeben wurde, das per GD-Library-Funktionen mit einem Wasserzeichen verziert werden sollte. Das PHP-Skript wurde aus Flash aufgerufen.
Als Ergebnis eines Skriptaufrufs erhielt ich brav das JPG in einem neuen Browserfenster. Jedoch der Versuch, das Bild via Rechtsklick und “Speichern unter…” auf die Festplatte zu speichern, scheiterte. Im Speichern-Dialog war auch der Name meines PHP-Skripts als Name der zu speichernden Datei voreingetragen, nicht etwa der des JPGs.

So ähnlich sah mein Skript bis zu jenem Zeitpunkt aus (hier gekürzt):
header('Content-Type: image/jpeg');
$original_pic = 'pics/coolpicture.jpg';
$watermark = imagecreatefrompng('watermark.png');
$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
$image = imagecreatefromjpeg($original_pic);
$size = getimagesize($original_pic);
$dest_x = $size[0] - $watermark_width - 10;
$dest_y = 10; // $size[1] - $watermark_height - 5;
imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 80);
imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);
?>

Durch Einfügen folgender Zeilen erhielt ich statt eines neuen Browserfensters einen “Datei herunterladen”-Dialog, der dann immerhin die Datei unter einem festen Namen speicherbar machte:
header('Content-Disposition: attachment; filename=festerName.jpg');

Geocoding mit PHP und dem Google Maps API

Dienstag, 30. Juni 2009

Schöner Artikel zum Thema Geocoding mit PHP in Verbindung mit dem Google Maps API. Mit Downloadmöglichkeit für die besprochenen Listings.

Die im Artikel geschilderte Klasse Geocoder.php macht allerdings PHP5 und cURL-Support erforderlich.