Martin_Online: Daten aus Datenbank auslesen mysql & mysqli

0 51

Daten aus Datenbank auslesen mysql & mysqli

Martin_Online
  • php
  1. 2
    dedlfix
    1. 0
      Martin_Online
    2. 0
      Martin_Online
      1. 0
        M.
        1. 0

          Meine erste Funktion

          Martin_Online
          1. 0
            M.
            1. 0
              Martin_Online
              1. 0
                M.
          2. 0
            Der Martin
            1. 0
              Martin_Online
              1. 0
                Martin_Online
                1. 0
                  M.
            2. 0
              M.
              1. 0
                Der Martin
                1. 0
                  Martin_Online
                  1. 0

                    Fertige Funktion

                    Martin_Online
                    1. 0

                      Eine weitere Frage

                      Martin_Online
                      1. 0
                        dedlfix
                        1. 0
                          Der Martin
          3. 1
            dedlfix
  2. 0

    Zusatzfrage

    Martin_Online
    1. 0
      M.
    2. 0
      dedlfix
      1. 0
        ChrisB
      2. 0
        Martin_Online
        1. 0
          dedlfix
  3. 0

    Danke, aber ich lass es bleiben!

    Martin_Online
    1. 0
      M.
      1. 0
        Martin_Online
        1. 0
          tami
        2. 2
          M.
  4. 0

    Kann mir das bitte jemand erklären

    Martin_Online
    1. 0
      dedlfix
    2. 0
      M.
    3. 0

      Keine Hilfe ist auch eine Hilfe!

      Martin_Online
      1. 0
        M.
        1. 0
          Martin_Online
          1. 0
            M.
            1. 0
              Martin_Online
              1. 0
                M.
                1. 0
                  Martin_Online
                  1. 0
                    Auge
                    1. 0
                      Martin_Online
                      1. 0
                        Auge
                        1. 0
                          Martin_Online
                          1. 0
                            Auge
                            1. 0
                              Martin_Online
        2. 0
          dedlfix
          • zu diesem forum
          1. 0
            M.
            1. 0
              Matthias Apsel

Guten Abend,

hab noch eine Frage zu mysql und mysqli so wie ich es verstanden habe, sollte man auf mysql nicht mehr setzten. Also habe ich mir mysqli etwas genauer angesehen. Meine Daten lese ich nun so aus meiner Datenbank aus:

Zugangsdaten

  
$mysqli = new mysqli("xxx", "xxx", "xxx", "xxx");  
if ($mysqli->connect_error) {  
  echo "Fehler bei der Verbindung: " . mysqli_connect_error();  
  exit();  
}  
if (!$mysqli->set_charset("utf8")) {  
  echo "Fehler beim Laden von UTF8 ". $mysqli->error;  
}  

Daten auslesen:

  
	<?php  
	$stmt = $mysqli->prepare("SELECT KdM_id, KdM_name, KdM_nachricht, KdM_status FROM web_kundenmeinungen");  
  	$stmt->execute();  
  	$stmt->bind_result($KdM_id, $KdM_name, $KdM_nachricht, $KdM_status);  
  	while($stmt->fetch()) {  
	?>  
    <div class="kundenmeinung">  
        <p><?php echo htmlspecialchars($KdM_name);?></p>  
        <p><?php echo htmlspecialchars($KdM_nachricht);?></p>  
    </div>  
  	<?php  
  	}  
	?>  

Meine Frage nun, ist dieses Zukunftssicher? Viele schreiben man soll auf Objektorientiertes Programmieren setzten, aber ich sehe bei so einer kleinen Abfrage kein Grund? Sehe ich dieses richtig?

  1. Tach!

    if ($mysqli->connect_error) {
      echo "Fehler bei der Verbindung: " . mysqli_connect_error();

    Für einen Administrator wird die Information zum Fehler interessant sein, für einen Außenstehenden möchte man solche internen Informationen nicht preisgeben.

    $stmt = $mysqli->prepare("SELECT KdM_id, KdM_name, KdM_nachricht, KdM_status FROM web_kundenmeinungen");

    Du fragst 4 Felder ab, verwendest davon aber nur zwei. Wenn die anderen in diesem Beispiel lesiglich untern Tisch gefallen sind, dann lass sie da liegen. Wenn das aber alles ist, dann fragst du sie unnötigerwiese ab.

    Meine Frage nun, ist dieses Zukunftssicher?

    Derzeit ist nicht bekannt, dass mysqli abgeschafft werden soll. Man kann das also als zukunftssicher ansehen.

    Viele schreiben man soll auf Objektorientiertes Programmieren setzten, aber ich sehe bei so einer kleinen Abfrage kein Grund? Sehe ich dieses richtig?

    Ob du OOP verwendest oder nicht, ist deine Entscheidung. OOP zu verwenden oder nicht, hat nichts mit der Größe des Projekts zu tun. Wenn du dir Vorteile davon versprichst, dann nimmes, wenn nicht, nimm was anderes. Um das aber entscheiden zu können, brauchst du Erfahrungswerte, wie sich Aufwand und Nutzen zueinander verhalten. Und nebenbei, du hast die objektorientierte Version verwendet.

    dedlfix.

    1. Danke für deine Antwort.

      if ($mysqli->connect_error) {

      echo "Fehler bei der Verbindung: " . mysqli_connect_error();

      Für einen Administrator wird die Information zum Fehler interessant sein, für einen Außenstehenden möchte man solche internen Informationen nicht preisgeben.

      Das heißt ich lass das echo weg und schreibe die Fehlermeldung in eine Textdatei?

      Du fragst 4 Felder ab, verwendest davon aber nur zwei. Wenn die anderen in diesem Beispiel lesiglich untern Tisch gefallen sind, dann lass sie da liegen. Wenn das aber alles ist, dann fragst du sie unnötigerwiese ab.

      Nur in diesem Beispiel sieht man KdM_id & KdM_status nicht. Die ID benötige ich später um diesen Datensatz zu bearbeiten und KdM_status um etwas anzeigen zu lassen oder nicht.  War aber für diese Frage noch nicht wichtig. Daher habe ich diese Informationen weg gelassen.

    2. Ob du OOP verwendest oder nicht, ist deine Entscheidung. OOP zu verwenden oder nicht, hat nichts mit der Größe des Projekts zu tun. Wenn du dir Vorteile davon versprichst, dann nimmes, wenn nicht, nimm was anderes. Um das aber entscheiden zu können, brauchst du Erfahrungswerte, wie sich Aufwand und Nutzen zueinander verhalten. Und nebenbei, du hast die objektorientierte Version verwendet.

      Hab die Frage wohl falsch rüber gebracht, ich meinte ob es sich lohnt aus meinem Code eine Funktion zu bauen.

      1. Mahlzeit,

        Hab die Frage wohl falsch rüber gebracht, ich meinte ob es sich lohnt aus meinem Code eine Funktion zu bauen.

        Eine Funktion hat nichts mit OOP zu tun.
        Du musst entscheiden, willst du Teile des Code mehrfach im Script verwenden, dann brauchst du Funktionen. Willst du bestimmte Dinge kapseln musst du OOP verwenden.

        Bei einem 10-Zeiler ist weder das eine noch das andere nötig, Code-Wiederholungen solltest du aber vermeiden, dann machen Funktionen trotzdem Sinn.

        --
        42
        1. Du musst entscheiden, willst du Teile des Code mehrfach im Script verwenden, dann brauchst du Funktionen. Willst du bestimmte Dinge kapseln musst du OOP verwenden.

          Ich hab mal eine Funktion getestet, so sieht diese derzeit aus:

            
          <?php  
          function kundenmeinungen($sort = "DESC") {  
                  if($sort != "ASC" && $sort != "DESC") {  
                      return false;  
                  }  
            
                  $stmt = $mysqli->prepare("KdM_id, KdM_name, KdM_nachricht, KdM_status FROM web_kundenmeinungen ORDER BY KdM_id " . $sort);  
                  $stmt->execute();  
            
                  return $stmt->fetchAll(PDO::FETCH_ASSOC);  
              }  
          ?>  
          
          

          und in meiner Ausgabe rufe ich diese so auf

            
          <?php  
          $entries = kundenmeinungen();  
          echo '<pre>';  
          var_dump($entries);  
          echo '</pre>';  
          ?>  
          
          

          es kommt nun diese Fehlermeldung

          Notice: Undefined variable: mysqli in in Zeile 7 & Fatal error: Call to a member function prepare() on a non-object in Zeile 7. In der Zeile 7 steht $stmt = $mysqli->prepare ....

          Was mache ich falsch?

          1. Mahlzeit,

            function kundenmeinungen($sort = "DESC") {
                    if($sort != "ASC" && $sort != "DESC") {
                        return false;
                    }

            erstmal springst du hier zurück, weil du die Funktion ohne Parameter ($sort) aufrufst.

            $stmt = $mysqli->prepare("KdM_id, KdM_name, KdM_nachricht, KdM_status FROM web_kundenmeinungen ORDER BY KdM_id " . $sort);

            es kommt nun diese Fehlermeldung

            Notice: Undefined variable: mysqli in in Zeile 7 & Fatal error: Call to a member function prepare() on a non-object in Zeile 7. In der Zeile 7 steht $stmt = $mysqli->prepare ....

            Was mache ich falsch?

            Na du öffnest die Verbindung zur Datenbank nicht. Das ist im Übriogen kein Problem der Funktion sondern des Scriptes allgemein.

            --
            42
            1. Na du öffnest die Verbindung zur Datenbank nicht. Das ist im Übriogen kein Problem der Funktion sondern des Scriptes allgemein.

              Eigentlich schon, da meine Zugangsdaten in der index.php aufgerufen werden und ich die inc. kundenmeinungen.php in der referenzen.php einbinde.

                
              <?php  
              include_once 'inc.sidebar.kundenmeinungen.php';  
              ?>	  
              
              
              1. Mahlzeit,

                Eigentlich schon, da meine Zugangsdaten in der index.php aufgerufen werden und ich die inc. kundenmeinungen.php in der referenzen.php einbinde.

                Ist in deinem geposteten Code nicht zu erkennen.

                Wenn es extern gemacht wird, musst du das Objekt in der Funktion bekannt machen, entweder per global (pfui) oder per Parameter.

                <?php
                include_once 'inc.sidebar.kundenmeinungen.php';
                ?>

                  
                Das sagt jetzt genau was über den Inhalt aus?  
                
                -- 
                42
                
          2. Hallo,

            <?php

            function kundenmeinungen($sort = "DESC") {
                    if($sort != "ASC" && $sort != "DESC") {
                        return false;
                    }

              
            vergiss die Anmerkung von M., dass $sort hier nicht definiert sei: Du hast im Kopf der Funktion einen Defaultwert, nämlich "DESC" angegeben. Wenn die Funktion also ohne Parameter aufgerufen wird, hat $sort diesen Defaultwert. Das ist völlig okay.  
              
            
            > ~~~php
            
                    $stmt = $mysqli->prepare("KdM_id, KdM_name, KdM_nachricht, KdM_status FROM web_kundenmeinungen ORDER BY KdM_id " . $sort);  
            
            >         $stmt->execute();  
            >   
            >         return $stmt->fetchAll(PDO::FETCH_ASSOC);  
            >     }  
            > ?>
            
            

            Notice: Undefined variable: mysqli in in Zeile 7 & Fatal error: Call to a member function prepare() on a non-object
            in Zeile 7. In der Zeile 7 steht $stmt = $mysqli->prepare ....

            Ja, aber du missachtest hier eine Design-Grundregel von Funktionen: Funktionen bilden einen in sich abgeschlossenen Gültigkeitsbereich. Im Idealfall kennen Funktionen nur die Daten, die man ihnen ausdrücklich als Parameter übergibt und sind von ihrer Umgebung unabhängig.
            In manchen Programmiersprachen können und dürfen Funktionen auch auf globale Daten zugreifen (auch wenn das nicht wirklich sauber ist); in PHP gilt das nicht. Hier ist $mysqli außerhalb der Funktion deklariert, demzufolge innerhalb nicht bekannt.

            Entweder machst du nun $mysqli auch innerhalb der Funktion mit dem Schlüsselwort global bekannt (quick'n'dirty, vor allem dirty), oder du übergibst das mysqli-Objekt als ersten Pflicht-Parameter.

            So long,
             Martin

            --
            Dem Philosoph ist nichts zu doof.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Laut meinem Tutorial sollte ich alles richtig gemacht haben, meine Fehlermeldungen sind zwar weg, aber dafür erhalte ich keine Ausgabe.

              Meine functions.php sieht nun wioe folgt aus

                
              class DB {  
              	private static $_db_username 		= "xxx";  
              	private static $_db_password 		= "xxx";  
              	private static $_db_host 			= "xxx";  
              	private static $_db_name			= "xxx";  
              	private static $_db;	  
              	  
              	function __construct() {  
              		try {  
              		self::$_db = new PDO("mysql:host=" . self::$_db_host . ";dbname=" . self::$_db_name,  self::$_db_username , self::$_db_password);  
              		} catch(PDOException $e) {  
              			echo "Datenbankverbindung gescheitert!";  
              			die();  
              		}  
              	}  
              	  
              	function kundenmeinungen($sort = "DESC") {  
              		if($sort != "ASC" && $sort != "DESC") {  
              			 return false;	  
              		}  
                
              		$stmt = self::$_db->prepare("SELECT KdM_id, KdM_name, KdM_nachricht, KdM_status FROM web_kundenmeinungen ORDER BY KdM_id" . $sort);	  
              		$stmt->execute();  
              		  
              		return $stmt->fetchAll(PDO::FETCH_ASSOC);  
              	}  
              }  
              
              

              In meiner Index Datei, habe ich diese Dateinun eingebunden

                
              ob_start();  
              session_start();  
              require_once 'include/functions/uebersicht.php';  
              require_once 'include/lib/Swift-5.0.3/lib/swift_required.php';  
              $db = new DB();	  
              error_reporting(E_ALL);  
              ini_set('display_errors', 1);  
              
              

              Auf meiner Ausgabe Seite habe ich dieses wie folgt umgesetzt

                
              <?php  
              $entries = $db->kundenmeinungen();  
              foreach($entries as $entry) {  
              ?>  
              	<blockquote><?php echo htmlspecialchars($entry['KdM_nachricht']);?><span class="refName"><?php echo htmlspecialchars($entry['KdM_name']);?></span>  
                  </blockquote>  
              <?php  
                }  
              ?>
              

              Lass ich alles mit var_dump ausgeben:

                
              echo '<pre>';  
              echo var_dump($entries);  
              echo '</pre>';  
              
              

              erhalte ich dieses

              array(0) {
              }

              1. Ok, ich hab den Fehler gefunden, bei KdM_id" . $sort); muss es so KdM_id ".$sort); heißen. Ich dachte immer die Leerzeichen sind egal.

                1. Mahlzeit,

                  Ich dachte immer die Leerzeichen sind egal.

                  Ja und nein. Innerhalb deiner " sind sie hier nötig um ein gültiges Query zu erzeuigen, beim . ist es egal ob du eins machst.

                  --
                  42
            2. Mahlzeit,

              vergiss die Anmerkung von M., dass $sort hier nicht definiert sei: Du hast im Kopf der Funktion einen Defaultwert, nämlich "DESC" angegeben. Wenn die Funktion also ohne Parameter aufgerufen wird, hat $sort diesen Defaultwert. Das ist völlig okay.

              Verdammt..... Ich glaub ich brauch echt ne Brille :(
              Allerdings ist die Abfrage dann völlig sinnlos, da sie nie zutrifft ;)

              --
              42
              1. Hi,

                vergiss die Anmerkung von M., dass $sort hier nicht definiert sei: Du hast im Kopf der Funktion einen Defaultwert, nämlich "DESC" angegeben. Wenn die Funktion also ohne Parameter aufgerufen wird, hat $sort diesen Defaultwert. Das ist völlig okay.
                Verdammt..... Ich glaub ich brauch echt ne Brille :(

                Die habe ich, seit ich sieben bin. Hilft aber auch nicht immer. ;-)

                Allerdings ist die Abfrage dann völlig sinnlos, da sie nie zutrifft ;)

                Außer man ruft die Funktion mal mit kundenmeinung("DONTCARE"); auf, oder so ähnlich. Wenn man brav ist und nur entweder "ASC" oder "DESC" oder nichts übergibt, hast du Recht. So gesehen wäre es vielleicht sogar besser, bei einem ungültigen Wert die Funktion nicht sang- und klanglos zu beenden, sondern dann mit dem Defaultwert weiterzumachen.

                Ciao,
                 Martin

                --
                Rizinus hat sich angeblich als sehr gutes Mittel gegen Husten bewährt.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Außer man ruft die Funktion mal mit kundenmeinung("DONTCARE"); auf, oder so ähnlich. Wenn man brav ist und nur entweder "ASC" oder "DESC" oder nichts übergibt, hast du Recht. So gesehen wäre es vielleicht sogar besser, bei einem ungültigen Wert die Funktion nicht sang- und klanglos zu beenden, sondern dann mit dem Defaultwert weiterzumachen.

                  Hab meine Abfrage etwas erweitert, sollte nun ein falschen Wert übermittelt werden warum auch immer, kommt eine Ausgabe, dass etwas nicht stimmt. Ich denke das macht mehr Sinn oder?

                    
                  <?php  
                  $entries = $db->kundenmeinungen('hallo');  
                    
                  if($db->kundenmeinungen() === TRUE) {  
                  	foreach($entries as $entry) {  
                  ?>  
                      <blockquote><?php echo htmlspecialchars($entry['KdM_nachricht']);?><span><?php echo htmlspecialchars($entry['KdM_name']);?></span>  
                      </blockquote>  
                  <?php  
                    }  
                  } else {  
                      echo "Es wurde ein ungültiger Parameter übergeben!";  
                         }  
                  ?>  
                  
                  

                  Oder meintest du mit „sang- und klanglos zu beenden“ etwas anderes?

                  1. Hab noch ein paar Fehler drin gehabt, nach meinem Test geht alles, was sagt ihr dazu? Alles richtig gemacht?

                    Ausgabe

                      
                    <?php  
                    $entries = $db->kundenmeinungen('ASC');  
                      
                    if($db->kundenmeinungen() == TRUE)  
                    {  
                    foreach($entries as $entry) {  
                    ?>  
                    	<blockquote><?php echo htmlspecialchars($entry['KdM_nachricht']);?><span><?php echo htmlspecialchars($entry['KdM_name']);?></span>  
                        </blockquote>  
                    <?php  
                      }  
                          }  
                    ?>  
                    
                    

                    Und hier meine Funktion

                      
                    	function kundenmeinungen($sort = "DESC") {  
                    		if($sort != "ASC" && $sort != "DESC") {  
                    			echo "Fehler";  
                                		}  
                      
                    		$stmt = self::$_db->prepare("SELECT KdM_id, KdM_name, KdM_nachricht, KdM_status FROM web_kundenmeinungen ORDER BY KdM_id ".$sort);	  
                    		$stmt->execute();  
                    		  
                    		return $stmt->fetchAll(PDO::FETCH_ASSOC);  
                    	}  
                    
                    
                    1. Guten Abend,

                      ich verstehe eine Sache nicht, wenn ich eine normale Abfrage machen möchte

                        
                       <?php  
                              $stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen");  
                                $stmt->execute();  
                                $stmt->bind_result($ref_id, $ref_bild, $ref_alt, $ref_status);  
                                while($stmt->fetch()) {  
                              ?>  
                      			<img src="klein/<?php echo htmlspecialchars($ref_bild);?>" alt="<?php echo htmlspecialchars($ref_alt);?>">  
                      			 <?php  
                                }  
                              ?>  
                      
                      

                      bekomme ich diese Meldung:

                      "Call to a member function prepare() on a non-object in"

                      wenn ich eine Funktion habe, wie ich die hier http://forum.de.selfhtml.org/?t=217461&m=1493971 kann ich dann keine normale Abfragen mehr machen? Ich will nicht alles in Funktionen schreiben. Wenn ich eine Ausgabe nur einmal benötige, dann sind Funktionen doch total übertrieben oder?

                      1. Tach!

                        ich verstehe eine Sache nicht, wenn ich eine normale Abfrage machen möchte
                                $stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen");
                        bekomme ich diese Meldung:
                        "Call to a member function prepare() on a non-object in"

                        In $mysqli ist nicht das was du erwartest. var_dump() klärt auf. Die Ursache ist deinem Codeschnipsel nicht zu entnehmen.

                        wenn ich eine Funktion habe, wie ich die hier http://forum.de.selfhtml.org/?t=217461&m=1493971 kann ich dann keine normale Abfragen mehr machen?

                        Ob die Abfrage "normal" ist oder nicht, spielt keine Rolle. Vielleicht beachtest du die Variablengeltungsbereiche nicht. Wird denn $mysqli innerhalb der Funktion erstellt oder als Parameter reingereicht?

                        Ich will nicht alles in Funktionen schreiben. Wenn ich eine Ausgabe nur einmal benötige, dann sind Funktionen doch total übertrieben oder?

                        Oder. In einem Geradeaus-Script kann man das so sehen. Andererseits kann es auch der Übersichtlichkeit dienen, wenn der Code von zusammenhängenden Blöcken separiert ist.

                        dedlfix.

                        1. Hi,

                          Ich will nicht alles in Funktionen schreiben. Wenn ich eine Ausgabe nur einmal benötige, dann sind Funktionen doch total übertrieben oder?
                          Oder. In einem Geradeaus-Script kann man das so sehen. Andererseits kann es auch der Übersichtlichkeit dienen, wenn der Code von zusammenhängenden Blöcken separiert ist.

                          und eine gewisse Erfahrung sagt einem auch irgendwann, dass es günstig sein könnte, Code in eine Funktion zu kapseln, auch wenn man ihn im vorliegenden Script nur einmal braucht. Das Argument könnte dann sein: "Das kann ich doch bestimmt in einem anderen Projekt wiederverwenden."

                          Ciao,
                           Martin

                          --
                          Wissen erwirbt man, indem man immer das Kleingedruckte sorgfältig liest.
                          Erfahrung bekommt man, indem man das nicht tut.
                          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          3. Tach!

            Notice: Undefined variable: mysqli in in Zeile 7 & Fatal error: Call to a member function prepare() on a non-object in Zeile 7. In der Zeile 7 steht $stmt = $mysqli->prepare ....
            Was mache ich falsch?

            Immerhin hast du das error_reporting auf E_ALL stehen, sehr löblich. Funktionen haben ihren eigenen Geltungsbereich. Variablen von außen sind innen nicht vorhanden. Nun könntest du auf die Idee kommen, global einzusetzen, aber das macht es nicht besser. Übersichtlicher ist es, wenn alles benötigte reingereicht wird. Damit wird unter Umständen die Parameterliste recht lang. Das wäre dann ein guter Zeitpunkt, doch mit der OOP anzufangen und Klassen zu erstellen, die ihre Daten selbst verwalten.

            dedlfix.

  2. Ich hab das Gefühl, dass ich ein Denkfehler habe, was meine Datenbankstruktur angeht. Diese sieht derzeit wie folgt aus:

    CREATE TABLE IF NOT EXISTS web\_referenzen (
      ref\_id int(11) NOT NULL AUTO_INCREMENT,
      ref\_bild varchar(200) NOT NULL,
      ref\_wo varchar(200) NOT NULL,
      ref\_status enum('0','1') NOT NULL DEFAULT '1',
      PRIMARY KEY (ref\_id)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

    im Feld ref_wo steht z.B. „startseite“ beim auslesen sage ich meinem SQL nimm bitte nur diese Einträge die bei ref_wo „startseite“ haben. Soweit ok und es funktioniert.

    Aber nun möchte ich manche Bilder auch im Impressum z.B. stehen haben. Also müsste ich jetzt einen weiteren Datensatz anlegen für ref_wo „impressum“ finde ich etwas unnötig oder? Könnte ich das Feld ref_wo auch so nutzen „startseite, impressum, kontakt“ Wenn ja, wie müsste ich dann meine Query wie ich es im ersten Posting stehen habe ändern, dass ich auf der startseite wirklich nur die Einträge habe, die „startseite haben und im Impressum nur die Einträge habe, die im Feld ref_wo “impresusm" stehen haben.

    Hoffentlich versteht ihr was ich genau meine.

    Danke für eure Hilfe in den letzten Tagen. Ich weiß das wirklich sehr zu schätzen.

    1. Mahlzeit,

      Aber nun möchte ich manche Bilder auch im Impressum z.B. stehen haben. Also müsste ich jetzt einen weiteren Datensatz anlegen für ref_wo „impressum“ finde ich etwas unnötig oder?

      Das ist die einfache Methode, b ei der du nichts am Script ändern musst.

      Könnte ich das Feld ref_wo auch so nutzen „startseite, impressum, kontakt“ Wenn ja, wie müsste ich dann meine Query wie ich es im ersten Posting stehen habe ändern,

      Dann brauchst du LIKE oder REGEX, also z.B.

      SELECT ... WHERE ref_wo LIKE '%impressum%' ...

      Allerdings kosten LIKE und REGEX ziemlich viel, wenn du nur einen Handvoll Zugriffe auf deine Datenbank hast, ist das aber nicht relevant.

      --
      42
    2. Tach!

      Aber nun möchte ich manche Bilder auch im Impressum z.B. stehen haben. Also müsste ich jetzt einen weiteren Datensatz anlegen für ref_wo „impressum“ finde ich etwas unnötig oder?

      Das liest sich wie eine m:n-Beziehung. Für die wäre eine weitere Tabelle mit den Seiten und eine Zuordnungstabelle nötig, wenn man es "richtig" machen würde.

      Könnte ich das Feld ref_wo auch so nutzen „startseite, impressum, kontakt“

      Kann man für den Hausgebrauch machen. Ein Set (Feldtyp SET) bietet sich da an.

      Wenn ja, wie müsste ich dann meine Query wie ich es im ersten Posting stehen habe ändern, dass ich auf der startseite wirklich nur die Einträge habe, die „startseite haben und im Impressum nur die Einträge habe, die im Feld ref_wo “impresusm" stehen haben.

      Mit FIND_IN_SET() kann man in SET-Feldern suchen.

      dedlfix.

      1. Hi,

        Könnte ich das Feld ref_wo auch so nutzen „startseite, impressum, kontakt“

        Kann man für den Hausgebrauch machen. Ein Set (Feldtyp SET) bietet sich da an.

        Aber nur, wenn alle möglichen Werte im voraus feststehen (oder wenn man in Kauf nehmen will, beim Erstellen einer neuen Seite dann auch die Wertemenge des SET per ALTER TABLE anpassen zu müssen).

        Mit FIND_IN_SET() kann man in SET-Feldern suchen.

        In reinen Strings, die den gleichen Aufbau wie ein SET haben ("wert x,wert y,wert z"), auch.

        MfG ChrisB

        --
        Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
      2. Das liest sich wie eine m:n-Beziehung. Für die wäre eine weitere Tabelle mit den Seiten und eine Zuordnungstabelle nötig, wenn man es "richtig" machen würde.

        Danke für deine Antwort, wenn ich dich richtig verstanden habe, lege ich also zwei Tabellen an, die sehen dann wie folgt aus:

        CREATE TABLE IF NOT EXISTS web\_referenzen (
          ref\_id int(11) NOT NULL AUTO_INCREMENT,
          ref\_bild varchar(200) NOT NULL,
          ref\_status enum('0','1') NOT NULL DEFAULT '1',
          PRIMARY KEY (ref\_id)
        ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

        In dieser lege ich alles was zur jeweiligen Referenz gehört, richtig? Aber NICHT wo sie angezeigt werden soll, dazu lege ich eine weitere Tabelle an, die sieht dann wie folgt aus:

        CREATE TABLE IF NOT EXISTS web\_anzeigen\_referenzen (
          view\_ref\_id int(11) NOT NULL AUTO_INCREMENT,
          view\_ref\_Kd varchar(200) NOT NULL,
          view\_ref\_seite varchar(200) NOT NULL,
          PRIMARY KEY (view\_ref\_id)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

        In dieser lege ich fest auf welcher Seite die jeweilige Referenz gezeigt werden soll. Verstehe ich dieses richtig?

        Der Hintergrund ist folgender, ich habe später Artikel die ich in verschiedenen Rubriken anzeigen möchte, es kann auch passieren, dass ein Artikel z.B. in die Rubrik „Winter“ & „Weihnachten“ passt und es wäre so finde ich zu mindestens unnötig diesen Artikel zweimal anzulegen. Jetzt bin ich aber erst einmal bei meinen Referenzen, sehe da aber eine Ähnlichkeit.

        1. Tach!

          Das liest sich wie eine m:n-Beziehung. Für die wäre eine weitere Tabelle mit den Seiten und eine Zuordnungstabelle nötig, wenn man es "richtig" machen würde.
          Danke für deine Antwort, wenn ich dich richtig verstanden habe, lege ich also zwei Tabellen an, die sehen dann wie folgt aus:

          Es ist etwas schwer für mich zu antworten, weil ich verstehen muss, wozu deine Felder da sind. Das geht aber aus deren Namen nicht zwingend hervor. Ich erkläre mal kurz m:n in allgemeiner Form.

          Man hat also zwei Tabellen, in einer stehen die Seiten, in der anderen die Kategorien. Und dann kommt die dritte Tabelle ins Spiel. Die hat mindestens zwei Felder, das eine verweist auf eine Seite, das andere auf eine Kategorie. Wenn eine Seite nur genau einmal in einer bestimmten Kategorie auftauchen soll, legt man nun über diese beiden Felder einen gemeinsamen Primärschlüssel, oder zumindest einen Unique-Key. Eine eigene ID-Spalte kann man sich sparen, denn durch die Unique-Zuordnung kann man den jeweiligen Datensatz schon eindeutig bestimmen. - Weitere Felder kann man auch noch in dieser Tabelle anlegen, wenn zur jeweiligen Zuordnung noch wietere Daten abgelegt werden sollen. Beispielsweise eine Gültigkeitsdauer, von wann bis wann eine Seite in einer Kategorie angezeigt werden soll.

          dedlfix.

  3. Hallo,

    danke an alle die mir geholfen habe, aber ich merke ich komme mit diesen Classen usw. nicht weiter, ich bin seit 2 Tagen dran um zu versuchen eine Abfrage außerhalb einer Funktion zu machen, klappt leider nicht.

    Es bringt nichts wenn ich immer wieder Rückschritte habe, dann verzichte ich einfach auf alles und hab keine Webseite. Ist zwar schade, aber ich kann es nicht anderes.

    Danke nochmals!

    1. Mahlzeit,

      ich bin seit 2 Tagen dran um zu versuchen eine Abfrage außerhalb einer Funktion zu machen, klappt leider nicht.

      Und dann gibst du schon auf? Ich programmiere seit ca. 30 Jahren und lerne täglich was dazu. Wenn du glaubst, nach 2 Tagen noch nicht am Ziel zu sein, ist alles, was mit Computern zu tun hat, falsch für dich ;)

      --
      42
      1. Und dann gibst du schon auf? Ich programmiere seit ca. 30 Jahren und lerne täglich was dazu. Wenn du glaubst, nach 2 Tagen noch nicht am Ziel zu sein, ist alles, was mit Computern zu tun hat, falsch für dich ;)

        Was soll ich denn machen? Wenn nicht mal eine einfache Abfrage einer Datenbank richtig funktioniert. Also lass ich es lieber.

        1. hi Martin_Online,

          Und dann gibst du schon auf? Ich programmiere seit ca. 30 Jahren und lerne täglich was dazu. Wenn du glaubst, nach 2 Tagen noch nicht am Ziel zu sein, ist alles, was mit Computern zu tun hat, falsch für dich ;)

          Was soll ich denn machen? Wenn nicht mal eine einfache Abfrage einer Datenbank richtig funktioniert. Also lass ich es lieber.

          http://www.php.net/manual/de/pdo.prepared-statements.php.

          Oder ein serialisiertes Array in eine Datei schreiben, wenn es nur ein kleines Projekt ist. Für jede "Zeile" ein File. Mit der ID als Namen.

          mfg

          tami

        2. Mahlzeit,

          Was soll ich denn machen?

          Na z.B. dich erstmal mit den Grundlagen befassen. Wenn du OOP willst, fang am Anfang an und nicht gleich mit einem relativ komplexen Thema wie mysqli

          Wenn nicht mal eine einfache Abfrage einer Datenbank richtig funktioniert. Also lass ich es lieber.

          Diese Frustration, die ich da raushöre ist genau das, was rauskommt, wenn ein Anfänger ein Thema aufgreift, bei dem das grundlegenste Wissen fehlt.

          Fang mit einem einfachen Tutorial zu OOP an und arbeite dich vor. Dann hast du immer wieder ein Erfolgserlebnis und das Lernen macht Spass :)
          Wenn du dir dann die Grundlagen angeeignet hast (lass dir dafür ruhig 1-2 Wochen Zeit, ist noch kein Meister vom Himmel gefallen), dann mach weiter mit Dingen wie Mysqli oder PDO.

          Ist wie beim Reiten, beim ersten mal setzt du dich ja auch nicht auf ein Rennpferd und jagst um die Rennbahn, denn die Wahrscheinlichkeit, das du runterfällst ist praktisch bei 100%.

          --
          42
  4. Hallo,

    Ich hab mir jetzt mehrfach ein Video von Video2Brain angesehen wo es um Funktionen geht. Wenn ich alles richtig verstanden habe, wird eine Funktion so aufgebaut

      
    	function referenzen() {  
    		$stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen WHERE ref_status = '1'  LIMIT 6");  
            $stmt->execute();  
            $stmt->bind_result($ref_id, $ref_bild, $ref_alt, $ref_status);  
    	}  
    
    

    Und meine Ausgabe müsste doch so aussehen

      
    		referenzen();  
              while($stmt->fetch()) {  
            ?>  
    			<img src=<?php echo htmlspecialchars($ref_bild);?>" alt="<?php echo htmlspecialchars($ref_alt);?>">  
    			 <?php  
              }  
            ?>  
    
    

    Es kommt nun allerdings ein Fehler wie auch gestern Abend.

    m.php on line 4 Fatal error: Call to a member function prepare() on a non-object in

    Was mache ich denn falsch? Ich verstehe es einfach nicht. Dann noch eine Frage zu einer Class, muss um eine Funktion immer eine Class?

    Hab es auch so getestet:

      
    class projekt  
    {  
    	  
    	function referenzen() {  
    		$stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen WHERE ref_status = '1'  LIMIT 6");  
            $stmt->execute();  
            $stmt->bind_result($ref_id, $ref_bild, $ref_alt, $ref_status);  
    	}  
    	  
    }  
    
    

    und meine Ausgabe so:

      
    		$hallo = new projekt;  
    		$hallo->referenzen();  
              while($stmt->fetch()) {  
            ?>  
    			<img src="<?php echo htmlspecialchars($ref_bild);?>" alt="<?php echo htmlspecialchars($ref_alt);?>">  
    			 <?php  
              }  
            ?>  
    
    

    Dann bekomme ich diese Meldung:
    m.php on line 7 Fatal error: Call to a member function prepare() on a non-object in

    Der Aufbau meiner Datenbankverbindung sieht so aus

      
    <?php  
    $mysqli = new mysqli("xxx", "xxx", "xxx", "xxx");  
      
    	if ($mysqli->connect_error) {  
    	  echo "Fehler bei der Verbindung: " . mysqli_connect_error();  
    	  exit();  
    	}  
    	  
    	if (!$mysqli->set_charset("utf8")) {  
    	  echo "Fehler beim Laden von UTF8 ". $mysqli->error;  
    	}  
    ?>  
    
    

    Egal was ich mache, es funktioniert einfach nicht.

    1. Tach!

      Was mache ich denn falsch? Ich verstehe es einfach nicht.

      Wie ich schon sagte, beachtest du den Geltungsbereich von Variablen nicht. Was außerhalb einer Funktion ist, steht darinnen nicht zur Verfügung, was in ihr existiert, ist außerhalb nicht vorhanden. Deswegen haben Funktionen Parameter und Rückgabewerte, damit sie mit ihrer Außenwelt kommunizieren können.

      dedlfix.

    2. Mahlzeit,

      Was mache ich denn falsch? Ich verstehe es einfach nicht.

      Du hast das, was ich geschrieben habe, zu 100% ignoriert.
      Wenn du unbedingt beim Hausbau mit dem Dachstuhl anfangen willst und danach erst das Fundament bauen, wird dein Frust dich schnell zum Aufgeben zwingen.

      --
      42
    3. Naja keine Hilfe ist auch eine Hilfe!

      1. Mahlzeit,

        Naja keine Hilfe ist auch eine Hilfe!

        Jeder bekommt, was er verlangt.
        Und jetzt geht wieder spielen, denn lernen willst du offensichtlich nicht.

        --
        42
        1. Ich hoffe du stehst auch irgendwann vor einem Problem wo DU nicht weiter kommst, das wünsche ich mir.

          1. Mahlzeit,

            Ich hoffe du stehst auch irgendwann vor einem Problem wo DU nicht weiter kommst, das wünsche ich mir.

            Der Unterschied zu dir ist, wenn ich Hilfe bekomme, nutze ich diese. DU ignorierst alles und wunderst dich, dass du nicht weiterkommst.

            Somit wird mir nie passieren, dass ich bei einem Problem nicht weiterkomme. Und jetzt husch husch ..... Spielen gehen, bald ist Bettgehzeit für kleine bockige Kinder.

            --
            42
            1. Der Unterschied zu dir ist, wenn ich Hilfe bekomme, nutze ich diese. DU ignorierst alles und wunderst dich, dass du nicht weiterkommst.

              Wo hast du mir denn bitte geholfen? Ich sehe nichts! Du hast mir geschreiben ich soll es ohne Funktionen und Classen machen. Aber wie du sicherlich lesen kannst, bekomme ich es OHNE funktion und class bereits hin. Also was ist der nächste Schritt? richtig, es mit einer funktion zu testen und das klappt eben nicht.

              1. Mahlzeit,

                Wo hast du mir denn bitte geholfen? Ich sehe nichts!

                https://forum.selfhtml.org/?t=217461&m=1494479

                Und das "Fachlich hilfreich" ist sicher keine Sympathie-Bekundung, da mich hier im Forum wohl niemand wirklich sympatisch findet.

                Dann hab ich dich nochmal drauf aufmerksam gemacht:

                https://forum.selfhtml.org/?t=217461&m=1494545

                Und wieder hast du es ignoriert. Das zeigt ganz deutlich, du willst keine Hilfe, du willst nur ne Absolution dafür, wie du es machst. Die wirst du aber nicht bekommen und bei deinem Benehmen wirst du vermutlich auch keine Hilfe mehr bekommen. Denn du ignorierst sie ja bewusst.

                --
                42
                1. Hast du gelesen was ich geschrieben habe? Ich verstehe die Grundlagen und auch weiß ich wie an mit mysqli umgeht, sonst hätte meine Abfrage ja nicht geklappt oder?

                  Mein Problem ist, dass ich bei einer Class oder Funktion nicht weiter komme, das ignorierst du. Und dass meine Abfrage funktioniert habe ich bereits geschrieben.

                  1. Hallo

                    Mein Problem ist, dass ich bei einer Class oder Funktion nicht weiter komme, das ignorierst du. Und dass meine Abfrage funktioniert habe ich bereits geschrieben.

                    Und du ignorierst, unabhängig von Ms Verhalten, standhaft alle Hilfen, die dir gegeben werden und jammerst rum, dass sie dir nicht gegeben würden. Das stimmt aber nicht. Du machst in der Funktion irgendwas mit der Variablen $mysqli, die innerhalb der Funktion nicht existiert.

                    So, den Rest darfst du dir durch die Lektüre der dir schon vor Tagen gegebenen und oben verlinkten Hinweise anlesen. Bei Fragen fragen, aber nicht nochmal rumjammern.

                    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!"
                    ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                    Veranstaltungsdatenbank Vdb 0.3
                    1. Ich bin ja schon weiter gekommen, ich habe es bis jetzt so

                      Meine Funktion

                        
                      	function referenzen(&$mysqli) {  
                      		$stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen WHERE ref_status = '1'  LIMIT 6");  
                              $stmt->execute();  
                              $stmt->bind_result($ref_id, $ref_bild, $ref_alt, $ref_status);  
                      		while($stmt->fetch()) {  
                      			echo 'Hallo';  
                                }  
                      }  
                      
                      

                      Meine Ausgsabe sieht so aus:

                      referenzen($mysqli);

                      In diesem Beispiel bekomme ich 6 mal "Hallo" angezeigt, also bin ich auf dem richtigen weg. Stimmt das denn, was ich mache, oder ist das nur Zufall dass es jetzt geht?

                      1. Hallo

                        Meine Funktion

                        function referenzen(&$mysqli) {
                        // Krimskrams
                        }

                        
                        >   
                        > Meine Ausgsabe sieht so aus:  
                        >   
                        > `referenzen($mysqli);`{:.language-php}  
                          
                        Das ist der Aufruf, nicht die Ausgabe.  
                          
                        
                        > In diesem Beispiel bekomme ich 6 mal "Hallo" angezeigt …  
                          
                        \*Das\* ist die Ausgabe.  
                          
                        
                        > … also bin ich auf dem richtigen weg.  
                          
                        Wenn denn sechs Datenzeilen rauskommen sollen, ja.  
                          
                        
                        > Stimmt das denn, was ich mache, oder ist das nur Zufall dass es jetzt geht?  
                          
                        Mir ist zwar nicht klar, warum du das Objekt `$mysqli`{:.language-php} als Referenz an die Funktion übergibst (auch wenn diese `referenzen`{:.language-php} heißt), aber ansonsten sieht das gut aus.  
                          
                        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!"  
                          
                        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}  
                          
                        [Veranstaltungsdatenbank Vdb 0.3](http://termindbase.auge8472.de/)
                        
                        1. Hallo Auge,

                          vielleicht kannst du mir nochmals kurz helfen, hab meine Funktion um ein ORDER BY erweitert

                            
                          	function referenzen($mysqli, $sort) {  
                          		$stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen WHERE ref_status = '1' ORDER by ref_bild=? LIMIT 6");  
                                  $stmt->bind_param("s", $sort);  
                          
                          

                          im Aufruf übergebe ich den Wert so:

                            
                          referenzen($mysqli, "ASC");  
                          
                          

                          alternativ so

                            
                          referenzen($mysqli, "DESC");  
                          
                          

                          leider wird es in meiner Funktion bzw. in der Ausgabe nicht beachtet. Es kommt auch kein Fehler. Kannst du mir sagen bzw. ein Tipp geben, wo ich etwas falsch mache?

                          1. Hallo

                            vielleicht kannst du mir nochmals kurz helfen, hab meine Funktion um ein ORDER BY erweitert

                            Um genau zu sein, hast du den Query um das „ORDER BY“ erweitert. Dort gehört es ja auch hin.

                            function referenzen($mysqli, $sort) {
                            $stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen WHERE ref_status = '1' ORDER by ref_bild=? LIMIT 6");
                                    $stmt->bind_param("s", $sort);

                            
                            >   
                            > im Aufruf übergebe ich den Wert so:  
                            >   
                            > ~~~php
                              
                            
                            > referenzen($mysqli, "ASC");  
                            > 
                            
                            

                            Vorbildlich [1]. …

                            leider wird es in meiner Funktion bzw. in der Ausgabe nicht beachtet.

                            … Allerdings machst du nichts damit. Deine Notation der ORDER-BY-Klausel sieht auch etwas komisch aus. Dein Query (aufgedröselt):

                               -- …  
                                ORDER by ref_bild=? -- das ist komisch und ohne Benutzung der Reihenfolge  
                                -- …
                            

                            So wird's:

                                -- …  
                                ORDER by ref_bild ASC -- oder mit DESC  
                                -- …
                            

                            Jetzt musst du das nur noch in PHP übersetzen, weil $sort, worin ASC oder DESC steht, in den Query rein muss:

                            function referenzen($mysqli, $sort) {  
                                $stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen WHERE ref_status = '1' ORDER by ref_bild ". $sort ." LIMIT 6");  
                                // Krimskrams  
                            }
                            

                            [1] Du kannst einer Funktion auch optionale Parameter übergeben. Die müssen in der Parameterliste hinten stehen. Wenn du also normalerweise mit DESC sortierst und nur ausnahmsweise mit ASC, kannst du DESC als Standardwert festlegen, der bei Bedarf beim Aufruf der Funktion explizit überschrieben werden müsste.

                            function referenzen($mysqli, $sort = "DESC") {  
                                // Krimskrams  
                            }  
                              
                            referenzen($mysqli) // sortiert mit DESC  
                              
                            referenzen($mysqli, "ASC") // sortiert mit ASC
                            

                            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!"
                            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                            Veranstaltungsdatenbank Vdb 0.3
                            1. Hallo Auge,

                              vielen vielen Dank für deine Hilfe!

                              Gruß
                              Martin

        2. Tach!

          Und jetzt geht wieder spielen, denn lernen willst du offensichtlich nicht.

          Das ist noch lange kein Grund, jemanden runterzuputzen. Hör bitte endlich auf, unsere Besucher anzugreifen!

          dedlfix.

          1. Mahlzeit,

            zensierst du eigentlich selbst oder lässt du das andere machen?

            --
            42
            1. Om nah hoo pez nyeetz, M.!

              zensierst du eigentlich selbst oder lässt du das andere machen?

              In dem Fall war es meine Entscheidung, die ich ausschließlich der Formulierung wegen getroffen habe.

              Matthias

              --
              Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Komma und Kommandeur.