php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 27.07.2006, 18:25  
Benutzer
 
Registriert seit: 26.01.2005
Beiträge: 30
hans.karl2
Standard Funktionen überprüfen und Grafik Funktionen

Ich will prüfen, ob es eine Funktion gibt mit einem bestimmten Namen. Zum Beispiel ob es die Funktion imagepng oder imagegif gibt und dann je nach dem die existierende Verwenden (ähnlich wie bei isset() bei Variablen). Gibt es also eine Funktion, die die Existenz einer Funktion überprüft?

Ich habe mir nämlich eine Bildergalerie geschrieben, wo man nur sequenziell die Bilder betrachten kann. Nun will ich mit den PHP image Funktionen die Bilder verkleinern und in einer Übersicht anzeigen. Ich muss natürlich ein eingenes PHP Skript verwenden, dass diese Aufgabe erledigt und mit folgendem HTML Code einbinden:
PHP-Code:
[img]bild.php?img=test.jpg&width=50&height=50[/img
Weis vielleicht jemand, wie bzw. ob man mit PHP mit URL Rewriting die URL "bild.php?img=test.jpg&width=50&height=50" in eine etwas benutzerfreundlichere URL "test.jpg" ändern kann oder gibt es da eine andere Methode?

Ich will nun ein Skript schreiben, dass überprüft, ob die Grafikfunktionen bei dem verwendeten PHP Interpreter vorhanden sind (bzw. welche Funktionen vorhanden sind und diese nutzen) oder wenn keine vorhanden sind, dann wird einfach das Bild per <img> Tag verkleinert (dieses ist der Worst Case, da die Ladezeit aufgrund der großen Bilder beim User enorm ansteigt, im Gegensatz zum Verkleinern der Bilder schon am Server).

Ich will nun ein Skript (bild.php) schreiben, dass auf allen PHP Plattformen (auch ohne Grafik-Funktionen) als Bildverkleinerer dienen kann. Per Get-Variable übergebe ich diesem Skript noch den Pfad des Bildes bzw. dessen Zielgröße.

Das Skript bild.php:
PHP-Code:
<?php
    
//$filename="test.jpg";
    //if(@isset($HTTP_GET_VARS["img"])$filename=$HTTP_GET_VARS["img"];
    
$filename=$HTTP_GET_VARS["img"];
    
$width=$HTTP_GET_VARS["width"];
    
$height=$HTTP_GET_VARS["height"];
    
//if(isset($HTTP_GET_VARS["width"])$width=$HTTP_GET_VARS["width"];    //neue Breite
    //if(isset($HTTP_GET_VARS["heigth"])$heigth=$HTTP_GET_VARS["height"];    //neue Hoehe
    
    
if(true)    //Ueberpruefung, ob Grafikfunktionen vorhanden
    
{
        
$img_info=getimagesize($filename);
        switch(
$img_info[2])    //Formatdifferenzierung
        
{
            case 
1$imgA imagecreatefromgif($filename);    //GIF Format
                    
header("Content-Type: image/gif");
                    break;
            case 
2$imgA imagecreatefromjpeg($filename);    //JPG Format
                    
header("Content-Type: image/jpg");
                    break;
            case 
3$imgA imagecreatefrompng($filename);    //PNG Format
                    
header("Content-Type: image/png");
                    break;
            default:
$imgA imagecreate($img_info[0], $img_info[1]);
                    break;
        }
        if(
$width <= 0$width $img_info[0];
        if(
$height <=0$heigth$img_info[1];
        
$imgB imagecreate($width$height);
        
imagecopyresized($imgB$imgA0,00,0$width$height$img_info[0], $img_info[1]);
        
imagepng($imgB); //HIer sollte auch ein Ueberpruefung stattfinden, ob es diese Funktion gibt bzw. imagegif()!
        
imagedestroy($imgB);
        
imagedestroy($imgA);
    } 
    else    
//Wenn keine vorhanden, laden des Inhaltes der Datei in Ausgabepuffer
    
{
        
header("Content-Type: image/jpg");
        
readfile($filename);
    }
?>
Warum funktioniert isset nicht (auch nicht mit vorgestelltem @)?

Ich danke schon im Voraus für die Antworten.
hans.karl2 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.07.2006, 18:34  
Gast
 
Beiträge: n/a
Standard Re: Funktionen überprüfen und Grafik Funktionen

Zitat:
Zitat von hans.karl2
Ich will prüfen, ob es eine Funktion gibt mit einem bestimmten Namen. Zum Beispiel ob es die Funktion imagepng oder imagegif gibt und dann je nach dem die existierende Verwenden (ähnlich wie bei isset() bei Variablen). Gibt es also eine Funktion, die die Existenz einer Funktion überprüft?
http://php.net/function_exists
http://php.net/imagetypes

Zitat:
Zitat von hans.karl2
Weis vielleicht jemand, wie bzw. ob man mit PHP mit URL Rewriting die URL "bild.php?img=test.jpg&width=50&height=50" in eine etwas benutzerfreundlichere URL "test.jpg" ändern kann oder gibt es da eine andere Methode?
http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html
http://www.modrewrite.de/

Weiterhin, verwende $_GET, $_POST etc. und verlasse Dich nicht blind auf deren Inhalt. Prüfe, ob der User auf die angegebene Datei zugreifen darf (mit ../../../ landet er sonst schnell im Root-Verzeichnis oder sonst wo, wo er nichts zu suchen hat).

http://de2.php.net/variables.predefined

11.18. Wie erkenne ich fehlerhafte/fehlende Eingaben?
http://php-faq.de/q/q-formular-verarbeitung.html
 
Alt 27.07.2006, 18:53  
Benutzer
 
Registriert seit: 26.01.2005
Beiträge: 30
hans.karl2
Standard

Danke für deine Anregungen.

Auf der Seite mit URL Rewriting habe ich nichts für PHP gefunden, ich will ja auch nur wissen, ob das überhaubt geht, dass ich dem Browser schönere URLs für die Bilder zurückliefere als rießige GET Konstrukte (vielleicht findet jemand ja auch einen brauchbaren PHP Code, ich jedenfalls habe noch keinen gefunden).

Ich verwende $HTTP_GET_VARS deshalb, weil das auch in früheren PHP Versionen vorhanden ist. Ich wollte auch deren Inhalt überprüfen (siehe Kommentare mit isset bzw. Wertebereichsüberprüfungen werde ich noch programmieren, das gepostete Skript sollte nur einmal ein Test sein, ob meine Vorstellungen so funktionieren, wie ich mir das vorstelle). Ich habe jedoch herausgefunden, dass wenn ich die isset() - Konstrukte entkommentiere, dass dann die Bildanzeige nicht funktioniert (was kann da die Ursache sein?).
hans.karl2 ist offline  
Alt 27.07.2006, 19:01  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von hans.karl2
Auf der Seite mit URL Rewriting habe ich nichts für PHP gefunden, ich will ja auch nur wissen, ob das überhaubt geht, dass ich dem Browser schönere URLs für die Bilder zurückliefere als rießige GET Konstrukte (vielleicht findet jemand ja auch einen brauchbaren PHP Code, ich jedenfalls habe noch keinen gefunden).
Natürlich hast du da nichts über PHP gefunden, weil es nichts mit PHP zu tun hat... Das ist ein Apache-Modul und tut genau das, was du suchst, also versuchs garnicht erst irgendwie in PHP.

Zitat:
Zitat von hans.karl2
Ich verwende $HTTP_GET_VARS deshalb, weil das auch in früheren PHP Versionen vorhanden ist.
Zitat:
Zitat von Manual
Ab Version 4.1.0 stehen in PHP eine zusätzliche Reihe vordefinierter Arrays zur Verfügung, die Variablen vom Webserver (gegebenenfalls), von der Umgebung und von Benutzereingaben enthalten. Diese neuen Arrays sind insofern etwas sehr Spezielles, als sie automatisch global sind -- d.h., sie stehen automatisch in jedem Bereich zur Verfügung. Deshalb sind sie auch bekannt als 'Autoglobale' oder 'Superglobale'. (Es gibt in PHP keinen Mechanismus für benutzerdefinierte Superglobale.) Die Superglobale werden nachfolgend aufgelistet, aber für eine Liste ihres Inhalts und die weitere Diskussion vordefinierter Variablen und ihres Wesens lesen Sie bitte den Abschnitt Reservierte vordefinierte Variablen. Außerdem werden Sie feststellen, dass die alten vordefinierten Variablen ($HTTP_*_VARS) noch existieren. Seit PHP 5.0.0 können Sie die Registrierung der langen von PHP vordefinierten Arrays mit der Konfigurationsoption register_long_arrays abschalten.
Benutz $_POST oder $_GET Wenn jemand das abschaltet ist dumm gelaufen und anders herum, wenn sich jemand seine Scripte auf PHP <4.1.0 laufen lässt, is das dumm ^^
Zitat:
Zitat von hans.karl2
Ich habe jedoch herausgefunden, dass wenn ich die isset() - Konstrukte entkommentiere, dass dann die Bildanzeige nicht funktioniert (was kann da die Ursache sein?).
Falsche Syntax, zähl mal die Klammern
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 27.07.2006, 19:02  
XLB
Erfahrener Benutzer
 
Registriert seit: 31.07.2005
Beiträge: 1.126
PHP-Kenntnisse:
Fortgeschritten
XLB
Standard

Bei den IF/isset()-Konstrukten fehlt jeweils eine schliessende Klammer ...

ist :

if(isset($HTTP_GET_VARS["width"])

soll:

if(isset($HTTP_GET_VARS["width"]))

Müsste eigentlich einen entsprechenden Fehler/eine Notice geben ...?
XLB ist offline  
Alt 27.07.2006, 19:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Zitat:
Zitat von KingCrunch
Benutz $_POST oder $_GET Wenn jemand das abschaltet ist dumm gelaufen und anders herum, wenn sich jemand seine Scripte auf PHP <4.1.0 laufen lässt, is das dumm ^^
Zitat:
Zitat von hans.karl2
Ich habe jedoch herausgefunden, dass wenn ich die isset() - Konstrukte entkommentiere, dass dann die Bildanzeige nicht funktioniert (was kann da die Ursache sein?).
Falsche Syntax, zähl mal die Klammern
Ja es ist dumm, aberich finde es löblich, abwärtskompatibel (selbst für solche extremen Versionen) zu programmieren. Zwar soll im Dezember möglicherweise schon eine Alpha-Version von PHP 6 (4.0, 4.3, 5, 5.1, ... 6!) erscheinen, aber glaub mir, es gibt sie noch die 4.0.x-er Versionen und das Umstellen auf eine neuere PHP-Version macht höllisch viel Arbeit (register_globals, session_register, ..)
Und da man für diese Server trotzdem noch ab und zu Mini-Projekte online stellt, ist da jeder abstrakte Codeschnipsel, der auch für solche Uralt-Versionen funktioniert sehr sehr willkommen
Zergling-new ist offline  
Alt 27.07.2006, 19:27  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 2.150
Guradia befindet sich auf einem aufstrebenden Ast
Standard

Anderer Ansatz:
http://e007.masstisch.de/media/Image....h297.fill.jpg

Man schaue auf den Dateinamen :3

Mit Kompatibel hat es meine Programmierung aber nicht.
PHP5 und imagemagick .. nicht gerade überall verfügbar ^^
Guradia ist offline  
Alt 27.07.2006, 19:30  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von Zergling
[...] und das Umstellen auf eine neuere PHP-Version macht höllisch viel Arbeit (register_globals, session_register, ..)
Da ist es doch gerade falsch sooo "alt" zu schreiben ^^ Ich meine, wenn man jetzt noch auf sooo alte Versionen schreibt, macht es doch einen Umstieg nur umso schwerer. Ich red ja nich davon gleich auf PHP5 zu hopsen (wobei das nich das schlechteste wär ), bei Wechsel innerhalb der 4.x-Versionen halten sich die Änderungen ja auch eher im überschaubaren Rahmen.

Ich bin ja auch immer für Abwrtskompatibilität, aber meiner Meinung nach, sollte es nicht so weit gehen, dass es auf neuen nicht mehr funktioniert Wär schon ironisch, wenn ein brandfrisches Script auf den neusten Systemen nicht läuft und dabei achtet PHP selbst auch viel auf Kompatibilität innerhalb der Versionen.

Ausserdem sollte man es nicht übertreiben: PHP4.1.0 gibt es laut Changelog seit dem 10 Dezember 2001 ..

PS: Jetzt im Dezember schon? ^^ Gibts schon ein aktuelleres (wahrscheinlich inoffizielles) Changelog?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 28.07.2006, 04:06  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Hi.

Also 4.0.*-kompatibel zu programmieren ist schon ein ziemlicher Unfug. Als ob es weniger Aufwand wäre, die PHP-Anwendungen (nach und nach) weiterzuentwickeln (zumindest, wenn diese ordentlich strukturiert und, also in dem Fall z.B. ein Request-Objekt haben), als die ganzen sicherheitskritischen Bugs in PHP selbst von Hand reinzufriemeln. Mich nervt es ja schon, wenn ich selten nochmal was für einen Server mit < 5.* programmieren muss.

Aber zum Thema:

Du solltest die Bilder nicht bei jedem Aufruf neu runterrechnen, sondern die Thumbnals zwischenspeichern. Mit mod_rewrite kannst du z.B. ach festlegen, dass eine URI nur dann umgeschrieben werden soll, wenn diese nicht auf eine existierende Datei zeigt (Modifikator f).

Das ist mitunter etwas tricky, denn der Code-Teil, der weiß, auf welche Maximal-Maße ein Bild runtergerechnet werden muss kann mitunter keine eindeutige Adresse für das fertige Bild definieren (oder zumindest eben keine schöne, also kurze Adresse, da womöglich andere Module auch auf den Code-Teil zugreifen, der die Thumbs erstellt) und auf der anderen Seite hat der Code-Teil, der womöglich aufgerufen wird, wenn das Vorschaubild nicht existiert (z.B. Cache geleert) womöglich keine Info über die Maße auf die er das Originalbild runterrechnen muss. Und dazu muss auch noch der Part, der den img-Tag ausgibt, nicht nur die Maximal-Maße für eine proportionale Skalierung haben, sondern eben auch die tatsächlichen Maße des Vorschaubildes.

Ich hab das gerade heute ohne Datenbank umgesetzt und musste da ziemlich rumpfuschen.

Aber für eine einfache Bildergallerie ist das sicher kein Problem, weil du da ja weder unterschiedliche Module hast, noch den ganze Kontext-Krempel und auch keine Default-Bilder.

Dort würde ich aber auch etwa so vorgehen:

- Beim Hochladen Original speichern und Typ festhalten;
- beim Ausgeben des img-Tags ggf. Thumbnail erstellen und in den öffentlichen Ordner legen (das Original wird bei einer Gallerie ja auch schon irgendw da liegen) und die Werte für den img-Tag auslesen (aus der Bild-Datei oder der Datenbank);
- beim Zugriff auf ein nicht vorhandenes Bild auf ein Skript umleiten (mod_rewrite) und von dem, falls möglich ein neues Vorschaubild erstellen lassen oder ein graues Pixel-Bild oder so ausspucken.

Noch ein paar Anmerkungen zu deinem Skript:
- Anstatt imagecreate() besser imagecreatetruecolors() verwenden;
- ebenso imagecopyresampled() ansttt imagecopyresize();
- image/jpeg anstatt image/jpg

Hier mal noch ein Schnipsel von mir zum proportionalen Verkeinern auf eine Maximal-Höhe bzw. -Breite:
PHP-Code:

    
public function reduceProportional($iMaxWidth$iMaxHeight)
    {
        if (!isset(
$this->rImage))
            return 
false;

        
$fFactorWidth  min(1$iMaxWidth  $this->iWidthOrig);
        
$fFactorHeight min(1$iMaxHeight $this->iHeightOrig);

        
$iNewWidth  = (int) round($this->iWidthOrig $fFactorHeight);
        
$iNewHeight = (int) round($this->iHeightOrig $fFactorWidth);

        switch (
true) {

            
// not too large
            
case $this->iWidthOrig <= $iMaxWidth
                
&& $this->iHeightOrig <= $iMaxHeight:
            break;

            
// too wide
            
case $this->iWidthOrig $iMaxWidth
                
&& $this->iHeightOrig <= $iMaxHeight:

            
$this->iWidth  $iMaxWidth;
            
$this->iHeight $iNewHeight;
            break;

            
// too high
            
case $this->iWidthOrig <= $iMaxWidth
                
&& $this->iHeightOrig $iMaxHeight:

            
$this->iWidth  $iNewWidth;
            
$this->iHeight $iMaxHeight;
            break;

            
// too large in both dimensions

            // width factor is smaller
            
case $fFactorWidth <= $fFactorHeight:

            
$iNewWidth round($this->iWidthOrig $fFactorWidth);
            
$this->iWidth  $iNewWidth;
            
$this->iHeight $iNewHeight;
            break;

            
// height factor is smaller
            
default:

            
$iNewHeight round($this->iHeightOrig $fFactorHeight);
            
$this->iWidth  $iNewWidth;
            
$this->iHeight $iNewHeight;
            break;
        }

        if (
$this->sizeChanged()) {
            
$this->rImage imagecreatetruecolor($this->iWidth$this->iHeight);

            
imagecopyresampled(
                
$this->rImage,
                
$this->rImageOrig,
                
0,
                
0,
                
0,
                
0,
                
$this->iWidth,
                
$this->iHeight,
                
$this->iWidthOrig,
                
$this->iHeightOrig
            
);
        }

        return 
true;
    } 
Basti
Basti ist offline  
Alt 31.07.2006, 19:59  
Benutzer
 
Registriert seit: 26.01.2005
Beiträge: 30
hans.karl2
Standard

Danke für die zahlreichen Antworten. Ein paar Fragen hätte ich da aber noch:

Kann man in PHP einen String dahingehend überprüfen, ob er eine Zahl ist? Ich weiß schon, wie man einen String parst:
PHP-Code:
$var = (integer) '10a'
Ich will aber, dass ich überprüfen kann, ob der String eine gültige Zahl enthält, also im obigen Beispiel sollte ich irgendwie mitkriegen, dass das eine falsche Zahl ist. Eine Funktion ähnlich wie in C strotol().

Meine zweite Frage bezieht sich auf das URL rewriting:
Wie kann ich nun in meinem Skript einbauen, dass dieses Skript nun z.B. "hallo.php" statt in Wirklichkeit "bild.php" heißt? Ich will nämlich, dass wenn der User auf "Bild speichern" klickt, dass er dann den richtigen Bildnamen angezeigt bekommt.
hans.karl2 ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Templatesystem mit Funktionen und Variablen drin? BartTheDevil89 PHP Tipps 2008 6 01.07.2008 09:32
TinyMCE Editor mit GD Grafik rezix PHP Tipps 2008 8 18.12.2007 22:46
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
eine Variable für alle Funktionen definieren Wing PHP Tipps 2007 16 24.06.2007 21:02
Funktionen in Funktionen - ist das gut? Schneckenkind PHP Tipps 2006 23 10.06.2006 13:39
[Erledigt] Grafik in Scheiben schneiden PHP Tipps 2006 6 02.05.2006 18:23
Text und Grafik zentriert in einer Zeile php_frage HTML, Usability und Barrierefreiheit 5 26.04.2006 12:48
Grafik drucken PHP Tipps 2006 13 24.02.2006 23:48
Globale Variabeln in Funktionen finerip PHP Tipps 2007 3 28.11.2005 16:00
Dynamischer Text in einer Grafik per Formular einfügen PHP Tipps 2005-2 2 19.08.2005 00:55
Grafik über mehrere Zellen einer Tabelle neodrei HTML, Usability und Barrierefreiheit 9 18.08.2005 19:26
in zelle oben text und unten grafik am rand janni HTML, Usability und Barrierefreiheit 4 29.06.2005 23:35
Eure Ideen sind gefragt: eigene Funktionen verwalten PHP-Fortgeschrittene 12 17.01.2005 15:00
Grafik in Grafik einfügen Filewalker PHP Tipps 2004 3 20.06.2004 14:04
Funktionen Erklärung TheSkaterFriend PHP Tipps 2004 14 11.06.2004 22:05

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
funktionen überprüfen, auf funktion prüfen, funktion überprüfen, existenz einer funktion überprüfen, auf funktion überprüft, funktion überprüft, gleichungen überprüfen, auf funktion überprüfen, funktionalität überprüft, funktionen eingeben überprüfen, auf funktion zu prüfen, proportionale funktion erklärung, auf funktion güberprüft, funktionüberprüfer, überprüfen einer funktion, wie überprüfe ich eine funktion=, funktionalität überprüfen, überprüfen von funktionen, üperprüfen von funktionen, und oder funktionen prüfen

Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.