andy89: include für Anfänger

Hallo,

ich hoffe ich bin in diesem Forum (php) richtig.

Ich habe ein Verständnisproblem zu Php und MySql.

Ich möchte zum ersten mal PHP, HTML und MYSQL trennen.
Diese Abfrage :
mysql_select_db($database_sammeln, $sammeln);
$query_abfrage1 = "SELECT id, was, org FROM sammeln";
$abfrage1 = mysql_query($query_abfrage1, $sammeln) or die(mysql_error());
$row_abfrage1 = mysql_fetch_assoc($abfrage1);
$totalRows_abfrage1 = mysql_num_rows($abfrage1);

möchte ich auslagern in eine include.php Datei
ich möchte diese Datei dann includieren, wie muss ich das machen.
Wie funktioniert der Aufruf in der sammlung.php Datei.

Als zweites
mysql_select_db($database_sammeln, $sammeln);
mysql_query("INSERT INTO sammlung  (
id , was, org
) values ('','".$_POST['was']."',".$_POST['org']."')");

Hier auch wie lagere ich die Datei aus, bisher machte ich das immer so:
if (isset($_POST['submit']){
mysql_select_db($database_sammeln, $sammeln);
mysql_query("INSERT INTO sammlung  (
id , was, org
) values ('','".$_POST['was']."',".$_POST['org']."')");
}

Wie müsste das jetzt aussehen? Ein Link zu einem Tutorials für BEGINNER würde-hoffe ich- reichen,

Vielen Dank
A

  1. echo $begrüßung;

    Ich möchte zum ersten mal PHP, HTML und MYSQL trennen.
    $abfrage1 = mysql_query($query_abfrage1, $sammeln) or die(mysql_error());

    Das erreichst du damit aber nicht, denn hier hat sich eine Ausgabe in den verarbeitenden Teil eingeschmuggelt, auch wenn diese nur im Fehlerfall erfolgt. Doch vielleicht möchte gerade dann der ausgebende Teil darauf reagieren und die Ausgabe ändern, woran du ihn aber mit dem die() wirksam hinderst.

    Diese Abfrage : [...]
    möchte ich auslagern in eine include.php Datei
    ich möchte diese Datei dann includieren, wie muss ich das machen.

    Ein include bindet den ausgelagerten Code direkt an der Stelle und in den Kontext ein, an der/dem das include notiert ist. Du erreichst damit keine Trennung, nur eine Auslagerung. Eine richtige Trennung ist es erst dann, wenn der Teil selbständig arbeiten kann und nur über genau definierte Schnittstellen seine Parameter bekommt und sein Ergebnis zurückliefert.

    Ansonsten ist include und Co. im PHP-Handbuch unter den Control Structures beschrieben.

    Als zweites
    mysql_select_db($database_sammeln, $sammeln);
    mysql_query("INSERT INTO sammlung  (
    id , was, org
    ) values ('','".$_POST['was']."',".$_POST['org']."')");

    Wie sieht es mit SQL-Injection bzw. kontextgerechter Behandlung aus? Siehe https://forum.selfhtml.org/?t=164946&m=1075556

    Wenn du wirklich eine Trennung möchtest, dann sollte der abgetrennte Teil mit beliebigen Daten und nicht nur mit dem $_POST-Array und festgelegten Feldnamen arbeiten können. Erstelle beispielsweise eine Funktion, die ein assoziatives Array entgegennimmt, aus dem die Abfrage zusammengebaut wird. Der aufrufende Teil muss allerdings dafür sorgen, dass das übergebene Array nur die gewünschten Key-Value-Paare enthält.

    Hier auch wie lagere ich die Datei aus, bisher machte ich das immer so:
    if (isset($_POST['submit']){
    mysql_select_db($database_sammeln, $sammeln);
    mysql_query("INSERT INTO sammlung  (
    id , was, org
    ) values ('','".$_POST['was']."',".$_POST['org']."')");
    }

    Prüfe zunächst die Eingabedaten auf Korrektheit und Vollständigkeit. Die sammelst du in einem Array und übergibst das der Funktion, die sich um das Schreiben in die Datenbank kümmert.

    Wenn du nun festgestellt hast, dass in der Insert-Funktion und in der Select-Funktion und in der Update-Funktion jedes Mal die Datenbankverbindung erneut hergestellt werden muss, und Parameter dafür zwar global verfügbar sind, aber ständig in den Funktionen bekanntgemacht werden müssen, könntest du an den Punkt kommen, an dem du die Vorteile objektorientierter Programmierung zu schätzen lernst. Aber bis dahin kannst du ja erstmal mit den einfachen Funktionen üben.

    Beachte dabei: Wann immer du gedenkst, das Schlüsselwort global oder Bezug auf eine globale Struktur (wie $_GET und Co.) nehmen zu müssen, ist an deinem Konzept was verkehrt, denn damit erreicht man keine Trennung sondern eine Abhängigkeit von äußeren Bedingungen.

    echo "$verabschiedung $name";

    1. Hallo,

      ich möchte mich für die ausführlichen Antworten bedanken, einiges verstehe ich einiges nicht.

      Was ich nicht verstehe, versuche ich zu erlernen.
      Unklar ist mir:

      .... Eine richtige Trennung ist es erst dann, wenn der Teil selbständig arbeiten kann und nur über genau definierte Schnittstellen seine Parameter bekommt und sein Ergebnis zurückliefert.

      ......
      Wenn du wirklich eine Trennung möchtest, dann sollte der abgetrennte Teil mit beliebigen Daten und nicht nur mit dem $_POST-Array und festgelegten Feldnamen arbeiten können. Erstelle beispielsweise eine Funktion, die ein assoziatives Array entgegennimmt, aus dem die Abfrage zusammengebaut wird. Der aufrufende Teil muss allerdings dafür sorgen, dass das übergebene Array nur die gewünschten Key-Value-Paare enthält.

      Wenn du nun festgestellt hast, dass in der Insert-Funktion und in der Select-Funktion und in der Update-Funktion jedes Mal die Datenbankverbindung erneut hergestellt werden muss, und Parameter dafür zwar global verfügbar sind, aber ständig in den Funktionen bekanntgemacht werden müssen, könntest du an den Punkt kommen, an dem du die Vorteile objektorientierter Programmierung zu schätzen lernst. Aber bis dahin kannst du ja erstmal mit den einfachen Funktionen üben.

      Beachte dabei: Wann immer du gedenkst, das Schlüsselwort global oder Bezug auf eine globale Struktur (wie $_GET und Co.) nehmen zu müssen, ist an deinem Konzept was verkehrt, denn damit erreicht man keine Trennung sondern eine Abhängigkeit von äußeren Bedingungen.

      Das versuche ich morgen nachzuvollziehen, ich sitze nun schon 12 stunden am Rechner.
      Nur noch soviel, meine POST oder GET-werte wandel ich in der Regel vor dem Insert so um.

      $value = addslashes($_POST['value']);
      ich dachte das reicht gegen SQL injction

      Formulare prüfe ich auf diese Art
      if( isset( $submit ) )
        {
          if( $var== "" ) { $error[0] = "Fehler."; }
      }
      if(!count($error)) {
      //alles gut
      }

      Wie gesagt, ich lerne.

      Viele Grüße
      A

      1. echo $begrüßung;

        Unklar ist mir:

        .... Eine richtige Trennung ist es erst dann, wenn der Teil selbständig arbeiten kann und nur über genau definierte Schnittstellen seine Parameter bekommt und sein Ergebnis zurückliefert.

        Das grobe Ziel der Auftrennung nach dem EVA-Prinzip sollte einhergehen mit der Schaffung und Nutzung von wiederverwendbaren Code-Teilen. Wenn du Teile deiner Anwendung so verallgemeinern kannst, dass sie auch in anderen Anwendungen ohne Anpassung verwendet werden können, musst du sie dort nicht erneut erfinden. Anpassen von kopierten Codeteilen fällt auch weg und ebenso hat man nur noch eine Stelle zu pflegen, falls sich Fehler herausstellen.

        Wenn du dein INSERT INTO table (foo, bar) VALUES ($foo, $bar) in eine Funktion kippst, bleibt es ein anwendungsspezifischer Codeteil, der im nächsten Projekt nicht wiederverwendet werden kann. Schreibst du eine Funktion, die dir ein INSERT-Statement aus beliebigen übergebenen Parametern zusammenbaut, dann kannst du diese woanders erneut und ohne Änderungen verwenden.

        Nur noch soviel, meine POST oder GET-werte wandel ich in der Regel vor dem Insert so um.
        $value = addslashes($_POST['value']);
        ich dachte das reicht gegen SQL injction

        addslashes() ist eine allgemeine Funktion. Besser ist es, die speziell auf MySQL abgestimmte Funktion mysql_real_escape_string() zu verwenden.

        Formulare prüfe ich auf diese Art
        if( isset( $submit ) )

        PHP stellt die Formularwerte in $_GET und $_POST zur Verfügung. Auf register_globals basierende Varianten sind nicht generell übertragbar. Weder zwischen zwei PHP-Installationen noch sind sie zukunftssicher. Und bei unzureichenden Variableninitialisierungen sind sie auch noch sicherheitstechnisch unsicher.

        {
            if( $var== "" ) { $error[0] = "Fehler."; }
        }
        if(!count($error)) {
        //alles gut
        }

        Das ist doch schon mal ein Anfang, um Verarbeitung und dabei entstehende Fehlermeldungen von der Ausgabe zu trennen. Du musst das nun auch noch bei den bisherigen die()-Verwendungen in einer adäquaten Weise lösen.

        echo "$verabschiedung $name";

        1. Hallo,

          für heute sag ich ersmal vielen Danke für die Erklärungen.

          Auf register_globals basierende Varianten sind nicht generell übertragbar....Kannst Du mir bitte ein Beispiel zeigen,Link würde reichen.

          Weil ich dachte immer "Superglobale" Arrays sind gut für die Zukunft.

          Danke
          Andy

          1. echo $begrüßung;

            Auf register_globals basierende Varianten sind nicht generell übertragbar....Kannst Du mir bitte ein Beispiel zeigen,Link würde reichen.

            register_globals steht auf der Abschussliste, und das schon seit vielen PHP-Versionen. Doch bei den meisten Providern ist es immer noch zumindest für PHP4 eingeschaltet, damit alte Scripts, die darauf setzen, weiterhin laufen.

            Weil ich dachte immer "Superglobale" Arrays sind gut für die Zukunft.

            Das sind sie auch, nur verwendetest du sie in deinem Beispiel nicht.

            echo "$verabschiedung $name";

  2. Mahlzeit,

    Diese Abfrage :
    mysql_select_db($database_sammeln, $sammeln);
    $query_abfrage1 = "SELECT id, was, org FROM sammeln";
    $abfrage1 = mysql_query($query_abfrage1, $sammeln) or die(mysql_error());
    $row_abfrage1 = mysql_fetch_assoc($abfrage1);
    $totalRows_abfrage1 = mysql_num_rows($abfrage1);

    möchte ich auslagern in eine include.php Datei
    ich möchte diese Datei dann includieren, wie muss ich das machen.

    include.php:

      
    mysql_select_db($database_sammeln, $sammeln);  
    $query_abfrage1 = "SELECT id, was, org FROM sammeln";  
    $abfrage1 = mysql_query($query_abfrage1, $sammeln) or die(mysql_error());  
    $row_abfrage1 = mysql_fetch_assoc($abfrage1);  
    $totalRows_abfrage1 = mysql_num_rows($abfrage1);  
    
    

    aufgerufene_datei.php:

      
    include("include.php");  
    
    

    Persönlich möchte ich Dir allerdings DRINGEND davon abraten, irgendwelche Includes zu bauen, die allein beim Aufrufen schon diverse Aktionen starten - insbesonders Sachen in Datenbanken schreiben usw.

    Bastele dir am Besten eine Art "Bibliothek", in der Du häufig benötigte Code-Schnipsel in Funktionen oder Klassen auslagerst und die Du dann beliebig includieren und aufrufen kannst:

    include.php:

      
    function foobar_auslesen($query)  
    {  
    mysql_select_db($database_sammeln, $sammeln);  
    $query_abfrage1 = "SELECT id, was, org FROM sammeln";  
    $abfrage1 = mysql_query($query, $sammeln) or die(mysql_error());  
    $row_abfrage1 = mysql_fetch_assoc($abfrage1);  
    return mysql_num_rows($abfrage1);  
    }  
    
    

    aufgerufene_datei.php:

      
    include("include.php");  
      
    $totalRows_abfrage1 = foobar_auslesen($query_abfrage1);  
    
    

    Der nächste Schritt wäre dann, die Bibliotheken in ein Verzeichnis außerhalb Deines $DOCUMENT_ROOT zu verlagern, damit Sie nicht direkt aufgerufen werden können:

    /var/www/includes/include.php:

      
    ...  
    
    

    /var/www/htdocs/aufgerufene_datei.php:

      
    include("../includes/include.php");  
      
    $totalRows_abfrage1 = foobar_auslesen($query_abfrage1);  
    
    

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Guten Morgen EKKi,

      ich habe versucht das was Du erklärt hast nachzuvollziehen, den Teil den Du erklärt hast wollte ich auf ein Insert anwenden.

      function insert_sammlung($insert)
      if (isset($_POST['submit'])){
      mysql_query("INSERT INTO sammlung  (
      id , was, org
      ) values ('','".$_POST['was']."',".$_POST['org']."')");

      return mysql_query($insert);
      }
      }// zu isset($_POST['submit']))

      Ich weiß nicht wie ich diese Funktion aufrufen kann und ob das überhaupt stimmig ist.

      Danke auch
      Andy

      include.php:

      function foobar_auslesen($query)
      {
      mysql_select_db($database_sammeln, $sammeln);
      $query_abfrage1 = "SELECT id, was, org FROM sammeln";
      $abfrage1 = mysql_query($query, $sammeln) or die(mysql_error());
      $row_abfrage1 = mysql_fetch_assoc($abfrage1);
      return mysql_num_rows($abfrage1);
      }

      
      >   
      > aufgerufene\_datei.php:  
      >   
      > ~~~php
        
      
      > include("include.php");  
      >   
      > $totalRows_abfrage1 = foobar_auslesen($query_abfrage1);  
      > 
      
      

      Der nächste Schritt wäre dann, die Bibliotheken in ein Verzeichnis außerhalb Deines $DOCUMENT_ROOT zu verlagern, damit Sie nicht direkt aufgerufen werden können:

      /var/www/includes/include.php:

      ...

      
      >   
      > /var/www/htdocs/aufgerufene\_datei.php:  
      >   
      > ~~~php
        
      
      > include("../includes/include.php");  
      >   
      > $totalRows_abfrage1 = foobar_auslesen($query_abfrage1);  
      > 
      
      

      MfG,
      EKKi

      1. Guten Morgen EKKi,

        so gehts, danke.
         function insert_sammlung($insert)
         if (isset($_POST['submit'])){
         $query1=("INSERT INTO sammlung  (
         id , was, org
         ) values ('','".$_POST['was']."',".$_POST['org']."')");

        return mysql_query($query1);

        Andy