ubuntuusers.de

Website mit Perl oder PHP programmieren?

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

imho

(Themenstarter)

Anmeldungsdatum:
2. Februar 2006

Beiträge: 427

Moin,

also Ruby und Python etc. fallen leider raus, weil man das bei dem Provider extra dazu kaufen müsste. Im Paket enthalten sind PHP und Perl, weswegen ich das Projekt in einer der beiden Sprachen auch realisieren werde. Die Frage ist nur: In welcher der beiden Sprachen...

Grüße,
imho

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

imho hat geschrieben:

also Ruby und Python etc. fallen leider raus, weil man das bei dem Provider extra dazu kaufen müsste. Im Paket enthalten sind PHP und Perl, weswegen ich das Projekt in einer der beiden Sprachen auch realisieren werde. Die Frage ist nur: In welcher der beiden Sprachen...

Ich bin beleibe kein Freund von Perl, aber immer noch besser Perl als PHP. Perl hat wenigstens vernünftige Webframeworks und verfolgt nicht diesen kruden Ansatz, Code in die Präsentation einzubetten.

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

nille hat geschrieben:

Ich will PHP jetzt hier nicht schön reden aber verteufeln sollte man es auch nicht.
Ihr habt recht das PHP für Fehler einladend ist aber dennoch ist dafür immer noch der Admin ( der z.B. die register_globals auf ON setzt ) und die Person verantwortlich die es so Schreibt.
Und nur weil ich mich jetzt ein wenig für PHP einsetzt heisst es nicht das ich es auch benutzen würde 😉

Wenn du da ein wenig offen bist könnte ich dich mal ein wenig im Quellcode stöbern lassen den ich hier warten und debuggen muss, das dürfte deine Meinung ändern.
Ich muss register_globals an lassen, ich kann nicht das gesamte 'eigene kleine CMS' umschreiben, das sind mehrere tausend Zeilen mies wartbarer und nicht portabler PHP Code mit inline HTML, haufenweise

<a href="<? echo substr(4,7,$foo) ?> ><?echo $mysql_query('SELECT url from foobar WHERE baz=7') ?></a>

und vergleichbarem.

PHP unterstützt sowas, PHP-Tuts sind so geschrieben und die Anfänger lernen es so und schreiben in der Art dann auch große Projekte.
Dasselbe gilt für Sicherheitsrelevantere Dinge.

nille

Anmeldungsdatum:
16. August 2007

Beiträge: 792

@audax ich kann dich verstehen das du so einen "Hass" auf PHP hast. Der Code Teil sieht so aus als wenn da jemand alles in HTML zusammengeklickt hat und dann an die Dynamischen stellen PHP reinkopiert hat 😲 .

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

So fangen aber leider die meisten an. Auch die PHP Tuts die ich gemacht habe, das, was ich in der Schule gelernt habe, Zeug aus Foren, etc...all das fördert diesen Stil.

Das ist auch der Grund, warum PHP so beliebt ist. Man hat sehr schnelle Ergebnisse mit sehr wenig Aufwand und noch weniger Wissen. Und das auch noch, ohne Programmieren zu können.

Btw:
substr() ist eine schreckliche Funktion 😮
Das hat zwar nix mit dem Thema zu tun, aber mal ehrlich:
Sie ist hässlich und doof. Ich hasse substr().
[Ist mir gerade wieder viel zu oft begegnet...]

imho

(Themenstarter)

Anmeldungsdatum:
2. Februar 2006

Beiträge: 427

Hallo,

also ich habe mir eure Ratschläge zu Herzen genommen und zu einem Perl genommen und versuche auf eine Trennung zwischen HTML- und Perl-Code zu achten. Das Ergebnis sieht wie folgt aus:

pizza.html:

<html>
<head>
<title>Pizza bestellen - Formulardaten mit Perl auswerten.'</title>
</head>

<body>
<h2>Welche Pizza w&uuml;nschen Sie?</h2>

<form action="/cgi-bin/pizza.pl">

  <form action="input_checkbox.htm">
  <p>Kreuzen Sie die gew&uuml;nschten Zutaten an:</p>
  <p>
    <input type="checkbox" name="pizza" value="Margherita Spezial<br />"> Margherita Spezial<br />
    <input type="checkbox" name="pizza" value="Tonno mit Zwiebeln<br />"> Tonno mit Zwiebeln<br />
    <input type="checkbox" name="pizza" value="Hawaii"> Hawaii
  </p>

  <p>Extrawunsch: <input name="extra" size="50"></p>

  <input type="submit" value="Abschicken">

</form>

</body></html>

pizza.pl

#!/usr/bin/perl -w

use CGI qw(:standard);
use strict;

my @pizza = param('pizza');
my $extra = param('extra');

my $bestellung = <<HERE_BESTELLUNG;

<html>
<head>
<title>Pizza bestellen - Formulardaten mit Perl auswerten.'</title>
</head>

<body>
<h2>Ihre Bestellung:</h2>
<p>Sie w&uuml;nschen eine Pizza:<br /><br /> @pizza</p>
<p>Extrawunsch: $extra</p>

</body></html>
HERE_BESTELLUNG

print header, $bestellung;

Wie kann ich anstatt einer weiteren HTML-Seite möglichst unaufwendig ein PDF generieren? Es soll ja ganz einfach mit dem Modul HTML::HTMLDoc gehen. Nur leider ist das Modul im Angebot des Hosters nicht enthalten. Gibt es noch andere Möglichkeiten?

Grüße,
imho

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Das sieht ja schonmal viieeel besser aus. Jetzt solltest du dir vllt noch Cathalyst [oder so, das RubyOnRails für Perl halt] anschaun, das lohnt sich auch dafür.

Und CPAN Module kannst du eigentlich auch in deinem Home-Verzeichnis installieren. Frag mich nicht wie, schau auf perlmonks.org ☺

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

@audax
Catalyst wird ohne "h" geschrieben.
Und was sieht daran besser aus? Er hat den HTML Code im Perl Code eingebettet, das ist genauso schrecklich wie PHP. Ein Templating System wo zu viel Code drin ist.

Wenn man es richtig machen möchte dann nimmt man ein Templating System. Nur damit hast du eine vernünftige Trennung zwischen Code und layout.

Vorhande Templating Systeme:
HTML::Template (HT)
Template::Toolkit (TT)
HTML::Template::Compiled (HTC)
Petal

HT ist ziemlich simpel, und ist in knapp ner Stunde gelernt. Lohnt sich für den ersten Einstieg. Petal finde ich persönlich den größten Schrott, muss ich auf der Arbeit auch mit arbeiten, würde ich mir niemals anschauen gibt es aber für mehrere Sprachen (TAL). TT ( Nur "Template" als Perl Modul ) ist immer noch meiner meinung nach am besten. HTC ist eine starke erweiterung zu HT die Funktionalitäten von TT eingebaut hat und trotzdem noch kompatibel zu HT ist. ISt also ebenfalls empfehlenswerd.

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Sid Burn hat geschrieben:

@audax
Catalyst wird ohne "h" geschrieben.
Und was sieht daran besser aus? Er hat den HTML Code im Perl Code eingebettet, das ist genauso schrecklich wie PHP. Ein Templating System wo zu viel Code drin ist.

Er hat immerhin schonmal die Sprache gewechselt und damit den Grundstein gelegt für ein ordentliches Templating-System 😀

@imho:
Hör auf Sid, der kann das 😉

gunnicom

Anmeldungsdatum:
16. September 2006

Beiträge: 295

Muss nur mal kurz einwerfen, dass der Code nicht besser ist als vorher.
Fast genauso könnte er in PHP aussehen.
Ausserdem finde ich es schade, dass mal wieder über PHP hergezogen wird. PHP Programme/Seiten müssen nicht schlechter sein, als z.B. Perl oder was auch immer.
PHP hat wohl am ehestens einen schlechten Ruf, weil es leicht ist, daher durch viele Anfänger benutzt wird und natürlich Anfänger mehr Fehler schreiben.
Das es ein paar Dinge im Design von PHP gibt die schlecht sind (register_globals z.B.) möchte ich ja nicht bezweifeln, aber bei der Beachtung einiger Punkte kann man sehr wohl gut und sicher in PHP programmieren.
Mal davon abgesehen, dass viele Projekte in PHP geschrieben sind, viele Webhoster PHP anbieten und man daher oft garnicht die Wahl hat um PHP herumzukommen.
Also lieber _vernünftig_ PHP programmieren lernen, als etwas garnicht nutzen/anpassen zu können.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

Muss nur mal kurz einwerfen, dass der Code nicht besser ist als vorher.
Fast genauso könnte er in PHP aussehen.

Sagte ich ja schon ebenfalls.

PHP hat wohl am ehestens einen schlechten Ruf, weil es leicht ist, daher durch viele Anfänger benutzt wird und natürlich Anfänger mehr Fehler schreiben.

PHP hat deswegen einen schlechten Ruf, weil es einfach nur schlecht ist. 😉
Es ist in PHP verdammt einfach schnell Erfolge hinzubekommen und eine Dynamische Webseite hinzubekommen. Und das war auch schon der einzige Vorteil. Und diesen Vorteil kann man sogar sofort wieder in einem nachteil umändern.

Das es ein paar Dinge im Design von PHP gibt die schlecht sind (register_globals z.B.) möchte ich ja nicht bezweifeln, aber bei der Beachtung einiger Punkte kann man sehr wohl gut und sicher in PHP programmieren.

Ja, ein "Hello, World" geht sicherlich. 😉
Ansonsten hat PHP nicht nur ein paar Designschwächen.

- redundante Funktionen (schlechtes TIMTOWTDI)
- keine namensräume
- schlechtes (nicht vorhandenes) modul system
- über 3000 Funktionen im Core
- verdammt schlechte Dokumentation
- Verdammt Schlechte Datenbank API
- PHP sollte eigentlich ein Templating System sein, wo man innerhalb von HTML Code mischen kann.
Aber die Mischung von Code & Layout in einem ist gerade eben dies was man nicht tun sollte.
Sowas ist eine Programmierpraxis von vor jahr 2000.
- Sicherheitslücken (hiermit meine ich nicht was man als Programmierer falsch machen kann, sondern den PHP Interpreter selber der immer wieder Schwachstellen aufweist.)
- Die Sprache ist nicht konsistent
- kindercommunity

Naja nur ein paar Sachen. Mir fällt bestimmt noch mehr ein.

Mal davon abgesehen, dass viele Projekte in PHP geschrieben sind, viele Webhoster PHP anbieten und man daher oft garnicht die Wahl hat um PHP herumzukommen.

Vserver wo man die komplette Kontrolle hatt was installiert wird, und was nicht gibt es schon für 5€. Billiger bekommt man auch keine normalen Web Angebote. Ein grund deswegen kein Perl/Python/Ruby zu nehmen sehe ich hier nicht.

Also lieber _vernünftig_ PHP programmieren lernen, als etwas garnicht nutzen/anpassen zu können.

Lieber etwas vernünftiges lernen und es nutzen anstatt etwas zu Lernen was einen nur probleme verursacht.

Ich bin bei Programmiersprachen ja ziemlich offen und da kann jeder Nutzen was er möchte. Ob er nun C, Java, Perl, Python, Ruby, ... nutzt ist da volkommen egal. Aber PHP ist echt keine brauchbare Sprache. Ich würde es nichtmal als Sprache bezeichnen. PHP ist aus allem zusammengwürfelt (ähnlich wie Perl), aber die Entwickler von PHP haben so ziemlich alles falsch verstanden und nur Müll da hereingebaut.

Und nur so nebenbei. die 2€ Webhoster die PHP anbieten kannst du sowieso in die Tonne werfen. Wenn du eine vernünftige Seite bauen möchtest musst du in der Regel etwas mehr geld ausgeben. Und dann findet sich auch immer Hoster die Perl, Python oder sonstiges anbietet. Das es jetzt etliche billige Hoster gibt die PHP anbieten ist toll, aber wenn Interessiert es?

Ich nutze auch kein Windows nur weil es die Mehrheit nutzt. Und empfehle auch nicht sich mit Windows auseinander zu setzen weil es das überall gibt.

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

@imho
Hier ist eine Beispielimplementierung mit CGI::Application. Wie es besser wäre.

Als erstes unser Hauptmodul was alles macht.

/srv/Pizza.pm

package Pizza;
# Core Module
use strict;
use warnings;
use utf8;
use open ':utf8';
use open ':std';
# CPAN Module
# Vererbung
use base 'CGI::Application';

# Unsere Setup Routine, wird bei jedem Query ausgeführt
sub setup {
    my ($self) = @_;

    $self->mode_param('rm'            );  # variable das den Runmode angibt
    $self->start_mode('show'          );  # Der Start mode
    $self->tmpl_path ('/srv/templates');  # Pfad wo die Templates liegen
    $self->run_modes (                    # Unsere Runmodes mit Suborutinen verknüpfen
        'show'       => 'show',
        'bestellung' => 'bestellung',
    );
}

# Unser show runmode. Dies ist der StartRunmode
# wird also angezeigt wenn kein Runmode angegeben wurde
sub show {
    my ($self) = @_;

    # Da dies mehr oder weniger eine Statische Seite ist.
    # Wird geladen und sofort das gerenderte Template zurück gegeben
    return $self->load_tmpl->output;
}

# Unser "bestellung" Runmode, wertet eine bestellung aus
sub bestellung {
    my ($self) = @_;

    # CGI Objekt und HTML::Template Objekt laden
    my $cgi      = $self->query;
    my $template = $self->load_tmpl;

    # Uebergebene Werte auslesen
    my @pizza    = $cgi->param('pizza');
    my $extra    = $cgi->param('extra');

    # Pizza Array aufbereiten fuer HTML Template
    # muss bei TT nicht gemacht werden
    @pizza = map +{ pizza => $_ }, @pizza;

    # Die Werte unserem Template Objekt übergeben
    $template->param(
        pizza => \@pizza,
        extra => $extra,
    );

    # Das gerenderte Template zurück geben
    return $template->output;
}

1;

Jetzt unsere Templates:

/srv/templates/header.html

<html>
    <head>
        <title>Pizza bestellen - Formulardaten mit Perl auswerten.</title>
    </head>
<body>

/srv/templates/footer.html

</body>
</html>

/srv/templates/show.html

<TMPL_INCLUDE NAME="header.html">

<h2> Welche Pizza Wuenschen Sie?</h2>
<p>Kreuzen Sie die gew&uuml;nschten Zutaten an:</p>

<form action="/cgi-bin/pizza" method="POST">
    <input type="hidden" name="rm" value="bestellung" />

    <p>
        <input type="checkbox" name="pizza" value="Margherita Spezial"> Margherita Spezial<br />
        <input type="checkbox" name="pizza" value="Tonno mit Zwiebeln"> Tonno mit Zwiebeln<br />
        <input type="checkbox" name="pizza" value="Hawaii"> Hawaii
    </p>

    <p> Extrawunsch: <input name="extra" size="50"></p>

    <input type="submit" value="Abschicken">
</form>

<TMPL_INCLUDE NAME="footer.html">

/srv/templates/bestellung.html

<TMPL_INCLUDE NAME="header.html">

<h2>Ihre Bestellung</h2>
<p>Sie haben folgende Pizzen bestellt:</p>
<TMPL_LOOP NAME="pizza">
    <p> <TMPL_VAR NAME="pizza" ESCAPE="HTML"> </p>
</TMPL_LOOP>
<p>Extrawunsch: <TMPL_VAR NAME="extra" ESCAPE="HTML"> </p>

<TMPL_INCLUDE NAME="footer.html">

Jetzt unser Controller Skript:

/usr/lib/cgi-bin/pizza

#!/usr/bin/perl -T
use strict;
use warnings;
use utf8;
use open ':utf8';
use open ':std';
use lib '/srv/';
use CGI::Carp qw/fatalsToBrowser/;
use Pizza;

my $webapp = Pizza->new();
$webapp->run();

Das Controller Skript muss ausführbar sein. Ansonsten müssen alle Files die Besitzer und/oder gruppe von "www-data" sein. Wenn das ganze auf den lokalen Apache Webserver läuft kannst du die Seite nun aufrufen indem du "http://localhost/cgi-bin/pizza" aufrufst.

Das mag jetzt erstmal nach mehr aussehen, was es auch ist 😉, aber du hast so Code & layout getrennt. Du kannst z.B. das HTML Komplett umbauen. CSS hinzufügen etc. und musst keine einzige Perl Code Zeile anpassen.

Ansonsten kannst du neue Runmodes einfach hinzufügen indem du einfach eine Subroutine in der Pizza.pm erstellst und run_mode() in der setup Routine erweiterst. $self->load_tmpl() ohne argumente lädt dann automatisch das Template mit dem gleichen Subroutinen Namen und einem ".html" angehangen im default Template pfad.

Wenn du noch eine Datenbankverbindung etc. aufbauen möchtest dann gibt es dafür bereits fertige Plugins die das für dich machen, musst dann nur die nötigen DB Informationen übergeben. HTML::Template wird defaultmäßig bei CGI::Application genommen, es gibt aber Plugins für TT und andere Sachen.

Unter Debian wird CGI::Application und eine handvoll von Plugins durch die beiden Packete "libcgi-application-perl" und "libcgi-application-plugins-perl" bereit gestellt.

Ansonsten ist das ganze nur ein sehr sehr sehr leichtgewichtiges Framework was dir nur ein paar Grundaufgaben abnimmt und für eine Ordentliche Struktur sorgt. Mehr auch nicht. Aber mit den ganzen Plugins die es gibt kann man damit schon nette Sachen machen.

imho

(Themenstarter)

Anmeldungsdatum:
2. Februar 2006

Beiträge: 427

@Sid

Vielen Dank für die Skripte. Damit habe ich ja nu gar nicht gerechnet. Ich verstehe teilweise leider nur die Hälfte, kann aber doch nachvollziehen, was die einzelnen Funktionen etc. so machen sollen. Das ist echt großartig. Ich werde viel daran lernen können.

Ich habe es jetzt erstmal auf http://localhost laufen, es läuft prächtig, und ich werde mich ab morgen eingehender damit beschäftigen. BTW: Hast du ein Link zu einem Online-Tutorial bzw. PDF das sich mit HTML::Template oder mit CGI::Application beschäftigt? Bei Google konnte ich heute leider nicht so rechtes finden, meist nur kurze Erwähnung in Perl-Tutorials.

Wie ich aus der ausgegebenen HTML-Seite dann ein PDF stricke, das bekomme ich auch noch raus. Aber das hat noch Zeit. Erstmal geht's jetzt an den Partyplaner, da ich das Grundgerüst ja nun habe.

Vielen Dank nochmal,
imho

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Mach alles, was du tust, vor allem Web-Kram, richtig ordentlich. Mein Server hat gerade einen Tag lang Warez verteilt wegen mieser PHP Scripts oder einem 'verlorenen' PW.

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Lunar hat geschrieben:

Ich bin beleibe kein Freund von Perl, aber immer noch besser Perl als PHP. Perl hat wenigstens vernünftige Webframeworks und verfolgt nicht diesen kruden Ansatz, Code in die Präsentation einzubetten.

So ein Quatsch. Es gibt auch für PHP gute Webframeworks, und das schon seit längerer Zeit. Die Frage ist nur, ob man sie nutzt. Beschissenen Code kann man in jeder Programmiersprache schreiben...