URL mit Umlaute wird ignoeriert

zeitlos123

Mitglied
Hallo,

ich habe ein Problem und finde den Fehler einfach nicht.
Ich habe ein Script, welches dynamisch Daten und Bilder ausgibt.

Die Bilder werden zuvor eingelesen und auf dem Server gespeichert, in dem Script funktioniert das auch wunderbar, auch wenn in der URL Umlaute dabei sind.

Bei der Ausgabe wird auf Bilder in einem Verzeichniss ohne Umlaute zugegriffen keine Probleme, nur sobald Umlaute in der URL auf das Verzeichniss auftauchen bleibt der href schließlich leer.

Auf der Einzelseite erfolgt der Zugriff wie folgt:

CODE <?php
  $object = $object->getRessources();
  $groundPlan = $object->getGroundPlan();
  $images = $object->getImages();
  ?>
  Grundplan: <strong><a style="text-decoration: none" href="<?php echo $groundPlan[0]->webPath; ?>"><?php  echo $groundPlan[0]->fileName; ?></a></strong><br />
  <ul style="padding: 0">
  <?php foreach ($images as $image) : ?>
    <li style="display: inline"><a class="mietObjectImage" href="<?php echo $image->webPath; ?>"><img style="border: 1px solid gray;margin-left: 10px;margin-right: 10px;"  src="<?php echo $image->webPath ?>" width="70" height="70"/></a></li>


Das funktioniert, wie gesagt, ohne Umlaute wunderbar.

Die Funktion sind wie folgt aus:


CODE   public function getImages() {
       return $this->ressourceManager->getImages();
   }


Nun weiß ich nicht mehr weiter. Ich habe schon versucht die echo Ausgabe mit echo rawurldecode ($image->webPath) umzuwandeln aber es geschieht nichts, im Seitenquelltext ist das href="" leer.

Jemand eine Idee?

Vielen Dank schon im voraus!

Beste Grüße
 
Gut möglich das dass Problem in der Formatierung der Zeichen liegt.
"ü" ist etwas anderes als "ü" und das ist was anderes als ascii!
 
Mir stellt sich nur die Frage, wie ich das nun umgewandelt bekomme, ein rawurldecode beispielsweise wird ignoriert.
 
QUOTE (zeitlos123 @ Mo 13.02.2012, 12:52) Mir stellt sich nur die Frage, wie ich das nun umgewandelt bekomme, ein rawurldecode beispielsweise wird ignoriert.

Ich kann ja mal in meine Glaskugel schauen, oder Du könntest mal die relevanten Codezielen hier reinschreiben...



BTW das ist aber schon bekannt?


CODE rawurldecode: 'foo%20bar%40baz' --> 'foo bar@baz'
rawurlencode: 'foo bar@baz' --> 'foo%20bar%40baz'


Aber wohl nichts ist zum Umwandeln, kann auch nichts ungewandelt werden, leerer String, bleibt eben leerer String.
 
webPath wird hier gebildet:

CODE $ressource->webPath = sprintf('https://www.domain.de/uploads/%s/%s/%s/%s', $this->userID, $this->objectID, $res, $file);


Der String bleibt aber nur leer wenn Umlaute vorkommen, ohne kein Problem.
 
Wo ist der Programmcode, welcher dahinter steckt?
Wie soll man eine Methode analysieren, wenn Sie nicht gepostet wird? Wie soll man was zu einer PHP Klasse sagen, wenn nirgendwo steht, wie Du diese aufrufst?

CODE $ressource->webPath


Ansonsten bitte selbstständig ausprobieren, und diesmal rawurlencode nutzen und nicht rawurldecode.
 
Hier die erste Klasse:

CODE <?php
require_once 'AbstractModel.php';
require_once('g/RessourceManager.php');


class MietObject extends AbstractModel {


protected $_primary = 'id';
private $ressourceManager = null;

public function getWohnungsTyp() {
return $this->findDependentRowset('Wohnungstyps')->current()->name;
}
public function getBefeuerungsArt() {
return $this->findDependentRowset('Befeuerungsarts')->current()->name;
}

public function jaNein($value) {
return ($value == '1') ? 'Ja' : 'Nein';
}

public function getVerwalter() {
return $this->findDependentRowset('Users')->current();
}

public function getRessources() {
if (!($this->ressourceManager instanceof RessourceManager)) {
$this->ressourceManager = new RessourceManager($this->verwalter_id, $this->id);
}
return $this;
}

public function getImages() {
return $this->ressourceManager->getImages();
}
public function getGroundPlan() {
return $this->ressourceManager->getGroundPlan();
}
public function getDocuments() {
return $this->ressourceManager->getDocuments();
}



}

?>



Die Klasse ressourceManager sieht wie folgt aus:


CODE <?php

require_once 'g/Upload.php';


class RessourceManager {

const DOCUMENTS_FOLDER = 'documents';
const GROUNDPLAN_FOLDER = 'groundplan';
const IMAGES_FOLDER = 'images';


private $docPath;
private $imagePath;
private $groundplanPath;
private $userID;
private $objectID;
public $lastError;




public function __construct($userID, $objectID) {
$fullPath = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . $userID . DIRECTORY_SEPARATOR . $objectID . DIRECTORY_SEPARATOR;
$this->docPath = $fullPath . self::DOCUMENTS_FOLDER;
$this->imagePath = $fullPath . self::IMAGES_FOLDER;
$this->groundplanPath = $fullPath . self::GROUNDPLAN_FOLDER;
$this->userID = $userID;
$this->objectID = $objectID;
$this->createFolderStructure();
}

public function getImages() {
return $this->getRessources($this->imagePath);
}

public function getDocuments() {
return $this->getRessources($this->docPath, self::DOCUMENTS_FOLDER);
}

public function getGroundPlan() {
return $this->getRessources($this->groundplanPath, self::GROUNDPLAN_FOLDER);
}

public function uploadImage($file) {

return $this->uploadRessource($file, $this->imagePath, array('png', 'jpg', 'gif', 'jpeg'));

}

public function createFolderStructure() {
if (!is_dir($this->docPath)) {
if (!mkdir($this->docPath, 0777, true)) {
$this->lastError = 'Erstellung der Verzeichnisse schlug fehl...';
return false;
}
}
if (!is_dir($this->imagePath)) {
if (!mkdir($this->imagePath, 0777, true)) {
$this->lastError = 'Erstellung der Verzeichnisse schlug fehl...';
return false;
}
}
if (!is_dir($this->groundplanPath)) {
if (!mkdir($this->groundplanPath, 0777, true)) {
$this->lastError = 'Erstellung der Verzeichnisse schlug fehl...';
return false;
}
}
return true;
}

public function uploadDocument($file) {
return $this->uploadRessource($file, $this->docPath, array('doc', 'docx','xls', 'pdf', 'xlsx'));
}

public function uploadGroundPlan($file) {
return $this->uploadRessource($file, $this->groundplanPath, array('pdf'));
}

public function deleteImage($file) {
$this->deleteRessource($this->imagePath . DIRECTORY_SEPARATOR . $file);
}

public function deleteDocument($file) {
$this->deleteRessource($this->docPath . DIRECTORY_SEPARATOR . $file);
}

public function deleteGroundPlan($file) {
$this->deleteRessource($this->groundplanPath . DIRECTORY_SEPARATOR . $file);
}



public function deleteRessource($resPath) {
return unlink($resPath);
}

public function getRessources($resPath, $res = self::IMAGES_FOLDER) {
/*$iterator = new FilesystemIterator($resPath);

$resArr = array();
foreach ($iterator as $file) {
$ressource = new stdClass();
$ressource->fileName = $file->getFilename();
$ressource->createDate = date('d-m-Y H:i', $file->getMTime());
$ressource->webPath = sprintf('https://www.domain.de/uploads/%s/%s/%s/%s', $this->userID, $this->objectID, $res, $ressource->fileName);
array_push($resArr, $ressource);
}*/
$resArr = array();
if ($handle = opendir($resPath)) {

/* Das ist der korrekte Weg, ein Verzeichnis zu durchlaufen. */
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != "..") {
$ressource = new stdClass();
$ressource->fileName = $file;
//$ressource->createDate = date('d-m-Y H:i', $file->getMTime());
$ressource->webPath = sprintf('https://www.domain.de/uploads/%s/%s/%s/%s', $this->userID, $this->objectID, $res, $file);
array_push($resArr, $ressource);
}
}


closedir($handle);
}


return $resArr;
}

public function uploadRessource($file, $path, $allowedExt = array()) {
$upload = new Upload($file, $allowedExt);
$upload->setFullPath($path);
if (!$upload->copy(false)) {
$this->lastError = $upload->getLastError();
return false;
} else {
return true;
}
}
}

?>



Klasse AbstractModel:


CODE <?php

abstract class AbstractModel extends Zend_Db_Table_Row_Abstract {

function __get($columnName) {
//return utf8_decode(parent::__get($columnName));
return htmlentities(utf8_decode(parent::__get($columnName)));
//return parent::__get($columnName);
}
}

?>




CODE <?php ### Einzelansicht
require_once('g/WebGlobal.php');
WebGlobal::init();
require_once('g/model/MietObjects.php');
require_once('g/model/MietObject.php');

$mietObjectManager = new MietObjects();

if (isset($_GET['oid'])) {
$oid = urldecode($_GET['oid']);
$object = $mietObjectManager->find($oid)->current();
?>

<?php
$object = $object->getRessources();
$groundPlan = $object->getGroundPlan();
$images = $object->getImages();
?>
Grundplan: <strong><a style="text-decoration: none" href="<?php echo $groundPlan[0]->webPath; ?>"><?php echo $groundPlan[0]->fileName; ?></a></strong><br />
<ul style="padding: 0">
<?php foreach ($images as $image) : ?>
<li style="display: inline"><a class="mietObjectImage" href="<?php echo $image->webPath; ?>"><img style="border: 1px solid gray;margin-left: 10px;margin-right: 10px;" src="<?php echo $image->webPath ?>" width="70" height="70"/></a></li>




Das sollte alles an relevanten Code sein.
 
CODE public function getRessources() {
if (!($this->ressourceManager instanceof RessourceManager)) {
$this->ressourceManager = new RessourceManager($this->verwalter_id, $this->id);
}
return $this;
}


Hier muss doch der Hund begraben liegen. Das Script versucht auf die hinterlegten Ressourcen zuzugreifen, ohne Umlaut alles iO mit Umlaut wird nix übergeben, daher sind die href auch leer.

Nur komme ich da nicht weiter, ich habe bislang noch nicht rausgefunden wo verwalter_id und id gebildet werden.

 
Schon mal was von Debugging gehoert? Schritt fuer Schritt die Werte beim Laufen des Scripts analysieren. Hast keinen Debugger im Einsatz kannst auch im Old-School Style mit die/echo/print etc. oder logfiles die Werte verfolgen. Dann siehst schnell wo der Fehler liegt.
 
Die $this->verwalter_id scheint aus der Zend_Db_Table_Row_Abstract-Klasse zu kommen, ich habe jedoch keine Ahnung vom Zend-Framework selber. Falls sie nicht daher kommt, gibt es sie vielleicht gar nicht.

Ich habe mich auf die Funktion mit der Path-Erzeugung konzentiert, da scheint es aber keinen Fehler zu geben. Trotzdem wäre ein print_r vor dem erstellen des Pfad ggf. hilfreich.
 
Hier mal ein print_r von object vor Ausgabe der Bilder.

Die Pfade scheinen ja zu stimmen, die Umlaute sind mit drin, warum erfolgt keine Ausgabe?

CODE MietObject Object ( [_primary:protected] => Array ( [1] => id ) [ressourceManager:private] => RessourceManager Object ( [docPath:private] => /kunden/297295_30169/webseiten/domain.de/uploads/1/H_Büwo19_05/documents [imagePath:private] => /kunden/297295_30169/webseiten/domain.de/uploads/1/H_Büwo19_05/images [groundplanPath:private] => /kunden/297295_30169/webseiten/domain.de/uploads/1/H_Büwo19_05/groundplan [userID:private] => 1 [objectID:private] => H_Büwo19_05 [lastError] => ) [_data:protected] => Array ( [id] => H_Büwo19_05 [verwalter_id] => 1 [haus_id] => H_Büwo19 [wohnungs_id] => H_Büwo19_05 [lage] => 2. OG links [vermietet] => 1 [zimmer_anzahl] => 4 [wohnflaeche] => 90.0 [wohntyp_id] => 2 [baujahr] => 0 [befeuerung_id] => 7 [garage_stellplatz] => [barrierefrei] => [kabelanschluss] => 1 [nettomiete] => 810 [nebenkosten] => 120 [beschreibung] => [ausstattung] => Balkon, Einbauküche, Parkett, Tageslichtbad, Keller [strasse] => Bütersworthstr. [hausnummer] => 19 [stadt] => Hannover [plz] => 30161 [immoscout_id] => 0 [lat] => 52.382671 [lng] => 9.751462 ) [_cleanData:protected] => Array ( [id] => H_Büwo19_05 [verwalter_id] => 1 [haus_id] => H_Büwo19 [wohnungs_id] => H_Büwo19_05 [lage] => 2. OG links [vermietet] => 1 [zimmer_anzahl] => 4 [wohnflaeche] => 90.0 [wohntyp_id] => 2 [baujahr] => 0 [befeuerung_id] => 7 [garage_stellplatz] => [barrierefrei] => [kabelanschluss] => 1 [nettomiete] => 810 [nebenkosten] => 120 [beschreibung] => [ausstattung] => Balkon, Einbauküche, Parkett, Tageslichtbad, Keller [strasse] => Bütersworthstr. [hausnummer] => 19 [stadt] => Hannover [plz] => 30161 [immoscout_id] => 0 [lat] => 52.382671 [lng] => 9.751462 ) [_modifiedFields:protected] => Array ( ) [_table:protected] => MietObjects Object ( [_name:protected] => tblmietobject [_rowClass:protected] => mietobject [_primary:protected] => Array ( [1] => id ) [_referenceMap:protected] => Array ( [MieterMietobject] => Array ( [columns] => id [refTableClass] => MieterMietobjects [refColumns] => mietobject_id ) ) [_definition:protected] => [_definitionConfigName:protected] => [_db:protected] => Zend_Db_Adapter_Pdo_Mysql Object ( [_pdoType:protected] => mysql [_numericDataTypes:protected] => Array ( [0] => 0 [1] => 1 [2] => 2 [INT] => 0 [INTEGER] => 0 [MEDIUMINT] => 0 [SMALLINT] => 0 [TINYINT] => 0 [BIGINT] => 1 [SERIAL] => 1 [DEC] => 2 [DECIMAL] => 2 [DOUBLE] => 2 [DOUBLE PRECISION] => 2 [FIXED] => 2 [FLOAT] => 2 ) [_defaultStmtClass:protected] => Zend_Db_Statement_Pdo [_config:protected] => Array ( [host] => mysql5.domain.com [port] => xxxx [username] => dbxxx_1 [password] => Ujxxx [dbname] => db2xxxx_1 [charset] => [persistent] => [options] => Array ( [caseFolding] => 0 [autoQuoteIdentifiers] => 1 [fetchMode] => 2 ) [driver_options] => Array ( ) ) [_fetchMode:protected] => 2 [_profiler:protected] => Zend_Db_Profiler Object ( [_queryProfiles:protected] => Array ( ) [_enabled:protected] => [_filterElapsedSecs:protected] => [_filterTypes:protected] => ) [_defaultProfilerClass:protected] => Zend_Db_Profiler [_connection:protected] => PDO Object ( ) [_caseFolding:protected] => 0 [_autoQuoteIdentifiers:protected] => 1 [_allowSerialization:protected] => 1 [_autoReconnectOnUnserialize:protected] => ) [_schema:protected] => [_cols:protected] => Array ( [0] => id [1] => verwalter_id [2] => haus_id [3] => wohnungs_id [4] => lage [5] => vermietet [6] => zimmer_anzahl [7] => wohnflaeche [8] => wohntyp_id [9] => baujahr [10] => befeuerung_id [11] => garage_stellplatz [12] => barrierefrei [13] => kabelanschluss [14] => nettomiete [15] => nebenkosten [16] => beschreibung [17] => ausstattung [18] => strasse [19] => hausnummer [20] => stadt [21] => plz [22] => immoscout_id [23] => lat [24] => lng ) [_identity:protected] => 1 [_sequence:protected]
 
Ausgabe von $images ohne Umlaute:

CODE Array ( [0] => stdClass Object ( [fileName] => P1020918.JPG [webPath] => https://www.domain.de/uploads/1/H_Freiligr7_10/images/P1020918.JPG ) [1] => stdClass Object ( [fileName] => P1020916.JPG [webPath] => https://www.domain.de/uploads/1/H_Freiligr7_10/images/P1020916.JPG )


Mit Umlaut:


CODE Array ( )



dry.gif
 
Ich habe noch etwas herausgefunden.

Wenn ich einmal den Ordner zB Büsche_Strasse und dazu noch den Ordner Büsche_Strasse habe und in beiden das Bild liegt dann funktioniert es.

Aber das ist ja nicht die Lösung, da müllt sich der Server ja zu.

Wenn ich jetzt beim Ordner erstellen auf dem Server die Umlaute durch HTML-Entities ersetze, dann bekomme ich zwar den Link auf der Seite, dieser führt aber ins Leere da vom Browser die Entities durch Umlaute ersetzt werden.

 
Nun ja, da muss ja irgendwo ein htmlentities durchgeführt worden sein, das musste nun finden und eleminieren. Ein rawurlencode hat ja nicht zum Erfolg geführt, zu mindestens weiß ich nicht, wie das ausgegangen ist. Wobei ich nun so auch keinen htmlentities entdeckt habe, außer dieses Funktion ist in sprintf() integriert worden, bzw. die Funktion wurde mittels Konfig überladen, realisiere das doch Testweise mal über ein echo().
 
Hi, das einzigste htmlentitie ist hier in der Klasse AbstractModel

CODE <?php

abstract class AbstractModel extends Zend_Db_Table_Row_Abstract {

function __get($columnName) {
//return utf8_decode(parent::__get($columnName));
return htmlentities(utf8_decode(parent::__get($columnName)));
//return parent::__get($columnName);
}
}

?>


Nur wenn das rausgenommen wird sind alle Daten auf der Seite weg.
 
Dein Vorgehen klingt etwas wirr. Hab dir ja schon gesagt, wie du das Problem loesen kannst. Debuggen! Schritt fuer Schritt! Gib an JEDEM Ort wo der Pfadwert durchgegeben wird diesen via echo/print etc aus. Dann weisst wenigstens mal wo er sich nullt, ne Exception schmeisst oder was auch immer der Fall ist. Dann musst allenfalls lediglich einen Schritt vorher encoden und einen dannach wieder decoden. Vielleicht genuegt auch nur schon das Verwenden von error_reporting(E_ALL); oder findest den Fehler bereits jetzt im error_log. Und komm nicht auf die Idee im Zend Framework herum zu basteln. Werte dort ausgeben zu testzwecken ja, doch aendern sollst dort nur was, wenn du wirklich weisst was du tust.
 
QUOTE (zeitlos123 @ Mi 15.02.2012, 17:05)Hi, das einzigste htmlentitie ist hier in der Klasse AbstractModel


CODE <?php

abstract class AbstractModel extends Zend_Db_Table_Row_Abstract {

  function __get($columnName) {
      //return utf8_decode(parent::__get($columnName));
      return htmlentities(utf8_decode(parent::__get($columnName)));
      //return parent::__get($columnName);
  }
}

?>


Nur wenn das rausgenommen wird sind alle Daten auf der Seite weg.

Jepp und genau hier könnte das Problem liegen. Das ist sogar logisch, denn mit __get() kannst Du selbst geschütze Variablen zugreifen, und wenn natürlich an der falschen Stelle etwas abgegriffen wird, und dann mit einen htmlentities() belegt wird.
Nun ja, muss ich ja nicht weiter ausführen, das Ding rausnehmen und schauen, wie es sich ändert, sind da keine Entities mehr, hast Du was falsch gemacht.

Und klar sind dann alle Daten weg, weil Du hier auf die direkten Variablen der Klasse zugreifst, egal ob nun geschützt oder nicht, was ja eigentlich kaum sinn der Sache ist, da sollte man sich auch nicht wundern, wenn man etwas falsch macht, dass es zu Fehlern kommt. Ich würde sehr stark vermuten, dass das Phänomen nur auftritt, weil Du durch die Hintertür an die Variablen gegangen bist.

Ich habe nun leider nur auf den Ablauf der Variablen Bildung in der Methode getRessources() geschaut. Damit war die Vermutung des Überladen immerhin richtig.
biggrin.gif
http://www.php.net/__get
 
Zurück
Oben