Kategorien
Amazon MWS PHP

Cloudfusion für Amazon Italien und China

Wenn man Cloudfusion für die Product Advertising API einsetzt und Italien und China abfragen will, muss man einen kleinen Hack vornehmen. Beispiel ist für Italien, China funktioniert entsprechend.

Kategorien
MySQL PHP

MySQL PHP Umlaute/Sonderzeichen fixen UTF-8/ISO

Jeder kennt das Problem, aus irgendeinem Grund wurden Wörter in der falschen Kodierung in die Datenbank geschrieben. Wenn das passiert ist, kann man daran erkennen, dass sich Zeichen wie diese untergemischt haben:

'¦, '¨, '?, '´, '¸, 'À, 'Á, 'Â, 'Ã, 'Ä, 'Å, 'Æ, 'Ç, 'È, 'É, 'Ê, 'Ë,
'Ì, 'Í, 'Î, 'Ï, 'Ñ, 'Ò, 'Ó, 'Ô, 'Õ, 'Ö, 'Ø, 'Ù, 'Ú, 'Û, 'Ü, 'Ý, 'Þ,
'ß, 'à, 'á, 'â, 'ã, 'ä, 'å, 'æ, 'ç, 'è, 'é, 'ê, 'ë, 'ì, 'í, 'î,
'ï, 'ð, 'ñ, 'ò, 'ó, 'ô, 'õ, 'ö, 'ø, 'ù, 'ú, 'û, 'ý, 'þ, 'ÿ

Das Problem ist, dass diese Zeichen nicht utf8 kodiert worden sind, aber in utf8 dargestellt worden sind, was eine Vielzahl an Gründen haben kann.

Kategorien
Apache Webserver PHP SEO Webdeveloper Tools

Profiling mit XDebug und Webgrind

Wenn die Performance einer Webseite nachgibt, stellt man sich oft die Frage, an welche Funktion/Modul liegt der Performanceverlust? Die Lösung ist das Profiling einer Webseite.

Profiling beschäftigt sich der Analyse der Funktionsaufrufe eine Webseite. Es kann dadurch analysiert werden, welche Teile sehr lange brauchen oder welche Funtionen doppelt aufgerufen werden.

Profiling sollte nicht auf einem Produktivsystem ausgeführt werden, weil die Performance einbricht und Ausgaben sichtbar sind. Übrigends: Wer seine Webseite schneller macht, SEO optimiert gleichzeitig.

Kategorien
PHP Webdeveloper Tools

Installieren von XDebug unter Netbeans

XDebug ermöglicht es ein Programm zur Laufzeit zu debuggen und Step by Step.

Dazu sollte als erstes das folgende Tool verwendet werden für die Installation um die richtige Version zu installieren:

  1. XDebug Installations Hilfe Tool
  2. Zur Kontrolle kann nach der Installation das Tool noch mal verwendet werden und es sollte unter Xdebug installed: 2.x anzeigen
  3. php.ini Einstellungen anpassen:
    xdebug.remote_enable=onxdebug.remote_handler=dbgp
    xdebug.remote_host=localhost
    xdebug.remote_port=9000
    xdebug.remote_log=" \xampp\htdocs\xError.log"
  4. Danach sollte geteste werden, ob der Port 9000 freigegeben ist mit dem folgenden Script:
    $address = '127.0.0.1';
     $port = 9000;
     $sock = socket_create(AF_INET, SOCK_STREAM, 0);
     socket_bind($sock, $address, $port) or die('Unable to bind');
     socket_listen($sock);
     $client = socket_accept($sock);
     echo "connection established: $client";
     socket_close($client);
     socket_close($sock);
  5. Danach kann in Netbeans mit Debug Projekt (STRG+F5) und einem Breakpoint das passende Projekt debugt werden. Wenn es nicht klappt, muss die URL im Browser manuell angepasst werden:http://localhost/class.php?XDEBUG_SESSION_START=netbeans-xdebug
Kategorien
PHP

richtige Rechte für Dateien zum Speichern von Skript Input

Wenn man schreibenden Zugriff auf Dateien wie z.B. .txt oder .dat Dateien aus einem Skript heraus hat, sollten diese

  1. vom Skript angelegt worden sein, nicht manuell bei FTP. Damit ist sichergestellt , dass der Besitzer kein FTP Account ist.
  2. die Schreibrechte 644 haben, damit sie nicht von einem anderen Account überschrieben werden können oder durch den automatischen Upload einer IDE überschrieben werden.

Bsp:

if(!file_put_contents ($log_file ,""))
 {
 chmod ($log_file, 0644);
 }

So können Fehler wie dieses vermieden werden:

Warning: file_put_contents(log.txt) [function.file-put-contents]: failed to open stream: Permission denied in class.php on line x

Warning: chmod() [function.chmod]: Operation not permitted in class.php on line x

Kategorien
PHP

PHP Konstanten ändern

Es scheint erst einmal unsinnig zu sein, aber in machen Situationen, z.B: wenn man in ein komplettes SDK Eingreifen will ohne es zu verändern, würde man gern PHP Konstanten ändern.Möglich ist das mit dem PHP-Core nicht, aber es gibt eine PECL Extension namens runkit, damit funktioniert es.

Im folgenden Beispiel habe ich versucht den Wert eine Kosntanten per Referenz anschließend zu ändern, leider (oder Gott sei Dank) hat es ncht geklappt:

$key = 'vorher';
define('KONSTANTE', &$key);
echo KONSTANTE;
$key = "nachher";
echo KONSTANTE;
//Ausgabe:vorher vorher

Das ist auch gut so, weil Konstanten nun mal konstant sein sollen und nicht variabel.

Auch eine nachträgliche Änderung funktioniert natürlich nicht:

$key = 'vorher';
define('KONSTANTE', $key);
echo KONSTANTE;
$key = "nachher";
define('KONSTANTE', $key);
echo KONSTANTE;
//Ausgabe:vorher vorher
Kategorien
Amazon MWS PHP

Amazon Product Advertising API Umstellung

Ab Februar 2012 stellt Amazon den Support älterer Versionen Ihrer Product Advertising API
ein und untersrützt nur noch das neue AWS System.Auch inhaltlich werden ein paar Änderungen vorgenommen (Quelle Amazon aws-portal.amazon.com):

  • Associate Tag will be a required and verified input parameter in all requests to the API
  • SellerLookup, SellerListingLookup and SellerListingSearch operations will no longer be supported by the API
  • ItemPage parameter will be limited to a maximum of 10 pages for ItemSearch results
  • MerchantId parameter will no longer be supported for filtering offers, variations and search results
  • Merchants search index will no longer be supported
  • Data returned by the Offers and ItemAttributes response groups will be limited to the most frequently used attributes

Zur Zeit kann es bei älteren Versionen zu leeren Responses kommen, was strategische oder technische Ursachen seitens Amazon haben kann.

Die Account Umstellung kann hier durchgeführt werden.

Das Cloudfusion SDK für PHP

Mit Hilfe des Cloudfusion PHP SDK für PHP kann der Zugriff auf die API vereinfacht werden. Cloudfusion ist eine von Community entwickelte Erweiterung des AWS SDK for PHP von Amazon. Es ist nur zu empfehlen Cloudfusion zu benutzen, wenn ein nicht vom AWS SDK for PHP von Amazon unterstützter Dienst angesprochen werden soll. Dazu gehören:

  • Amazon Product Advertising API
  • third-party API-kompatibele Services wie Eucalyptus oder Google Storage

Für einen Request muss die config.php mit den Account Daten befüllt werden und mit dem Code kann dann ein Abfrage gesendet werden:

require_once 'sdk.class.php';
$pas = new AmazonPAS();
$response = $pas->item_search('red hot chili peppers');
var_dump($response);

 

Kategorien
Amazon MWS PHP

Amazon API Migration: SOAP/AIM Migration nach Amazon MWS

Wer die Amazon API nutzt um seine Artikel zu verkaufen, der muss diese nach Amazon MWS migrieren, weil am 8. Oktober 2012 die AIM- und SOAP-Dienste heruntergefahren werden. Bis dahin gibt es eine Übergangsfrist, die gilt, wenn die API  im Zeitraum vom 9.9.2011 und 9.10.2011 benutzt wurde.

Kategorien
Zend Framework

Zend kranuliertes Rechtesystem mit Zend_Acl und Zend_Auth

Für das Rechtesystem in meinem Tippspiel werden die Komponenten Zend_Auth und Zend_Acl im Zendframework verwendet. Zend_Auth ist dabei für die Authentifizierung registrierter Nutzer zuständig und Zend_Acl für Verteilung und das setzen der Rechte. Es wurden drei Rollen angelegt: Guest, Member und Administrator.

Kategorien
Zend Framework

Zend Test mit PhpUnit

Zum Testen wurde PHPUnit verwendet als Standard-Testing-Tool für PHP und in Netbeans intergriert.

Dazu wurde eine Bootstrap Datei angelegt, in der die Applikationsvariablen geladen werden (IndexControllerTest.php):

class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
    public function setUp()
    {
        $this->bootstrap = new Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');
        parent::setUp();
    }
}

Ein Test kann dan so aussehen (Test Files/application/controllers/IndexControllerTest.php):

require_once '/../../TestConfiguration.php';
require_once '/../../../application/models/Players.php';

class PlayersTest extends PhpUnit_Framework_TestCase{
    public function setUp()
    {
        TestConfiguration::setupDatabase();
    }
    public function testFetchAll(){
        $TippspielObjekt = new Players();
        $TippspielAnzahl = $TippspielObjekt->fetchAll();
        $this->assertGreaterThan(10, $TippspielAnzahl->count());        
    }
    public function testLatest(){
        $TippspielObjekt = new Players();
        $TippspielAnzahl = $TippspielObjekt->fetchLatest(1);
        $this->assertSame(1,$TippspielAnzahl->count());
    }
}