php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 21-02-2012, 21:41
torud
 Registrierter Benutzer
Links : Onlinestatus : torud ist offline
Registriert seit: Oct 2005
Beiträge: 61
torud ist zur Zeit noch ein unbeschriebenes Blatt
Standard Bild laden aus UniCode-Dateinamen - Wie?

Hallo Wissende,

ich habe eine kleine Datenbank in der jede Mende Athleten eingetragen sind.

Ich generiere aus der ID, dem Vornamen und dem Familiennamen des Eintrages einen Dateinamen, der dann so heissen könnte:

8204_Łukasz_Trałka.png

Wie ihr seht befinden sich in dem Dateinamen UniCode-Zeichen. Diese Datei befindet sich auf meinem Laptop und auf meinem Server. Unter Windows ist es kein Problem die Dateien anzuzeigen. Aber irgendwie geht das nicht auf meinem Server.

Hier mal mein Code, wie ich es probier:

PHP-Code:
        while($row mysql_fetch_object($ergebnis))
        {
            
$i ++;
            if   (!(
$i 2)){ $myclass ' class="one"';}
            else            { 
$myclass ' class="two"';}
            if (
$row->nr 127) {
                echo(
" <tr".$myclass." valign=\"top\">\n");
                
$fname trim($row->first_name);
                
$sname trim($row->second_name);
                
$nname trim($row->nick_name);
              if (
$nname <> '') {
                  
$sfile $row->id.'_'.$nname.'.png';
                  if (
file_exists('pics/players/'.$sfile)) {
                      echo(
'<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
$row->id.'_'.$nname.'.png'.'</td><td><img src="pics/players/'.$sfile.'" title="'.$sfile.'"></td>');
                      }
                  else {
                      echo(
'<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
$row->id.'_'.$nname.'.png'.'</td><td>'.$sfile.' not found!</td>');
                  }
              }
              else {
                  
$sfile $row->id.'_'.$fname.'_'.$sname.'.png';
                  if (
file_exists('pics/players/'.$sfile)) {
                      echo(
'<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
$row->id.'_'.$fname.'_'.$sname.'.png'.'</td><td><img src="pics/players/'.$row->id.'_'.$fname.'_'.$sname.'.png" title="'.$row->id.'_'.$fname.'_'.$sname.'.png"></td>');
                      }
                  else {
                      echo(
'<td>'.$row->nr.'</td><td>'.$fname.'</td><td>'.$sname.'</td><td>'.$nname.'</td><td>'.
$row->id.'_'.$fname.'_'.$sname.'.png'.'</td><td>'.$sfile.' not found!</td>');
                  }
              }
            echo(
" </tr>\n");
            }
        } 
Bilder, die keine Sonderzeichen beinhalten werden korrekt angezeigt.
Ich würde mich freuen, wenn ihr mir eine helfende Hand reicht.
__________________
Danke
Tom

Geändert von torud (22-02-2012 um 10:01 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 22-02-2012, 01:57
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

bitte brich den Code nach spätestens 80 Zeichen um (Beitrag bearbeiten), damit man nicht horizontal scrollen muss.

Unter Windows werden Dateinamen im entsprechenden Windows-Zeichensatz der jeweiligen Sprachversion abgelegt (z. B. windows-1250). Ein Linux/Unix-basierter Server arbeitet mit einem anderen Zeichensatz (soweit ich weiß meist UTF-8).

Damit der Server deine mit Windows erstellten Dateien lesen kann, müsstest du die Dateinamen konvertieren, was aber dennoch keine sinnvolle Lösung ist.

Variante 1: Speichere die Namen in der Datenbank und benutze als Dateiname den Primärschlüsselwert. Somit kann PHP jederzeit zu einem Namen den zugehörigen Dateinamen abfragen oder aus dem Dateinamen den Datensatz abholen.

Variante 2: Gestalte die Dateinamen so, dass sie keine Sonderzeichen mehr enthalten und auf jedem Betriebssystem gleichermaßen behandelt werden können. Das ginge z. B. mit quoted-printable, was immer noch halbwegs menschenlesbar ist.

Variante 3: Eine Hybridlösung aus den vorherigen: Jeder Dateiname beginnt mit dem Primärschlüsselwert und enthält zusätzlich eine halbwegs lesbare, codierte Repräsentation des Namens, z. B. 8204_=c5=81ukasz_Tra=c5=82ka oder 8204-#0141ukasz-Tra#0142ka. So kannst du jederzeit aus dem Dateinamen den Namen der Person rekonstruieren und über die ID zusätzlich den gesamten Datensatz abrufen.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #3 (permalink)  
Alt 22-02-2012, 10:06
torud
 Registrierter Benutzer
Links : Onlinestatus : torud ist offline
Registriert seit: Oct 2005
Beiträge: 61
torud ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo Amica,

ich habe inzwischen herausgefunden, dass das Problem nicht ausschließich in den Dateinamen liegt, sondern schon mit einem php-Bug in der function file_exists seine Begründung findet.

Lasse ich nämlich diese Prüfung weg, funktioniert es wunderbar.
So habe ich es jetzt erstmal gemacht. Blöd nur, dass nun keinerlei Prüfung vornehmen kann und keinen Report erstellen kann.

Ich habe leider inzwischen fast 500 Bilder erstellt. Da fällt einem das Umschwenken zu anderen Dateinamen schon schwerer...
__________________
Danke
Tom
Mit Zitat antworten
  #4 (permalink)  
Alt 25-02-2012, 12:05
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von torud Beitrag anzeigen
Hallo Amica,

ich habe inzwischen herausgefunden, dass das Problem nicht ausschließich in den Dateinamen liegt, sondern schon mit einem php-Bug in der function file_exists seine Begründung findet.
File_exists() ist eine Dateisystem-Funktion. Und sie findet die angesprochene Datei dann nicht, wenn ihr Name Zeichen enthält, die nicht vom Dateisystem unterstützt werden. Alle PHP-Dateifunktionen können unter Windows nur die Dateien (oder Verzeichnisse) sehen, deren Namen ausschließlich aus Zeichen der eingestellten Codepage bestehen. Das ist hierzulande normalerweise Windows-1252 -- eine Art ISO-8859-1(5) mit ein paar zusätzlichen Zeichen. Alle anderen Dateinamen versteckt das alte Windows-API wohlweislich. Sie lassen sich auch nicht über den Short-Name-Hack (wie bspw. "DAT~1.TXT") ansprechen.

Die einzige Möglichkeit, Unicode-Pfade zu referenzieren ist über die COM-API und das dort standardmäßig vorhandene "Scripting.FilesystemObject". Leider kennt dieses Objekt kein File-Locking, so dass Schreibzugriffe auf Dateien hier zu einem Vabanque-Spiel werden. Kombinierter Lese-und-Schreibzugriff ist auch nicht möglich. Ausschließlich Lesen funktioniert aber.

Je nach Konfiguration des Systems kann man auch das ADODB.Stream-Objekt nutzen. Nur ist das nicht überall vorhanden und wenn, dann oft in unterschiedlichen Versionen mit unterschiedlichen API-Fähigkeiten.

Zitat:
Ich habe leider inzwischen fast 500 Bilder erstellt. Da fällt einem das Umschwenken zu anderen Dateinamen schon schwerer...
So lange die Dateisystem-Funktionen von PHP diese (schon lange) veraltete Windows-Schnittstelle nutzen, musst du entweder alle Dateinamen irgendwie kodieren oder dir einen entsprechenden Wrapper (jeweils um die Standard-Funktionen für Linux und um die COM-Funktionen für Windows) bauen, wenn dein Script auf beiden Betriebssystem-Familien gleich funktionieren soll.

Geändert von fireweasel (25-02-2012 um 12:13 Uhr)
Mit Zitat antworten
  #5 (permalink)  
Alt 25-02-2012, 12:07
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist gerade online
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Dateinamen mit Sonderzeichen sind zu vermeiden, weil sie immer wieder zu Problemen führen.

Warum muss der Vor- und Nachname im Dateinamen vorkommen? Die ID alleine reicht doch vollkommen.
Mit Zitat antworten
  #6 (permalink)  
Alt 25-02-2012, 12:20
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
Dateinamen mit Sonderzeichen sind zu vermeiden, weil sie immer wieder zu Problemen führen.
Nur, weil du in der Schule diese Buchstaben nicht gelernt hast, sind das keine Sonderzeichen.

Im Übrigen ist eine pauschale Begrenzung auf ein ASCII-Subset möglicherweise bei 60-er-Jahre-Retro-Unix-Kommandozeilen-Fetischisten Usus. Wir haben aber 2012 und Unicode ist nichts Neuartiges mehr, sondern ein Standard, der schon Jahrzehnte existiert. Jedes halbwegs fähige Dateisystem (sogar FAT) unterstützt Unicode. Der Fehler liegt in der PHP-Implementierung der Dateisystemfunktionen.

In Anlehnung an dein Motto müsste man daher eher die Anwendung von PHP vermeiden, weil dessen kaputte Dateisystemfunktionen immer wieder zu Problemen führen.

Ein viel wichtigeres Problem ist die Unterscheidung (oder Nicht-Unterscheidung) von Groß- und Kleinschreibung, die von System zu System unterschiedlich gelöst ist. Und die ist unabhängig von Unicode.

Zitat:
Warum muss der Vor- und Nachname im Dateinamen vorkommen? Die ID alleine reicht doch vollkommen.
Da bin ich ganz deiner Meinung.
Das wurde auch schon vorgeschlagen (Variante 1).

Geändert von fireweasel (25-02-2012 um 12:32 Uhr)
Mit Zitat antworten
  #7 (permalink)  
Alt 25-02-2012, 12:39
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist gerade online
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Nur, weil du in der Schule diese Buchstaben nicht gelernt hast, sind das keine Sonderzeichen.
Natürlich sind sie das. Genauso wie ä, ö und ü Sonderzeichen sind.

Zitat:
Zitat von fireweasel Beitrag anzeigen
Im Übrigen ist eine pauschale Begrenzung auf ein ASCII-Subset möglicherweise bei 60-er-Jahre-Retro-Unix-Kommandozeilen-Fetischisten Usus. Wir haben aber 2012 und Unicode ist nichts Neuartiges mehr, sondern ein Standard, der schon Jahrzehnte existiert. Jedes halbwegs fähige Dateisystem (sogar FAT) unterstützt Unicode. Der Fehler liegt in der PHP-Implementierung der Dateisystemfunktionen.
In der schönen, heilen Welt...

In der Praxis wirst du aber immer wieder mal auf Komponenten treffen, die Probleme damit haben. Mit ASCII bist du auf jeden Fall sicher. Außerdem gibts in 99,99% der Fälle keinen Grund Sonderzeichen in Dateinamen zu speichern. Warum also unnötig die Warhscheinlichkeit erhöhen damit auf Probleme zu stoßen? Nur weil mans kann? Tolle Begründung...

Zitat:
Zitat von fireweasel Beitrag anzeigen
In Anlehnung an dein Motto müsste man daher eher die Anwendung von PHP vermeiden, weil dessen kaputte Dateisystemfunktionen immer wieder zu Problemen führen.
Es gibt viele Gründe, warum man PHP meiden sollte. Aber es gibt auch viele Gründe, die für PHP sprechen. Man muss eben abwägen. Und warum sich diese Auswahl durch Sonderzeichen in Dateinamen künstlich einschränken? Bringt doch nix.

Zitat:
Zitat von fireweasel Beitrag anzeigen
Ein viel wichtigeres Problem ist die Unterscheidung (oder Nicht-Unterscheidung) von Groß- und Kleinschreibung, die von System zu System unterschiedlich gelöst ist. Und die ist unabhängig von Unicode.
Das ist auch ein Problem, das man aber relativ einfach in den Griff bekommt (_immer_ lowercase oder uppercase verwenden und niemals mischen).
Mit Zitat antworten
  #8 (permalink)  
Alt 02-03-2012, 11:31
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von h3ll Beitrag anzeigen
Man muss eben abwägen. Und warum sich diese Auswahl durch Sonderzeichen in Dateinamen künstlich einschränken? Bringt doch nix.
Es gibt sicher eine Menge (auch weniger sinnvoller) Sonderzeichen im Unicode-Set. Aber Umlaute und Buchstaben anderer Sprachen gehören trotzdem nicht dazu. Sie sind einfach nur Buchstaben.

Python und Perl (nur als Beispiel) haben keine Schwierigkeiten betriebssystem-übergreifend Dateinamen, die Unicode außerhalb des von dir präferierten ASCII-Subsets enthalten, zu speichern und zu lesen. Nur die Windows-Version von PHP hat diese Probleme.

Es sollte auch nicht die Aufgabe eines Anwendungsentwicklers sein, um die (offensichtlichen) Fehler in der Laufzeitumgebung herumzuprogrammieren.

Zitat:
Zitat von h3ll Beitrag anzeigen
Das ist auch ein Problem, das man aber relativ einfach in den Griff bekommt (_immer_ lowercase oder uppercase verwenden und niemals mischen).
Der Threaderöffner wollte Namen speichern. Guckst du bspw. mal: Van Houten - Wikipedia, the free encyclopedia.
Wie willst du die Namen zweier Menschen gleichen Vornamens aber mit "van Houten" und "Van Houten" als "Nachnamen" mit Konvertierung nach lower- oder uppercase eindeutig speichern?
Mit Zitat antworten
  #9 (permalink)  
Alt 02-03-2012, 11:44
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist gerade online
Registriert seit: Mar 2008
Beiträge: 3.576
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Es gibt sicher eine Menge (auch weniger sinnvoller) Sonderzeichen im Unicode-Set. Aber Umlaute und Buchstaben anderer Sprachen gehören trotzdem nicht dazu. Sie sind einfach nur Buchstaben.
Ansichtssache. Und nur weil du es anders nennst als ich, ändert das nicht den Sinn meiner Aussage.

Zitat:
Zitat von fireweasel Beitrag anzeigen
Der Threaderöffner wollte Namen speichern. Guckst du bspw. mal: Van Houten - Wikipedia, the free encyclopedia.
Wie willst du die Namen zweier Menschen gleichen Vornamens aber mit "van Houten" und "Van Houten" als "Nachnamen" mit Konvertierung nach lower- oder uppercase eindeutig speichern?
Indem man eine ID als Dateiname verwendet und nicht den Namen selber. Die Applikation hat nichts davon, wenn die Dateien "schön" heißen. Außerdem hast du das selbe Problem, wenn zwei Personen wirklich komplett gleich heißen. Was machst du dann?
Mit Zitat antworten
  #10 (permalink)  
Alt 02-03-2012, 12:06
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Wie willst du die Namen zweier Menschen gleichen Vornamens aber mit "van Houten" und "Van Houten" als "Nachnamen" mit Konvertierung nach lower- oder uppercase eindeutig speichern?
Nichts gegen dich, aber dieses Beispiel finde ich sinnlos. Es ist offensichtlich, dass es zwei regional geprägte Schreibweisen mit identischer Bedeutung sind. Die Niederländer schreiben es klein (so wie wir unser „von“) und US-Amerikaner schreiben meist alle Namensbestandteile mit großem Anfangsbuchstaben (siehe Stolpersteine: häufig verwechselte Wörter - Lutz Walther - Google Bücher). Zwischen diesen Versionen gibt es aber keine semantischen Unterschiede und die kleingeschriebene Variante ist auch im American English genauso richtig wie die große. Ansonsten hat h3ll ja schon alles gesagt.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Bild direkt aus DB laden Fle>< PHP Developer Forum 4 01-07-2005 11:21
Bild upload -> Dateinamen in Datenbank schreiben Scolex PHP Developer Forum 6 31-01-2005 17:24
bild+aus php-datei laden und anzeigen??? TriphunEM PHP Developer Forum 18 20-10-2004 16:24
Bild nicht aus Cache laden Meillo HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 8 06-10-2004 16:15
Mit PHP ein Bild aus dem Internet laden Sellay PHP Developer Forum 8 27-03-2003 18:00

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:48 Uhr.