Sturmverliebt: Eigene kleine Funktion "Trefforte"auslesen

Guten Morgen,

ich bastel gerade eine kleine Funktion die mir alle Trefforte eines Users ausgibt (klappt auch soweit recht gut)

  
	function trefforte_profile($mysqli, $i_inseratID) {  
	    $stmt = $mysqli->prepare("SELECT  
                                          t_id,  
                                          t_inseratID,  
                                          t_treffpunkt,  
                                          tA_bezeichnung  
  
                                       FROM web_users_treffpunkt  
				  
                                       LEFT JOIN treffpunkte  
                                       ON treffpunkte.tA_id = web_users_treffpunkt.t_treffpunkt  
				  
                                       WHERE t_inseratID  = '$i_inseratID'");  
		  
                $stmt->execute();  
                $stmt->bind_result($t_id, $t_inseratID, $t_treffpunkt, $tA_bezeichnung);  
		$stmt->store_result();  
  
		if($stmt->num_rows() > 0) {  
  
		while($stmt->fetch()) {  
				echo '<a href="#">'.$tA_bezeichnung.'</a>, ';  
		}} else {  
				echo 'Auf Anfrage';  
			}  
	}  

Nur ich habe ein kleines Problem bei der Ausgabe sprich im "ECHO" Bereich. Wenn der letzte Eintrag erreicht ist sollte kein "," mehr angehängt werden. Es ist zwar nicht schlimm sieht aber einfach nicht schön aus. Finde aber dazu keine Lösung. Könnte mir hier bitte jemand helfen?

Nicht wundern warum ich immer mit t_ bzw. tA_ arbeite, dieses mache ich aus diesem Grund um die Felder besser zu unterscheiden bzw. mir hat mal jemand gesagt wenn ich zwei Tabellen verbinde müssen die Spalten eindeutig sein.

  1. Hi,

    function trefforte_profile($mysqli, $i_inseratID) {
        $stmt = $mysqli->prepare("SELECT
                                              t_id,
                                              t_inseratID,
                                              t_treffpunkt,
                                              tA_bezeichnung

      
    warum selektierst Du 4 Spalten, wenn Du nur eine davon tatsächlich benutzt?  
    
    > 		while($stmt->fetch()) {  
    > 				echo '<a href="#">'.$tA\_bezeichnung.'</a>, ';  
    > 		}} else {  
    > 				echo 'Auf Anfrage';  
    > 			}  
    > 	}  
    > [/code]  
    >   
    > Nur ich habe ein kleines Problem bei der Ausgabe sprich im "ECHO" Bereich. Wenn der letzte Eintrag erreicht ist sollte kein "," mehr angehängt werden. Es ist zwar nicht schlimm sieht aber einfach nicht schön aus. Finde aber dazu keine Lösung. Könnte mir hier bitte jemand helfen?  
      
    Gib die Sachen nicht direkt aus, sondern sammle sie (ohne ", ") in einem Array.  
    Und dann join-st Du das Array mit ", " und gibst das Ergebnis des join aus.  
      
      
    
    > Nicht wundern warum ich immer mit t\_ bzw. tA\_ arbeite, dieses mache ich aus diesem Grund um die Felder besser zu unterscheiden bzw. mir hat mal jemand gesagt wenn ich zwei Tabellen verbinde müssen die Spalten eindeutig sein.  
      
    Das sind die Spaltennamen aber auch dann, wenn Du den Tabellen-Alias, den Du beim FROM bzw. JOIN angibst, voranstellst. Es darf also durchaus in verschiedenen Tabellen der gleiche Name mehrfach vorkommen.  
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
      
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.  
    
    
    1. Hallo Andreas,

      Gib die Sachen nicht direkt aus, sondern sammle sie (ohne ", ") in einem Array.
      Und dann join-st Du das Array mit ", " und gibst das Ergebnis des join aus.

      hab es nun so umgesetzt

        
      if($rows > 0) {  
       $i = 1;  
       while($stmt->fetch()) {  
      	if ($i < $rows) {  
      		echo '<a href="#">'.$tA_bezeichnung.'</a>, ';  
      	}  
      	else{  
      		echo '<a href="#">'.$tA_bezeichnung.'</a>';  
      	}  
      	$i++;  
      }  
      
      
      1. Tach!

        hab es nun so umgesetzt

        Eines der Programmierprinzipien heißt DRY: don't repeat yourself - wiederhole dich nicht.

        if ($i < $rows) {
          echo '<a href="#">'.$tA_bezeichnung.'</a>, ';
        }
        else {
          echo '<a href="#">'.$tA_bezeichnung.'</a>';
        }

        Wenn du jetzt noch feststellst, dass du den Kontextwechsel und damit ein htmlspecialchars()-Aufruf vergessen hast, musst du zwei Zeilen ändern. Aber eigentlich hast du keine zwei unterschiedlichen Ausgaben sondern eine Ausgabe mit einem bedingten Anhängsel. Also zuerst die Ausgabe einmal notieren und dann die Bedingung.

        echo '<a href="#">' . htmlspecialchars($tA_bezeichnung) . '</a>';
        if ($i < $rows)
          echo ', ';

        dedlfix.

        1. Hallo,

          Wenn du jetzt noch feststellst, dass du den Kontextwechsel und damit ein htmlspecialchars()-Aufruf vergessen hast, musst du zwei Zeilen ändern. Aber eigentlich hast du keine zwei unterschiedlichen Ausgaben sondern eine Ausgabe mit einem bedingten Anhängsel. Also zuerst die Ausgabe einmal notieren und dann die Bedingung.

          echo '<a href="#">' . htmlspecialchars($tA_bezeichnung) . '</a>';
          if ($i < $rows)
            echo ', ';

          Was kann mir denn im schlimmsten Fall passieren wenn ich die „htmlspecialchars“ nicht nutze. Ich meine ich prüfe beim Eintragen der Daten bereits darauf dass nichts böses rein kommt, warum muss ich also bei der Ausgabe nochmals prüfen?

          1. Om nah hoo pez nyeetz, Sturmverliebt!

            Was kann mir denn im schlimmsten Fall passieren wenn ich die „htmlspecialchars“ nicht nutze. Ich meine ich prüfe beim Eintragen der Daten bereits darauf dass nichts böses rein kommt, warum muss ich also bei der Ausgabe nochmals prüfen?

            Wie prüfst du denn?

            Was böses könnte sein, dass zum Beispiel JavaScript-Code an der Stelle ausgeführt wird.
            Was weniger böses könnte sein, dass der Text ein „<“ enthält und der Browser das als Begrenzer eines Tags interpretiert und dein Dokument zerschossen wird, weil die Verschachtelung nicht mehr stimmt.

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Post und Posten.

          2. @@Sturmverliebt:

            nuqneH

            Was kann mir denn im schlimmsten Fall passieren wenn ich die „htmlspecialchars“ nicht nutze. Ich meine ich prüfe beim Eintragen der Daten bereits darauf dass nichts böses rein kommt, warum muss ich also bei der Ausgabe nochmals prüfen?

            Wenn du beim Reinschreiben in die Datenbank berücksichtigst, dass du die Daten irgendwann mal nach dem Auslesen in HTML packst, machst du einen grundlegenden Denkfehler.

            Die kontextgerechte Behandlung von Daten muss genau dann stattfinden, wenn man die Daten in den jeweiligen Kontext bringt, nicht Ewigkeiten vorher.

            Für '<' soll '<' in der Datenbank stehen, nicht '&lt;'.

            Beim Reinschreiben in die Datenbank sorgst du dafür, dass keine SQL-Injections reinkommen.

            Nach dem Auslesen, wenn die Daten ins HTML geschrieben werden, sorgst du dafür, dass kein XSS möglich ist.

            Qapla'

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

              Die kontextgerechte Behandlung von Daten muss genau dann stattfinden, wenn man die Daten in den jeweiligen Kontext bringt, nicht Ewigkeiten vorher.

              das heißt also, dass ich selbst bei solchen Ausgaben <?php echo $Preise_Stunde;?> (hier geht es um einen Preisangabe, die durch den User getätigt wurde) die htmlspecialchars verwenden sollte (muss)? Wenn ja nehme ich an, ALLE Einträge die durch einen User getätigt wurden müssen mit htmlspecialchars versehen werden, richtig?

              1. Hi,

                Die kontextgerechte Behandlung von Daten muss genau dann stattfinden, wenn man die Daten in den jeweiligen Kontext bringt, nicht Ewigkeiten vorher.
                das heißt also, dass ich selbst bei solchen Ausgaben <?php echo $Preise_Stunde;?> (hier geht es um einen Preisangabe, die durch den User getätigt wurde) die htmlspecialchars verwenden sollte (muss)?

                ja, konsequenterweise schon.
                Wenn du aufgrund der Programmlogik absolut sicher sein kannst, dass da z.B. nur Zahlenwerte vorkommen, dann wäre diese Maskierung zwar nicht zwingend nötig, schadet aber auch nicht. Besser, man gewöhnt sich an, *immer* zu maskieren, als "nur bei Bedarf", und dann vergisst man's aus Nachlässigkeit doch wieder an einer Stelle, wo's weh tut.

                Wenn ja nehme ich an, ALLE Einträge die durch einen User getätigt wurden müssen mit htmlspecialchars versehen werden, richtig?

                Nicht nur die, sondern ALLE Ausgaben. Auch die, die aus anderen Quellen kommen. Denn wie Matthias gezeigt hat, genügt es ja schon, wenn in der Ausgabe ein unmaskiertes '<' auftritt - schon ist der HTML-Parser des Browsers aufs Glatteis geführt und die Ausgabe ist insgesamt Schrott.

                So long,
                 Martin

                --
                Der Bäcker schlägt die Fliegen tot
                Und macht daraus Rosinenbrot.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Hallo,

                  Nicht nur die, sondern ALLE Ausgaben. Auch die, die aus anderen Quellen kommen. Denn wie Matthias gezeigt hat, genügt es ja schon, wenn in der Ausgabe ein unmaskiertes '<' auftritt - schon ist der HTML-Parser des Browsers aufs Glatteis geführt und die Ausgabe ist insgesamt Schrott.

                  OK, danke für deine Antwort. Dann werde ich mich heute Abend hinsetzten und Seite für Seite durchgehen und htmlspecialchars einbauen. Ist zwar eine Menge an Arbeit aber wenn es der Sicherheit dient, dann mache ich das gerne.

                  1. Hallo,

                    Nicht nur die, sondern ALLE Ausgaben. Auch die, die aus anderen Quellen kommen. Denn wie Matthias gezeigt hat, genügt es ja schon, wenn in der Ausgabe ein unmaskiertes '<' auftritt - schon ist der HTML-Parser des Browsers aufs Glatteis geführt und die Ausgabe ist insgesamt Schrott.

                    hab noch eine Frage, du schreibst ALLE Ausgaben. Das heißt also auch in Formularen wie z.B. hier?

                      
                    value="<?=(isset($_POST['betreff'])) ? $_POST['betreff'] :''?>">  
                    
                    

                    Wie sieht es aus wenn ich eine eMail verschicke. Muss ich das htmlspecialchars auf die Felder anwenden die ich verschicke oder regelt dieses mein Mail Programm für mich?

                    1. Hi,

                      Nicht nur die, sondern ALLE Ausgaben. Auch die, die aus anderen Quellen kommen. Denn wie Matthias gezeigt hat, genügt es ja schon, wenn in der Ausgabe ein unmaskiertes '<' auftritt - schon ist der HTML-Parser des Browsers aufs Glatteis geführt und die Ausgabe ist insgesamt Schrott.
                      hab noch eine Frage, du schreibst ALLE Ausgaben. Das heißt also auch in Formularen wie z.B. hier?

                      ja, auf jeden Fall!

                      Wie sieht es aus wenn ich eine eMail verschicke. Muss ich das htmlspecialchars auf die Felder anwenden ...

                      Nein. Du hast das Konzept anscheinend noch nicht wirklich verstanden.

                      Es gibt keine allgemeingültige Funktion, die die Maskierung oder das Escaping für alle nur denkbaren Situationen macht. Das muss immer auf den Kontext abgestimmt sein, in den man die Daten einbringt. Willst du Daten als HTML ausgeben, musst du die Maskierungsregeln für HTML beachten. Das macht htmlspecialchars(). Willst du Daten an mysql übergeben, musst du die Maskierungsregeln für SQL beachten. Das macht beispielsweise mysql_real_escape_string().

                      Wenn du e-Mails versenden willst, musst du ... ähm, Moment, e-Mails sind zunächst mal reiner Text, in dem _alles_ vorkommen darf. Es gibt keine Zeichen, die im e-Mail-Text eine besondere Bedeutung haben, also muss hier auch nichts maskiert werden.
                      Es sei denn ... du verschickst HTML-formatierte Mails (was man üblicherweise nicht möchte). Dann gelten wieder die Regeln für HTML.

                      Ich gebe ja gern zu, das Thema ist auf den ersten Blick komplex. Aber wenn man den Kern einmal verstanden hat, ist es eigentlich ganz einfach und selbstverständlich.

                      So long,
                       Martin

                      --
                      Männer sind ungerecht: Sie sehen immer nur den Baum, den eine Frau mit dem Auto gerammt hat. Aber die vielen Bäume, die sie nicht einmal gestreift hat, sehen sie nicht.
                      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                      1. Willst du Daten an mysql übergeben, musst du die Maskierungsregeln für SQL beachten. Das macht beispielsweise mysql_real_escape_string().

                        Hab mir sagen lassen, wenn ich prepare nutze (wie ich es derzeit mache) benötige ich mysql_real_escape_string() da prepare dieses automatisch macht.

                    2. Om nah hoo pez nyeetz, Sturmverliebt!

                      Nicht nur die, sondern ALLE Ausgaben. Auch die, die aus anderen Quellen kommen. Denn wie Matthias gezeigt hat, genügt es ja schon, wenn in der Ausgabe ein unmaskiertes '<' auftritt - schon ist der HTML-Parser des Browsers aufs Glatteis geführt und die Ausgabe ist insgesamt Schrott.

                      Wie sieht es aus wenn ich eine eMail verschicke. Muss ich das htmlspecialchars auf die Felder anwenden die ich verschicke oder regelt dieses mein Mail Programm für mich?

                      Lies dies aufmerksam.

                      Matthias

                      --
                      Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Tablett und Tablette.