Jnnbo: Unübersichtlich und „aufgeblähter" Code?

0 69

Unübersichtlich und „aufgeblähter" Code?

Jnnbo
  • php
  1. 0
    frankx
  2. 0
    dedlfix
    1. 0
      Auge
      • meinung
      • php
      1. 0
        dedlfix
  3. 0
    Jörg Reinholz
    1. 0
      frankx
    2. 0
      Jörg Reinholz
      • programmiertechnik
      1. 0
        Jnnbo
        1. 0
          Jörg Reinholz
          1. 0
            Gunnar Bittersmann
            1. 0
              dedlfix
            2. 0
              Jörg Reinholz
      2. 0
        frankx
        1. 0
          Jörg Reinholz
        2. 0
          Auge
          1. 0
            Gunnar Bittersmann
      3. 1
        dedlfix
      4. 0
        Gunnar Bittersmann
        1. 2
          Christian Kruse
    3. 1
      Auge
      • meinung
      • php
    4. 0
      Gunnar Bittersmann
      1. 0
        Jörg Reinholz
        1. 0

          Curly Braces und Coding Style

          frankx
          1. 1
            Der Martin
            1. 1
              Sven Rautenberg
              1. 0
                Tabellenkalk
                1. 0

                  Curly Braces und Coding Style - Leerzeichen oder neue Zeile?

                  frankx
                  1. 0
                    Tabellenkalk
                    • php
                    • programmiertechnik
                    1. 0
                      frankx
                      1. 0

                        Curly Braces und Coding Style - PHP Coding Standards Fixer

                        frankx
                    2. 1
                      Sven Rautenberg
                      1. 0
                        dedlfix
                        1. 0
                          Sven Rautenberg
                          1. 0
                            dedlfix
  4. 0
    Auge
    1. 0
      Jnnbo
      1. 1
        Christian Kruse
        1. 0
          Jnnbo
          1. 1
            Christian Kruse
        2. 0
          Gunnar Bittersmann
          • programmiertechnik
          1. 0
            Christian Kruse
      2. 0
        Jörg Reinholz
        1. 0
          Jnnbo
          1. 0
            Jörg Reinholz
            1. 0
              Jnnbo
              1. 0
                Sven Rautenberg
                1. 0
                  BaBa
                  1. 0
                    Gunnar Bittersmann
                    1. 2
                      Christian Kruse
                    2. 0
                      Sven Rautenberg
                      1. 0
                        dedlfix
                        1. 0
                          Gunnar Bittersmann
                          1. 0
                            dedlfix
                        2. 0
                          Gunnar Bittersmann
                          1. 0
                            dedlfix
                          2. 0
                            Gunnar Bittersmann
                            • menschelei
                            1. 1
                              Der Martin
                              1. 0
                                Gunnar Bittersmann
    2. 0
      frankx
  5. 0
    frankx
    1. 0
      Jnnbo
      1. 0
        dedlfix
      2. 0
        frankx
  6. 0
    MudGuard
    1. 0
      Jnnbo
      1. 0
        MudGuard
    2. 0
      dedlfix
      1. 0
        frankx

Hallo an alle PHP Spezialisten,

jemand meinte heute zu mir ich würde unübersichtlichen und „aufgeblähter" Code schreiben, wollte mir aber nicht sagen warm und wie bzw. was ich ändern könnte. Meine Frage an euch, ist dieses wirklich der Fall und was könnte ich daran ändern?

Dieser Code ist für das INSERT und UPDATE zuständig:

	// Prüfen ob GET gesetztz ist
	if(isset($_GET['hersteller'])) {
			$hersteller = $_GET['hersteller'];	
	}
	
	// Datensatz aus der Datenbank auslesen
	$stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM web_hersteller WHERE h_id=?");
	$stmt->bind_param("s", $hersteller);
        $stmt->execute();
	$stmt->bind_result($h_id, $h_titel, $h_titelURL, $h_status);
	$stmt->fetch();
        $stmt->close();
	
	// Ziel URL festlegen
	$host = htmlspecialchars($_SERVER["HTTP_HOST"]);
	$uri  = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");
	$extra = "hersteller";

	if(isset($_POST['abschicken'])){

		if(empty($_POST['hersteller'])) {
				$errors[] = "Geben Sie bitte einen Hersteller an";
			}

		if(empty($_POST['url'])) {
				$errors[] = "Geben Sie bitte eine Hersteller URL an";
			}

	
	if(isset($_POST['abschicken']) && empty($errors)) {
		
		
	if(isset($_GET['hersteller'])) {

		if ($stmt = $mysqli->prepare("Update web_hersteller SET h_titel=?, h_titelURL=?, h_status=? WHERE h_id = ?"))
		 {    
				$h_titel 	= $_POST["hersteller"];
				$h_titelURL      = $_POST["url"];
				$h_status 	= $_POST["status"];
			
			$stmt->bind_param("ssss",	
						$h_titel,
						$h_titelURL,
						$h_status,
						$h_id
		 );

	}} // Ende $_GET['hersteller']
	
	else {	
				
	if ($stmt = $mysqli->prepare("INSERT INTO web_hersteller (h_titel, h_titelURL, h_status) VALUES (?, ?, ?)"))
			 {    
			 
				$h_titel 	= $_POST["hersteller"];
				$h_titelURL      = $_POST["url"];
				$h_status 	= $_POST["status"];
				
				$stmt->bind_param("sss", $h_titel, $h_titelURL, $h_status);
		}}

	$stmt->execute();
				header("Location: http://$host$uri/$extra");
						}
				else {
						echo $mysqli -> error;
					}
	};
	?>
  1. Ahoi Jnnbo

    Naja, du checkst mehrfach, ob Daten übermittelt wurden, das ließe sich zusammenfassen. Das Umkopieren der Variablen ist mMn. auch nicht nötig.

    Für best practices finde ich zudem das Zend Framework ja recht lehrreich.

    Dank und Gruß,

    bob from berlin

  2. Tach!

    jemand meinte heute zu mir ich würde unübersichtlichen und „aufgeblähter" Code schreiben,

    Mir fehlt da noch eine ganze Menge Fehlerbehandlung.

    wollte mir aber nicht sagen warm und wie bzw. was ich ändern könnte.

    Vielleicht ist gemeint, dass du eine Menge Code geschrieben hast, der alles erledigt, und ihn nicht in kleinere, übersichtliche Teile zerlegt hat.

    	// Prüfen ob GET gesetztz ist
    	if(isset($_GET['hersteller'])) {
    			$hersteller = $_GET['hersteller'];	
    	}
    

    Wenn hersteller nicht in $_GET ist, was ist dann? Beispielsweise mit der Variable $hersteller, und auch bezüglich des Programmflusses?

    	// Datensatz aus der Datenbank auslesen
    	$stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM web_hersteller WHERE h_id=?");
    	$stmt->bind_param("s", $hersteller);
            $stmt->execute();
    	$stmt->bind_result($h_id, $h_titel, $h_titelURL, $h_status);
    	$stmt->fetch();
            $stmt->close();
    

    Keine Fehlerbehandung. Heute scheint die Sonne, wird schon alles gut gehen.

    	// Ziel URL festlegen
    	$host = htmlspecialchars($_SERVER["HTTP_HOST"]);
    	$uri  = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");
    

    Was macht denn htmlspecialchars() hier? Das ist doch kein HTML-Kontext.

    	if(isset($_POST['abschicken'])){
    
    		if(empty($_POST['hersteller'])) {
    				$errors[] = "Geben Sie bitte einen Hersteller an";
    			}
    
    		if(empty($_POST['url'])) {
    				$errors[] = "Geben Sie bitte eine Hersteller URL an";
    			}
    		
    	if(isset($_POST['abschicken']) && empty($errors)) {
    		
    		
    	if(isset($_GET['hersteller'])) {
    
    

    Schon wieder Validierung? Warum kommt das nicht bevor die Verarbeitung anfängt?

    $stmt->execute();

    Immer noch keine Fehlerbehandlung.

    				header("Location: http://$host$uri/$extra");
    

    Jetzt sind hier HTML-gerechte Zeichen-Ersetzungen drin, die in HTTP gar keine Funktion haben. Es fehlt aber eine URL-gerechte Behandlung.

    				else {
    						echo $mysqli -> error;
    					}
    

    Wozu gehört der Teil denn? Ist die Formatierung des Codes bei dir so wie es hier im Forum zu sehen ist, oder ist das nur ein wie auch immer gelagertes Copy-Paste-Formatier-Problem?

    dedlfix.

    1. Hallo

      Das alles, insbesondere die fehlende Fehlerbehandlung, ist kritikwürdig und muss auch angesprochen werden. Aber hat das etwas mit „unübersichtlich“ oder „aufgebläht“ zu tun?

      Tschö, Auge

      --
      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
      1. Tach!

        Das alles, insbesondere die fehlende Fehlerbehandlung, ist kritikwürdig und muss auch angesprochen werden. Aber hat das etwas mit „unübersichtlich“ oder „aufgebläht“ zu tun?

        Na klar doch. Es ist nicht nur die Optik. Auch eine gute Strukturierung hat mit Übersichtlichkeit zu tun. Wenn die Fehlerbehandlung noch mit reinkommt, ist das ja nochmal eine Menge mehr Code, der ebenfalls zur Unübersicht beitragen kann. Deswegen muss man sich Gedanken machen, wie man den Code aufteilt und dann die Teile in selbständige Einheiten auslagert. Das muss am Ende noch nicht mal unbedingt wegen der möglichen Wiederverwendbarkeit geschehen. Manche Sachen sind zu individuell. Aber sie auszulagern, hilft die hauptsächliches von nebensächlichem zu separieren. Der Chef bestimmt die grobe Linie, den mühseligen Kleinkram machen die Mitarbeiter.

        Jeder halbwegs Begabte kann Code für Computer schreiben. Die Kunst ist, ihn für Menschen lesbar zu gestalten. - Hat mal irgendwer gesagt.

        dedlfix.

  3. Moin!

    jemand meinte heute zu mir ich würde unübersichtlichen und „aufgeblähter" Code schreiben, wollte mir aber nicht sagen warm und wie bzw. was ich ändern könnte.

    Naja, vieles davon ist definitiv Geschmackssache, aber

    1.) die Einrückungen sind schon mal ziemlich tief. Vier Leerzeichen genügen als Tab vollauf, vielen sogar nur zwei. Bedenke was passiert, wenn die Verschachtelungstiefe steigt. Die Zeilenlänge steigt unnötig an und damit der Stress dabei, zu prüfen ob man eigentlich überhaupt noch in der richtigen Zeile ließt, sozusagen im Quadrat der Zeilenlänge. Das ist sehr unschön.

    2.) Etwas wie

    if (flag) {
            if (foo=bar)
                            ...
                    {
    }}
    

    ist auch nicht "sauber", denn das wäre eigentlich als

    if ( flag && foo == bar )  {
        ...
    }
    

    zu notieren. Meinetwegen gerne auch:

    if ( 
      flag 
      && foo == bar 
    )  {
        ...
    }
    

    3.)

    if (function(foo)) {
    

    sieht als

    if ( function(foo) ) {
    

    besser aus.

    4.) Deine höchst ungewöhnliche Einrückung des schließenden Brackets:

    if () {
        ...
        }
    

    verwirrt schlicht und einfach. Das gehört sich so:

    if () {
       ...
    }
    

    Jörg Reinholz

    1. Moin!

      Ergänzend:

                      if(empty($_POST['hersteller'])) {
                                      $errors[] = "Geben Sie bitte einen Hersteller an";
                              }
      
                      if(empty($_POST['url'])) {
                                      $errors[] = "Geben Sie bitte eine Hersteller URL an";
                              }
      

      ist auch schrecklich, weil man derlei gut auf einer Zeile unterbringen kann.

      if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
      if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
      

      Jörg Reinholz

      1. Hallo Jörg,

        ist auch schrecklich, weil man derlei gut auf einer Zeile unterbringen kann.

        if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
        if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
        

        danke, ich werde mein Code im laufe des Nachmittags mal etwas verbessern und "richtig" einrücken. Deine Variante sieht schon sehr übersichtlich aus.

        1. Moin!

          if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
          if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
          

          danke,

          Da wäre aber noch was. Notiere mindestens:

          $errors=array();
          ...
          if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
          if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
          if (! empty($errors) {
             ...
          }
          

          Der Programmierer sucht sonst vergeblich den Array errors, an den Du was anhängst und PHP schmeisst sogar eine Notiz wenn es keinen der von Dir vorgesehenen Eingabefehler gab. Im Übrigen sind Deine Prüfungen etwas zu oberflächlich: Ein Leerzeichen reicht jeweils als Eingabe im HTML-Formular. Ich bin mir nicht sicher ob das Absicht ist, mag das aber nicht recht glauben.

          Jörg Reinholz

          1. @@Jörg Reinholz

            Da wäre aber noch was. Notiere mindestens:

            
            > $errors=array();
            > ...
            > if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
            > if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
            > if (! empty($errors) {
            >    ...
            > }
            
            

            Das Sammeln von Fehlermeldungen kommt mir zweifelhaft vor. Ich ahne Schlimmes.

            Was soll innerhalb von if (! empty($errors) {} stehen? Die Ausgabe aller Fehlermeldungen in einem Block?

            Nei-en!!

            Es ist dem Nutzer nicht zuzumuten, sich bei einer Fehlermeldung das entsprechende Eingabefeld selbst im Formular suchen zu müssen. Und womöglich mehrmals. Und das womöglich in einem längeren Formular, wo der Nutzer den Fehlermeldungsblock (am Seitenanfang) und die Eingabefelder nicht in einem Blick hat und hoch- und runterscrollen muss.

            Die Meldungen gehören jeweils direkt an die entsprechenden Eingabefelder, wo der „Fehler“ zu berichtigen ist.

            Da erscheint es mir unsinnig, die Fehler_meldungen_ in einem Array zu sammeln.

            LLAP

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
            1. Tach!

              Die Meldungen gehören jeweils direkt an die entsprechenden Eingabefelder, wo der „Fehler“ zu berichtigen ist.

              Da erscheint es mir unsinnig, die Fehler_meldungen_ in einem Array zu sammeln.

              Die kann man schon in einem Array sammeln, das muss dann nur anders aufgebaut sein:

              $errors[feldname][] = meldung1; $errors[feldname][] = meldung2;

              Und schon kann man die Meldungen dem Feld zuordnen.

              dedlfix.

            2. Moin!

              Das Sammeln von Fehlermeldungen kommt mir zweifelhaft vor. Ich ahne Schlimmes.

              Hier ging es mir zunächst einmal um die Schönheit, Übersichtlichkeit, (bitte nicht im Perl-Nerd-Style überzogene) Schlankheit also Lesbarkeit des Codes. Ich hatte nicht vor ein komplettes Handbuch zu schreiben. Aber der Fakt, dass da was an ein Array rangehangen wurde, welches "direkt aus der Sonne geflogen kam", hat mir gar nicht gefallen.

              Jörg Reinholz

      2. Ahoi Jörg

        if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
        if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
        

        Würd ich nicht: "Die öffnende Klammer wird in der selben Zeile geschrieben wie die Bedingungsanweisung. Die schließende Klammer wird immer in einer eigenen Zeile geschrieben. Jeder Inhalt innerhalb der Klammer muß durch Verwendung von vier Leerzeichen eingerückt werden."

        http://framework.zend.com/manual/1.12/de/coding-standard.coding-style.html Dank und Gruß,

        bob from berlin

        1. Moin!

          if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
          if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
          

          Würd ich nicht:

          Ich schon. Jedenfalls so lange das Ergebnis übersichtlicher ist als wenn man sich strikt an den Standard halten würde. Und gerade bei solchen Reihungen von if und jeweils genau einer nicht übermäßig langen Wertzuweisung ist es das.

          Jörg Reinholz

        2. Hallo

          if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
          if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
          

          Würd ich nicht: "Die öffnende Klammer wird in der selben Zeile geschrieben wie die Bedingungsanweisung. Die schließende Klammer wird immer in einer eigenen Zeile geschrieben. Jeder Inhalt innerhalb der Klammer muß durch Verwendung von vier Leerzeichen eingerückt werden."

          Wenn, wie Jörg vorschlägt, zwischen einzeiligen und mehrzeiligen Anweisungsblöcken unterschieden wird, ist diese Vorgabe Blödsinn.

          if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an";
          }
          // Das sieht nicht aus!
          
          // hier jedoch:
          // einzeilig …
          if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
          // … vs. mehrzeilig
          if(empty($_POST['hersteller'])) {
          	$errors[] = "Geben Sie bitte einen Hersteller an";
          	$badpoints++;
          }
          

          So geht's. Zudem ist es mMn gut unterscheidbar.

          Tschö, Auge

          --
          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
          1. @@Auge

            Würd ich nicht: "Die öffnende Klammer wird in der selben Zeile geschrieben wie die Bedingungsanweisung. Die schließende Klammer wird immer in einer eigenen Zeile geschrieben. Jeder Inhalt innerhalb der Klammer muß durch Verwendung von vier Leerzeichen eingerückt werden."

            Wenn, wie Jörg vorschlägt, zwischen einzeiligen und mehrzeiligen Anweisungsblöcken unterschieden wird, ist diese Vorgabe Blödsinn.

            Ich halte sie auch sonst für Blödsinn. Das schrieb ich schon. Und jetzt habe ich auch das passende Zitat wiedergefunden.

            LLAP

            --
            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      3. Tach!

        ist auch schrecklich, weil man derlei gut auf einer Zeile unterbringen kann.

        if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
        if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
        

        Finde ich nicht. Gern werden auch Variablen in Blöcken formatiert.

        $foo             = 'wert';
        $foobar          = 'wert'; 
        $foobarquxbazbal = 'wert'; 
        

        Sieht das nicht sauber formatiert aus? Es ist unsinnig. Jetzt bilden die Namen und die Werte Blöcke. Einen linken und einen rechten. Die Beziehung besteht aber nicht zwischen den linken Namen und zwischen den rechten Werten, sondern sie besteht zeilenweise. Der Wert gehört zum Namen.

        dedlfix.

      4. @@Jörg Reinholz

        ist auch schrecklich, weil man derlei gut auf einer Zeile unterbringen kann.

        
        > if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
        > if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
        
        

        Wozu dann bitte die Klammern?

        if(empty($_POST['hersteller'])) $errors[] = "Geben Sie bitte einen Hersteller an";
        if(empty($_POST['url']))        $errors[] = "Geben Sie bitte eine Hersteller URL an";
        

        Übrigens wird vielerorts genau davon abgeraten – aus gutem Grund.

        Wenn später noch eine Anweisung in den Block hinzukommt, will man dann den Code neu formatieren?

        Fehleranfäliger Code ist fehleranfällig.

        LLAP

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        1. Hallo Gunnar,

          ist auch schrecklich, weil man derlei gut auf einer Zeile unterbringen kann.

          > if(empty($_POST['hersteller'])) { $errors[] = "Geben Sie bitte einen Hersteller an"; }
          > if(empty($_POST['url']))        { $errors[] = "Geben Sie bitte eine Hersteller URL an"; }
          

          Wozu dann bitte die Klammern?

          Das weglassen von Klammern ist potentiell immer gefährlich, Bugs wie goto fail zeigen das sehr deutlich. Bitte nicht, auch nicht wenn man den if-Body auf der gleichen Zeile hat.

          LG,
          CK

    2. Hallo

      3.)

      if (function(foo)) {
      

      sieht als

      if ( function(foo) ) {
      

      besser aus.

      4.) Deine höchst ungewöhnliche Einrückung des schließenden Brackets:

      if () {
          ...
          }
      

      verwirrt schlicht und einfach. Das gehört sich so:

      if () {
         ...
      }
      

      Diese Beispiele sind aber auch nur Glaubensfragen. Wenn sie vorgegeben werden, bitteschön. Wenn ich aber alleine programmiere, ist die Lesbarkeit wichtig, wird aber an meine Codestyle-Bedürfnisse angepasst. Denn in diesem Szenario muss zuallererst ich mich im Code zurecht finden.

      Also bitte Vorsicht mit Ansagen wie „Das gehört sich so“!

      Tschö, Auge

      --
      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
    3. @@Jörg Reinholz

      Da muss ich dir doppelt widersprechen:

      1.) die Einrückungen sind schon mal ziemlich tief. Vier Leerzeichen genügen als Tab vollauf, vielen sogar nur zwei.

      Für Einrückungen: ein Tab (pro Hierarchieebene).

      Das gehört sich so:

      Nee, so:

      if ()
      {
         ...
      }
      

      Naja, vieles davon ist definitiv Geschmackssache

      Da widerspreche ich mal nicht.

      LLAP

      --
      „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
      1. Moin!

        Das gehört sich so:

        if () {
           ...
        }
        

        Nee, so:

        if ()
        {
           ...
        }
        

        Wir wissen beide, dass sich hier die Geister scheiden und auf dem Friedhof Rosenkriege führen.

        Jörg Reinholz

        1. Ahoi Jörg

          Moin!

          Das gehört sich so:

          if () {
             ...
          }
          

          Nee, so:

          if ()
          {
             ...
          }
          

          Wir wissen beide, dass sich hier die Geister scheiden und auf dem Friedhof Rosenkriege führen.

          Na, irgendwie ist das doch auch historisch bedingt. Zend-Framework, JSLint machen es auf der gleichen Zeile. Gibt es größere Frameworks in PHP oder JS, die die Curly Braces auf die nächste Zeile packen? Ein C-Relikt, wenn ich das recht verstehe.

          http://en.wikipedia.org/wiki/Indent_style#K.26R_style

          Dank und Gruß,

          bob from berlin

          1. Hallo,

            Wir wissen beide, dass sich hier die Geister scheiden und auf dem Friedhof Rosenkriege führen.

            Na, irgendwie ist das doch auch historisch bedingt. Zend-Framework, JSLint machen es auf der gleichen Zeile. Gibt es größere Frameworks in PHP oder JS, die die Curly Braces auf die nächste Zeile packen? Ein C-Relikt, wenn ich das recht verstehe.

            mag sein. Aber ich finde, die öffnende Klammer am Zeilenende zu schreiben, ist sozusagen die vorprogrammierte Unübersichtlichkeit. Blockbildende Symbole gehören meiner Ansicht nach an den Zeilenanfang (auf der jeweiligen Einrückungs-Ebene), sonst ist die Gefahr, dass sie übersehen werden, sehr groß.

            So long,
             Martin

            1. Moin!

              Hallo,

              Wir wissen beide, dass sich hier die Geister scheiden und auf dem Friedhof Rosenkriege führen.

              Na, irgendwie ist das doch auch historisch bedingt. Zend-Framework, JSLint machen es auf der gleichen Zeile. Gibt es größere Frameworks in PHP oder JS, die die Curly Braces auf die nächste Zeile packen? Ein C-Relikt, wenn ich das recht verstehe.

              mag sein. Aber ich finde, die öffnende Klammer am Zeilenende zu schreiben, ist sozusagen die vorprogrammierte Unübersichtlichkeit. Blockbildende Symbole gehören meiner Ansicht nach an den Zeilenanfang (auf der jeweiligen Einrückungs-Ebene), sonst ist die Gefahr, dass sie übersehen werden, sehr groß.

              Zum Glück ist diese Frage auch entschieden worden:

              The opening brace for the class MUST go on its own line; the closing brace for the class MUST go on the next line after the body.

              class ClassName
              {
              }
              
              

              The opening brace MUST go on its own line, and the closing brace MUST go on the next line following the body.

              class ClassName
              {
                  public function fooBarBaz($arg1, &$arg2, $arg3 = [])
                  {
                      // method body
                  }
              }
              

              There MUST be one space between the closing parenthesis and the opening brace.

              if ($expr1) {
                  // if body
              } elseif ($expr2) {
                  // elseif body
              } else {
                  // else body;
              }
              
              

              Wenn man sich an den PSR-2-Standard gewöhnt und hält, sieht der eigene Code immer so aus wie der Code andere Bibliotheken, die sich auch an PSR-2 halten - und da PSR die Zusammenfassung der Standards ist, auf die sich einige große Projekte geeinigt haben, spricht wenig dagegen, gerade bei diesen Diskussionsthemen endlos zu diskutieren und sich im Einzelfall anders zu entscheiden - weil: Funktionieren tut alles, aber es ist ein Gewinn an Codequalität, wenn es einheitlich aussieht.

              Ich arbeite mit PSR-2, meine Kollegen arbeiten mit PSR-2, externer Code ist PSR-2 - wenn man den Impuls des "aaaaber - dann muss ich mich ja umstellen, warum nicht stattdessen die anderen" überwunden hat, kann man sehr gut arbeiten.

              Grüße Sven

              1. Hallo,

                The opening brace MUST go on its own line,

                There MUST be one space between the closing parenthesis and the opening brace.

                Na was denn nun? Neue Zeile oder Leerzeichen?

                Gruß
                Kalk

                1. Ahoi Tabellenkalk

                  Hallo,

                  The opening brace MUST go on its own line,

                  There MUST be one space between the closing parenthesis and the opening brace.

                  Na was denn nun? Neue Zeile oder Leerzeichen?

                  Klassen und Methoden/Funktionen neue Zeile, Kontrollanweisung selbe Zeile, so habe ich es verstanden.

                  Dank und Gruß,

                  bob from berlin

                  1. Hallo,

                    Klassen und Methoden/Funktionen neue Zeile, Kontrollanweisung selbe Zeile, so habe ich es verstanden.

                    ah, ok. In den verlinkten URL stehts, wer ahnt denn, dass man die auch mitlesen soll?

                    So eine unterschiedliche Handhabe ist aber inkonsequent, oder?

                    Gruß
                    Kalk

                    1. Ahoi Tabellenkalk

                      Hallo,

                      Klassen und Methoden/Funktionen neue Zeile, Kontrollanweisung selbe Zeile, so habe ich es verstanden.

                      ah, ok. In den verlinkten URL stehts, wer ahnt denn, dass man die auch mitlesen soll?

                      So eine unterschiedliche Handhabe ist aber inkonsequent, oder?

                      Warum? Wie Sven schreibt haben sich ja einige große Projekte zusammen geschlossen, darunter auch Zend Framework 2.0 und habe sich auf den PSR -2 geeinigt. Ich vermute, dass die sich schon über Konsequenzen und Inkonsequenzen etc.pp. Gedanken gemacht haben. So schwer isses ja nicht ;-).

                      Dank und Gruß,

                      bob from berlin

                      1. Ahoi

                        gibt auch ein Fixer-Tool. Bzw. mehrere, u.a. auch Codesniffer.

                        Dank und Gruß,

                        bob from berlin

                    2. Moin!

                      Hallo,

                      Klassen und Methoden/Funktionen neue Zeile, Kontrollanweisung selbe Zeile, so habe ich es verstanden.

                      ah, ok. In den verlinkten URL stehts, wer ahnt denn, dass man die auch mitlesen soll?

                      So eine unterschiedliche Handhabe ist aber inkonsequent, oder?

                      Sie schafft optische Leerzeichen dort, wo man Blöcke (also Klassen, deren Methoden oder globale Funktionen) voneinander abtrennen möchte, und sorgt für einheitliche Kompaktheit dort, wo sich Code nicht über unnötig viele Zeilen verteilen soll.

                      Tatsächlich ist Codeformatierung für mich kein Thema, für sowas gibts Tools - beispielsweise einfach Ctrl-Alt-L in PhpStorm drücken - fertig. Oder einen Codestyle-Fixer als Pre-Commit-Hook in Git einbinden. Man muss sich nicht zwingend manuell mit dem Problem befassen.

                      Grüße Sven

                      1. Tach!

                        So eine unterschiedliche Handhabe ist aber inkonsequent, oder?

                        Sie schafft optische Leerzeichen dort, wo man Blöcke (also Klassen, deren Methoden oder globale Funktionen) voneinander abtrennen möchte, und sorgt für einheitliche Kompaktheit dort, wo sich Code nicht über unnötig viele Zeilen verteilen soll.

                        Na das Argument verstehe ich grad nicht. Der Abstand wird doch innerhalb der Blöcke erzeugt, also zwischen Methodensignatur und Code, und nicht um die Blöcke zu trennen. Dafür nimmt man Leerzeilen außerhalb.

                        Tatsächlich ist Codeformatierung für mich kein Thema, für sowas gibts Tools - beispielsweise einfach Ctrl-Alt-L in PhpStorm drücken - fertig. Oder einen Codestyle-Fixer als Pre-Commit-Hook in Git einbinden. Man muss sich nicht zwingend manuell mit dem Problem befassen.

                        Genau. Eine Tastenkombination und alles ist nach persönlichen Vorlieben lesbar formatiert. Oder auch gemäß Projektvorgabe. Leider ist das ein ausschließendes Oder, ich hab noch keine IDE gesehen, die zwei solcher Formatieroptionen auf kurzem Weg anbietet. Nur umständlich die Einstellungen ändern kann man da, wenn man es für andere Vorgaben/Vorlieben formatiert haben möchte.

                        dedlfix.

                        1. Moin!

                          Tatsächlich ist Codeformatierung für mich kein Thema, für sowas gibts Tools - beispielsweise einfach Ctrl-Alt-L in PhpStorm drücken - fertig. Oder einen Codestyle-Fixer als Pre-Commit-Hook in Git einbinden. Man muss sich nicht zwingend manuell mit dem Problem befassen.

                          Genau. Eine Tastenkombination und alles ist nach persönlichen Vorlieben lesbar formatiert. Oder auch gemäß Projektvorgabe. Leider ist das ein ausschließendes Oder, ich hab noch keine IDE gesehen, die zwei solcher Formatieroptionen auf kurzem Weg anbietet. Nur umständlich die Einstellungen ändern kann man da, wenn man es für andere Vorgaben/Vorlieben formatiert haben möchte.

                          Das Projekt könnte eine Datei .editorconfig anbieten. Dann stellt sich die darauf reagierende IDE automatisch korrekt ein. Vor allem toll für Encoding und Whitespace-Einrückung.

                          Grüße Sven

                          1. Tach!

                            Das Projekt könnte eine Datei .editorconfig anbieten. Dann stellt sich die darauf reagierende IDE automatisch korrekt ein. Vor allem toll für Encoding und Whitespace-Einrückung.

                            Ja, nur erfüllt die auch nicht meinen Wunsch. Die zwingt eher unabhängig von meinen Einstellungen, die ansonsten bei Alt+F8 in meinem PhpStorm greifen würden, die projektspezifische Formatierung auf. Ich hätte gern, dass zu Beginn und während meines Bearbeiten der Code nach meinen Vorlieben umformatiert wird und er beim Speichern die andere eine andere Formatierung erhält.

                            dedlfix.

  4. Hallo

    jemand meinte heute zu mir ich würde unübersichtlichen und „aufgeblähter" Code schreiben, wollte mir aber nicht sagen warm und wie bzw. was ich ändern könnte. Meine Frage an euch, ist dieses wirklich der Fall und was könnte ich daran ändern?

    Das Einzige, was mir auf Anhieb auffällt, ist, dass die Einrückung nicht konsistent ist. Das mag an einer eventuellen Vermischung von Leerzeichen und Tabs, die zur Einrückung benutzt wurden, liegen. Das fliegt hier halt auf, weil hier auch Tabs angezeigt werden und wohl eine andere Tiefe erzeugen als bei dir „zuhause“.

    Ansonsten sieht der Code übersichtlich aus und schon garnicht aufgebläht. Wobei das natürlich immer von der persönlichen Definition dieser Begriffe abhängt. Wenn dein Kritiker schon unnötige Leerzeilen nicht mag, kann sein Urteil auf seinen Maßstab bezogen nachvollziehbar sein. Frag ihn mal, was konkret er kritisiert.

    Tschö, Auge

    --
    Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!
    1. Hallo Auge,

      Das Einzige, was mir auf Anhieb auffällt, ist, dass die Einrückung nicht konsistent ist. Das mag an einer eventuellen Vermischung von Leerzeichen und Tabs, die zur Einrückung benutzt wurden, liegen. Das fliegt hier halt auf, weil hier auch Tabs angezeigt werden und wohl eine andere Tiefe erzeugen als bei dir „zuhause“.

      das liegt daran, wenn ich unterwegs bin, mache ich viel mit dem Handy, da habe ich leider keine Tabs, also muss ich mit Leerzeichen arbeiten, daheim wie jetzt gerade habe ich Tabs, das macht es um einiges einfacher, daher kommt auch das ständig wechseln von Tabs und Leerzeichen.

      1. Hallo Jnnbo,

        das liegt daran, wenn ich unterwegs bin, mache ich viel mit dem Handy, da habe ich leider keine Tabs, also muss ich mit Leerzeichen arbeiten, daheim wie jetzt gerade habe ich Tabs, das macht es um einiges einfacher, daher kommt auch das ständig wechseln von Tabs und Leerzeichen.

        Dann stell doch deinen Editor so ein, dass er bei drücken von Tab n Leerzeichen einfügt? Diese Mixtur von Tabs und Spaces ist nämlich wirklich schwer zu lesen, wenn man einen anders eingestellten Editor hat als du.

        LG,
        CK

        1. Hallo Christian,

          Dann stell doch deinen Editor so ein, dass er bei drücken von Tab n Leerzeichen einfügt? Diese Mixtur von Tabs und Spaces ist nämlich wirklich schwer zu lesen, wenn man einen anders eingestellten Editor hat als du.

          dann muss ich mal schauen wie ich dieses in "Brackets" und oder in "Sublime" umstellen / einstellen kann.

          1. Hallo Jnnbo,

            Dann stell doch deinen Editor so ein, dass er bei drücken von Tab n Leerzeichen einfügt? Diese Mixtur von Tabs und Spaces ist nämlich wirklich schwer zu lesen, wenn man einen anders eingestellten Editor hat als du.

            dann muss ich mal schauen wie ich dieses in "Brackets" und oder in "Sublime" umstellen / einstellen kann.

            Brackets kenne ich nicht, aber Sublime kann das. Die Version 2 auch.

            LG,
            CK

        2. @@Christian Kruse

          Dann stell doch deinen Editor so ein, dass er bei drücken von Tab n Leerzeichen einfügt?

          … dass er bei Drücken von n Leerzeichen einen Tab einfügt!

          Diese Mixtur von Tabs und Spaces ist nämlich wirklich schwer zu lesen, wenn man einen anders eingestellten Editor hat als du.

          Ja, Mixtur ist noch schrecklicher als Leerzeichen allein.

          LLAP

          --
          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
          1. Hallo Gunnar,

            Dann stell doch deinen Editor so ein, dass er bei drücken von Tab n Leerzeichen einfügt?

            … dass er bei Drücken von n Leerzeichen einen Tab einfügt!

            Mal von dem generelles Glaubenskrieg (denn mehr ist es wirklich nicht, siehe editor wars - und das ist das einzige, was ich zu diesem Thema sagen werde) abgesehen: er muss sich auf den kleinsten gemeinsamen Nenner einigen - und das ist hier das Handy.

            LG,
            CK

      2. Moin!

        das liegt daran, wenn ich unterwegs bin, mache ich viel mit dem Handy

        Boah! Ehrlich? Proggen auf dem Handy? Ich glaub, ich bin zu alt für sowas.

        Jörg Reinholz

        1. Hallo Jörg,

          Boah! Ehrlich? Proggen auf dem Handy? Ich glaub, ich bin zu alt für sowas.

          ich mach so gut wie alles auf dem Handy.

          1. Moin!

            ich mach so gut wie alles auf dem Handy.

            Ich weiß nicht so recht, ob die wertgeschätzte deutsche optische Industrie und die genialen schweizerischen Feinmechaniker zusammen in der Lage wären, mir die dafür benötigten Hilfsmittel zur Verfügung zu stellen. Aber Programmieren geht für mich unter 15 Zoll überhaupt ganz und gar nicht, mit 24 Zoll recht brauchbar und in gewissen Ausnahmesituationen klicke ich das Icon, welches

            xrandr --output DVI-I-0 --off --output HDMI-0 --off --output VGA-0 --mode 1280x1024 --right-of / DVI-I-1 --rotate normal --output DVI-I-1 --mode 1920x1080 --pos 0x0 --rotate normal --primary

            (als Einzeiler) zum Starten bringt. (Ich weiß auch, dass die Monitoreinstellungen dem einen oder anderen nicht genügen würden....)

            Jörg Reinholz

            1. Hallo Jörg,

              Ich weiß nicht so recht, ob die wertgeschätzte deutsche optische Industrie und die genialen schweizerischen Feinmechaniker zusammen in der Lage wären, mir die dafür benötigten Hilfsmittel zur Verfügung zu stellen. Aber Programmieren geht für mich unter 15 Zoll überhaupt ganz und gar nicht, mit 24 Zoll recht brauchbar und in gewissen Ausnahmesituationen klicke ich das Icon, welches

              Ok, ich geb es ja zu, wenn ich daheim am Laptop mit einem externen 24 Zoll Bildschirm arbeite, dann wundere ich mich doch immer wieder wie toll alles ausschaut, aber irgendwie habe ich mich an mein Handy gewöhnt.

              1. Moin!

                Ok, ich geb es ja zu, wenn ich daheim am Laptop mit einem externen 24 Zoll Bildschirm arbeite, dann wundere ich mich doch immer wieder wie toll alles ausschaut, aber irgendwie habe ich mich an mein Handy gewöhnt.

                Ich arbeite mit drei Full-HD-Auflösungs-Displays, also 1920*1060/1200 (eins davon leider "nur" das winzige Laptop-Display, zweimal 24"), und es ist ausreichend groß. Ein Handy in dieser Größe will ich nicht rumschleppen.

                Aber gerade wenn das Zieldisplay winzig ist, ist es wichtig, den Platz nicht unnötig mit Einrückungen zu verschenken. Acht Zeichen für ein Tab sind da einfach zuviel.

                Und die Tab-vs-Space-Frage wurde auch entschieden - zugunsten von Spaces!

                Grüße Sven

                1. Und die Tab-vs-Space-Frage wurde auch entschieden - zugunsten von Spaces!

                  Juhuu :)

                  Cheers,
                  BaBa

                  --
                  BaBa kommt von Basketball
                  1. @@BaBa

                    Und die Tab-vs-Space-Frage wurde auch entschieden - zugunsten von Spaces! Juhuu :)

                    Meh. Tabs are clearly superior.

                    LLAP

                    --
                    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                    1. Leute,

                      ernsthaft? Wir haben das Jahr 2015, die Tabs-vs-Spaces-Diskussion kommt aus den 70ern (sic!), alle Argumente wurden tausende Male genannt, ich habe seit Jahrzehnten keine neuen Argumente mehr dazu gelesen, auch von Lea nicht.

                      Alle nennenswerten Editoren können beides, man benutzt das, was im Projekt benutzt wird und fröhnt ansonsten seiner persönlichen Vorliebe. Eine Diskussion darüber ist müssig, über Religion lässt sich nicht diskutieren.

                      LG,
                      CK

                      1. Tach!

                        Developers increasingly prefer spaces as they gain experience.

                        Ich nehme die mittlerweile auch, obwohl ich die Vorteile von Tabs mehr mag. Der große Nachteil ist aber, dass die Editoren, wenn man die Anzeige der Whitespaces eingeschaltet hat, für das Tabzeichen den üblichen Strich mit Pfeil und Querstrich anzeigen und beim Space nur einen kleinen Fliegenschiss (oder zwei oder vier). Die Tab-Grafik ist deutlich störender. Ohne die Anzeige möchte ich nicht arbeiten, dann sehe ich nicht wenn da beispielsweise sowohl als auch im Code steht.

                        dedlfix.

                        1. @@dedlfix

                          Der große Nachteil ist aber, dass die Editoren, wenn man die Anzeige der Whitespaces eingeschaltet hat, für das Tabzeichen den üblichen Strich mit Pfeil und Querstrich anzeigen und beim Space nur einen kleinen Fliegenschiss (oder zwei oder vier). Die Tab-Grafik ist deutlich störender.

                          Die „Argumente“ pro Leerzeichen werden immer absurder‽

                          LLAP

                          --
                          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                          1. Tach!

                            Die „Argumente“ pro Leerzeichen werden immer absurder‽

                            Nein, das war kein allgemeines Argument für Leerzeichen. In der Sache überzeugen mich weiterhin Tabs. Das ist nur mein Weg des geringeren Übels.

                            dedlfix.

                        2. @@dedlfix

                          Die Tab-Grafik

                          Irgendwo in den Untiefen deines Editors/deiner IDE wird es einen Ordner mit Grafiken geben. Darin die Tab-Grafik ausfindig zu machen und zu bearbeiten würde das Problem lösen anstatt den Teufel mit dem Brezelbub austreiben zu wollen.

                          LLAP

                          --
                          „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                          1. Tach!

                            Die Tab-Grafik

                            Irgendwo in den Untiefen deines Editors/deiner IDE wird es einen Ordner mit Grafiken geben.

                            Grafik war hier allgemeiner Begriff. Tatsächlich wird es wohl eher ein Zeichen in einem Font sein. Den bearbeite mal! Einfacher wäre es, die Farbe zu ändern und ein noch helleres Grau zu nehmen. Nur verschwinden dann auch die Leerzeichen-Punkte ins nahezu unsichtbare.

                            dedlfix.

                          2. @@Gunnar Bittersmann

                            den Teufel mit dem Brezelbub austreiben zu wollen.

                            Brezel‽

                            iPhone, Spracheingabe.

                            Unter Steve wär das nicht passiert.™

                            LLAP

                            --
                            „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                            1. Moin,

                              den Teufel mit dem Brezelbub austreiben zu wollen.

                              Brezel‽

                              iPhone, Spracheingabe.

                              schade, ich hatte das schon für einen absichtlichen Wortwitz gehalten und fand ihn sogar richtig gut. Habe beinahe Kaffee auf die Tastatur gespuckt.

                              So long,
                               Martin

                              1. @@Der Martin

                                den Teufel mit dem Brezelbub austreiben zu wollen.

                                Brezel‽

                                iPhone, Spracheingabe.

                                schade, ich hatte das schon für einen absichtlichen Wortwitz gehalten und fand ihn sogar richtig gut.

                                Ist witzig. Nur nicht mein Witz, sondern Apples. Diese Komiker.

                                Habe beinahe Kaffee auf die Tastatur gespuckt.

                                Das wiederum ist ein Vorteil beim iPhone: Von der virtuellen Tastatur kann man den Kaffee leicht abwischen.

                                LLAP

                                --
                                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
    2. Ahoi Auge

      das Umkopieren der Variablen und Verwendung doppelter ifs wäre jetzt aus meiner Sicht nicht unbedingt nötig und auch optimierungsfähig. Wie man das jetzt und ob mit "Kraftausdrücken" betiteln will, bleibt ja Geschmackssache. Aber (s.o. und s.u.) für die Übersichtlichkeit ist noch Luft nach oben.

      Alles was unnötig ist sollte raus, alles was zusammengehört, sollte zusammen.

      Dank und Gruß,

      bob from berlin

  5. Ahoi Jnnbo

    Hallo an alle PHP Spezialisten,

    jemand meinte heute zu mir ich würde unübersichtlichen und „aufgeblähter" Code schreiben, wollte mir aber nicht sagen warm und wie bzw. was ich ändern könnte. Meine Frage an euch, ist dieses wirklich der Fall und was könnte ich daran ändern?

    Dieser Code ist für das INSERT und UPDATE zuständig:

    	// Prüfen ob GET gesetztz ist
    	if(isset($_GET['hersteller'])) {
    			$hersteller = $_GET['hersteller'];	
    	}
    	
    	// Datensatz aus der Datenbank auslesen
    	$stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM web_hersteller WHERE h_id=?");
    	$stmt->bind_param("s", $hersteller);
            $stmt->execute();
    	$stmt->bind_result($h_id, $h_titel, $h_titelURL, $h_status);
    	$stmt->fetch();
            $stmt->close();
    	
    	// Ziel URL festlegen
    	$host = htmlspecialchars($_SERVER["HTTP_HOST"]);
    	$uri  = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");
    	$extra = "hersteller";
    
    	if(isset($_POST['abschicken'])){
    
    		if(empty($_POST['hersteller'])) {
    				$errors[] = "Geben Sie bitte einen Hersteller an";
    			}
    
    		if(empty($_POST['url'])) {
    				$errors[] = "Geben Sie bitte eine Hersteller URL an";
    			}
    
    	
    	if(isset($_POST['abschicken']) && empty($errors)) {
    		
    		
    	if(isset($_GET['hersteller'])) {
    
    		if ($stmt = $mysqli->prepare("Update web_hersteller SET h_titel=?, h_titelURL=?, h_status=? WHERE h_id = ?"))
    		 {    
    				$h_titel 	= $_POST["hersteller"];
    				$h_titelURL      = $_POST["url"];
    				$h_status 	= $_POST["status"];
    			
    			$stmt->bind_param("ssss",	
    						$h_titel,
    						$h_titelURL,
    						$h_status,
    						$h_id
    		 );
    
    	}} // Ende $_GET['hersteller']
    	
    	else {	
    				
    	if ($stmt = $mysqli->prepare("INSERT INTO web_hersteller (h_titel, h_titelURL, h_status) VALUES (?, ?, ?)"))
    			 {    
    			 
    				$h_titel 	= $_POST["hersteller"];
    				$h_titelURL      = $_POST["url"];
    				$h_status 	= $_POST["status"];
    				
    				$stmt->bind_param("sss", $h_titel, $h_titelURL, $h_status);
    		}}
    
    	$stmt->execute();
    				header("Location: http://$host$uri/$extra");
    						}
    				else {
    						echo $mysqli -> error;
    					}
    	};
    	?>
    
    <?php
    // Prüfen ob GET gesetztz ist
    //~ if(isset($_GET['hersteller'])) {
                    //~ $hersteller = $_GET['hersteller'];        
    //~ }
    
    
    // Ziel URL festlegen
    $host = htmlspecialchars($_SERVER["HTTP_HOST"]);
    $uri  = rtrim(dirname(htmlspecialchars($_SERVER["PHP_SELF"])), "/\\");
    $extra = "hersteller";
    
    if(isset($_POST['abschicken'])){
        if(empty($_POST['hersteller'])) {
            $errors[] = "Geben Sie bitte einen Hersteller an";
        }
        if(empty($_POST['url'])) {
            $errors[] = "Geben Sie bitte eine Hersteller URL an";
        }
        if(empty($errors)) {
            if(isset($_GET['hersteller'])) {
                // Datensatz aus der Datenbank auslesen - erst nach der Prüfung!!!
                $stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM web_hersteller WHERE h_id=?");
                $stmt->bind_param("s", $hersteller);
                $stmt->execute();
                $stmt->bind_result($h_id, $_POST["hersteller"], $_POST["url"], $_POST["status"]); //evtl falsche Posts einkopiert
                $stmt->fetch();
                $stmt->close();
    
                if ($stmt = $mysqli->prepare("Update web_hersteller SET h_titel=?, h_titelURL=?, h_status=? WHERE h_id = ?")){
                    $stmt->bind_param("ssss", $_POST["hersteller"], $_POST["url"], $_POST["status"], $h_id);
                }
            } elseif ($stmt = $mysqli->prepare("INSERT INTO web_hersteller (h_titel, h_titelURL, h_status) VALUES (?, ?, ?)")) {    
                $stmt->bind_param("sss", $_POST["hersteller"], $_POST["url"], $_POST["status"]);
            }
        }
        $stmt->execute();
        header("Location: http://$host$uri/$extra");
    } else {
        echo $mysqli -> error;
    };
    

    Irgendwie kommen hier mehr Zeilenumbrüche rein als sollten. Zudem ist das Ausmerzen der Umkopiererei irgendwie nicht ganz richtig oder komplett. Frage ist auch, ob der obere Codeblock, das Auslesen aus der DB, da korrekt steht. Immerhin aber sollte der ja nur sein, wenn die Vars dazu auch existieren. Dank und Gruß,

    bob from berlin

    1. Hallo frankx,

      Irgendwie kommen hier mehr Zeilenumbrüche rein als sollten. Zudem ist das Ausmerzen der Umkopiererei irgendwie nicht ganz richtig oder komplett. Frage ist auch, ob der obere Codeblock, das Auslesen aus der DB, da korrekt steht. Immerhin aber sollte der ja nur sein, wenn die Vars dazu auch existieren.

      das heißt also, das Auslesen sollte nur dann passieren, wenn $_GET gesetzt ist, richtig? Dann würde ich dieses so machen?

      // Prüfen ob GET gesetztz ist
      if(isset($_GET['hersteller'])) {
      	$hersteller = $_GET['hersteller'];	
      		
      	// Datensatz aus der Datenbank auslesen
      	$stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM web_hersteller WHERE h_id=?");
      	$stmt->bind_param("s", $hersteller);
      	$stmt->execute();
      	$stmt->bind_result($h_id, $h_titel, $h_titelURL, $h_status);
      	$stmt->fetch();
      	$stmt->close();
      }
      

      Ich habe bis jetzt allerdings nie eine Fehlermeldung erhalten dass etwas nicht stimmt.

      1. Tach!

        das heißt also, das Auslesen sollte nur dann passieren, wenn $_GET gesetzt ist, richtig? Dann würde ich dieses so machen?

        Die Frage musst du nicht uns stellen, sondern du musst sie dir selbst anhand der Aufgabenstellung und der Nebenbedingungen, wie Fehlerbehandlung, beantworten.

        dedlfix.

      2. Ahoi Jnnbo

        wozu kopierst du $GET["hersteller"] nach $hersteller? Ist das für bind wichtig? Ich würde es lassen, wenn es nicht sein muss.

        Ich dachte zudem, dass Du aus der DB was auslesen willst, was nur mit Herstellerangabe geht. Entweder ist immer ein Hersteller dabei, dann brauchst Du garnicht prüfen, oder Du musst prüfen. Das ist eine Frage der Logik, nicht des Stils.

        Meine Kenntnisse sind aber eher marginal, halte Dich lieber an die anderen hier im Thread. Wollte nur mal zeigen, wie man durch logisches Zusammenfassen, konsitentes Einrücken und Weglassen der Umkopiererei schon gleich mehr Übersicht hat. Ob der Code noch korrekt ist, musst Du wissen.

        Dank und Gruß,

        bob from berlin

  6. Hi,

    
    > 	if(isset($_GET['hersteller'])) {
    > 		if(empty($_POST['hersteller'])) {
    > 	if(isset($_GET['hersteller'])) {
    > 				$h_titel 	= $_POST["hersteller"];
    > 	}} // Ende $_GET['hersteller']
    > 				$h_titel 	= $_POST["hersteller"];
    
    

    steckt der 'hersteller' in GET oder in POST, oder gar in beiden? Wenn das zwei unterschiedliche Werte sind, dann wäre es übersichtlicher, wenn die zwei Parameter auch unterschiedliche Namen hätten ...

    
    >        // Datensatz aus der Datenbank auslesen
    >       $stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM >web_hersteller WHERE h_id=?");
    >        $stmt->bind_param("s", $hersteller);
    >        $stmt->execute();
    >        $stmt->bind_result($h_id, $h_titel, $h_titelURL, $h_status);
    >        $stmt->fetch();
    >        $stmt->close();
    
    

    wäre etwas, was ich in eine Funktion auslagern würde - es wird ja vermutlich im gesamten Projekt mehrere DB-Abfragen geben, Parameter sql-Statement, die bind-params und die bind_results (letztere zwei als Array/Objekt) ...

    cu,
    Andreas a/k/a MudGuard

    1. Hallo MudGuard,

      steckt der 'hersteller' in GET oder in POST, oder gar in beiden? Wenn das zwei unterschiedliche Werte sind, dann wäre es übersichtlicher, wenn die zwei Parameter auch unterschiedliche Namen hätten ...

      'hersteller' steckt immer in GET

      1. Hi,

        'hersteller' steckt immer in GET

        Dann stellt sich die Frage, warum es Zugriffe per $_POST['hersteller'] gibt ...

        cu,
        Andreas a/k/a MudGuard

    2. Tach!

      >        // Datensatz aus der Datenbank auslesen
      >       $stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM >web_hersteller WHERE h_id=?");
      >        $stmt->bind_param("s", $hersteller);
      >        $stmt->execute();
      >        $stmt->bind_result($h_id, $h_titel, $h_titelURL, $h_status);
      >        $stmt->fetch();
      >        $stmt->close();
      

      wäre etwas, was ich in eine Funktion auslagern würde - es wird ja vermutlich im gesamten Projekt mehrere DB-Abfragen geben, Parameter sql-Statement, die bind-params und die bind_results (letztere zwei als Array/Objekt) ...

      Da gibt es nur ein ganz unschönes Problem. bind_param() und bind_result() binden per Referenz. Und es ist nicht sehr einfach, ein Array mit variabler Elementeanzahl per Referenz übergeben funktionierend hinzubekommen. Das heißt, es geht schon, aber nur mit Trick 17 von hinten durch die Brust ins Auge. Übersichtlich und verständlich sieht anders aus. Am besten ist es, auf PDO zu wechseln, da ist das deutlich anwenderfreundlicher gelöst und man bekommt die Werte zurückgeliefert, ohne dass man vorher sozusagen Variablen abgeben muss, die dann gefüllt werden.

      Dieses Binding in der mysqli-Extension ist nur was für sofortige Verwendung. Auslagern in eine Funktion ist zwar grundsätzlich keine schlechte Idee, aber in dem Fall sollte man lieber drauf verzichten (oder zugunsten von PDO auf mysqli).

      dedlfix.

      1. Ahoi dedlfix

        Tach!

        >        // Datensatz aus der Datenbank auslesen
        >       $stmt = $mysqli->prepare("SELECT h_id, h_titel, h_titelURL, h_status FROM >web_hersteller WHERE h_id=?");
        >        $stmt->bind_param("s", $hersteller);
        >        $stmt->execute();
        >        $stmt->bind_result($h_id, $h_titel, $h_titelURL, $h_status);
        >        $stmt->fetch();
        >        $stmt->close();
        

        wäre etwas, was ich in eine Funktion auslagern würde - es wird ja vermutlich im gesamten Projekt mehrere DB-Abfragen geben, Parameter sql-Statement, die bind-params und die bind_results (letztere zwei als Array/Objekt) ...

        Da gibt es nur ein ganz unschönes Problem. bind_param() und bind_result() binden per Referenz. Und es ist nicht sehr einfach, ein Array mit variabler Elementeanzahl per Referenz übergeben funktionierend hinzubekommen. Das heißt, es geht schon, aber nur mit Trick 17 von hinten durch die Brust ins Auge. Übersichtlich und verständlich sieht anders aus. Am besten ist es, auf PDO zu wechseln, da ist das deutlich anwenderfreundlicher gelöst und man bekommt die Werte zurückgeliefert, ohne dass man vorher sozusagen Variablen abgeben muss, die dann gefüllt werden.

        Dieses Binding in der mysqli-Extension ist nur was für sofortige Verwendung. Auslagern in eine Funktion ist zwar grundsätzlich keine schlechte Idee, aber in dem Fall sollte man lieber drauf verzichten (oder zugunsten von PDO auf mysqli).

        Oder http://framework.zend.com/manual/current/en/modules/zend.db.table-gateway.html

        und selektiv einbinden mit

        require_once $config["libPath"] . "/Zend/Loader/StandardAutoloader.php";
        $loader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));
        

        Dank und Gruß,

        bob from berlin