Veröffentlicht 24. September 20186 j Hallo ihr lieben, ich habe in PHPMyAdmin eine Datenbank erstellt mit mehreren Tabellen (4 Tabellen) und ein php Formular mit einer Suche + Eintragung, damit man in die Liste kommt in der Datenbank. Jetzt würde ich gerne in dem Suchfeld z.b. einen Namen eingeben können und der Spuckt mir dann alles aus, wer diesen Namen in den Tabellen trägt. Leider weiß ich nur nicht ganz, wie ich damit anfangen bzw. weiter machen soll. Eine Verbindung zur Datenbank habe ich jedoch definitiv, da ich neben dem Suchfeld noch eine art "Registrierung" habe, in dem man ebenfalls Name, EMail etc. einträgt und es dann absendet. Sobald man es absendet, wird es in der Datenbank ausgespuckt. Also das funktioniert. nur weiß ich echt grade nicht, wie ich weitermachen soll bei der Suchausgabe, wie mir da dann was ausgespuckt wird. Es wäre so toll, wenn mir wer helfen kann :x Ich hab irgendwie das Gefühl, dass die Lösung total einfach ist, ich dummerweise nur nicht drauf komme
24. September 20186 j Moin, Du fragst das Ergebnis von der Abfrage nirgendwo ab. https://php-de.github.io/jumpto/pdo/#bind-param Bearbeitet 24. September 20186 j von PVoss
24. September 20186 j Autor Gerade eben schrieb PVoss: Moin, Du fragst das Ergebnis von der Abfrage nirgendwo ab. oh muss das dann mit echo? und wie wird das dann da formuliert? ?
24. September 20186 j Autor ich habe das selbe jetzt nochmal mit einer kleineren und übersichtlicheren Datei versucht, auch mit der Ergebnis Abfrage, dennoch klappt es nicht, weil dann der Error kommt, dass in Zeile 36 was falsch ist bzw. stört..
24. September 20186 j Den Tabellennamen schreibt man nicht in ' ... das hast du doch in deinem Code oben auch nicht gemacht. Sorry, ich hatte vorhin übersehen, dass du ja mysqli und nicht pdo nutzt. Die Lösung wird aber ähnlich aussehen, musst halt das Ergebnis der Abfrage fetchen. Poste Code demnächst bitte als Text und nicht als Bild. Wenn man als Helfer etwas im Code ändern möchte, um dir zu zeigen wie es richtig aussehen muss, haben die wenigsten Lust erst den Code aus dem Bild abzuschreiben. Wenn du direkt Text postest können wir den einfach kopieren. vor 5 Minuten schrieb DomentusTM: weil dann der Error kommt, dass in Zeile 36 was falsch ist bzw. stört.. Die vollständige Fehlermeldung zu posten kostet dich nichts. Hilft uns aber dabei den Fehler zu finden.
24. September 20186 j Autor Fatal error: Uncaught Error: Call to a member function fetch_object() on boolean in C:\xampp\htdocs\dfgfdg.php:36 Stack trace: #0 {main} thrown in C:\xampp\htdocs\dfgfdg.php on line 36 - einmal die Fehlermeldung - und der Code <!DOCTYPE html> <html> <head> <title>test_1 Nachrichten</title> </head> <body> <header>test_1 Nachrichten</header> <section> <form method="get"> <input type="test" class="suchfeld" name="search"/> <input type="submit" class="suchbotton" value="Suche"/> </form> <p> <?php if(isset($_GET["search"])) { $suchwort = $_GET["search"]; $abfrage = ""; $abfrage2 = ""; $suchwort = explode(" ", $suchwort); for($i = 0; $i < sizeof($suchwort); $i++) { $abfrage .= "`betreff` LIKE '%" . $suchwort[$i] . "%'"; $abfrage2 .= "`nachricht` LIKE '%" . $suchwort[$i] . "%'"; if($i < (sizeof($suchwort) - 1)) { $abfrage .= "OR"; $abfrage2 .= "OR"; } } $db = @new mysqli('localhost', 'root', ''); if(mysqli_connect_error() == 0) { $sql = "SELECT * FROM 'test_1' WHERE ".$abfrage . "OR" . $abfrage2; $ergebnis = $db->query($sql); while($zeile = $ergebnis->fetch_object()) { echo "<p>"; echo $zeile->id; echo " :: "; echo $zeile->betreff; echo " <b>"; echo $zeile->nachricht; echo "</b></p>"; } } $db->close; } ?> </p> </section> </body>
24. September 20186 j Code-Postings am Besten immer mit der entsprechenden Option des Beitrageditors (<>-Symbol) einfügen, dann liest es sich leichter ? Aber zu Deinem Code und dessen Problemen: Der Fehler wird zwar durch Zeile 36 verursacht: while($zeile = $ergebnis->fetch_object()) Der eigentliche Grund liegt aber, aufgrund von diversen Logikfehlern und Herangehensweise, viel weiter oben... Dort wo das Statement zusammengebastelt wird... Ich gehe hier einfach mal nicht darauf ein, wie man das erheblich besser machen könnte und woraus die, definitiv vorhandenen Sicherheitslücken (z.B. SQL-Injection) resultieren, um den damit verbundenen Lerneffekt zu gefährden. Stattdessen widme ich mich gleich mal der sinnvollen Frage: Wie findet man sowas überhaupt? Der erste Schritt, wäre hier die Ausgabe des zusammengebastelten SQL-Befehls, welcher dann in Zeile 34 abgesetzt wird: $ergebnis = $db->query($sql); Die Variable $sql und auch das $ergebnis mit: var_dump($variablenname); oder print_r($variablenname); Das Statement sieht mit Sicherheit ein wenig seltsam aus, oder? Wenn Du an dieser Stelle immer noch unsicher bist oder das Statement sehr komplex ist, hilft es oft das gesamte Statement einfach mal in PHPMyAdmin oder über die CLI direkt abzusetzen und zu sehen, ob es überhaupt ausgeführt werden kann. Der nächste Schritt wäre ein Blick in die Dokumentation des Befehls, welcher das Statement letztlich ausführt (auch Zeile 34), dort findet sich dann auch der entsprechende Rückgabewert im Falle von ungültigen SQL-Statements (false). Und nochmal zusammengefasst: Der SQL-Befehl wird aufgrund von Logikfehlern fehlerhaft erzeugt (< Zeile 34), kann dann nicht ausgeführt werden (Zeile 34) und der entsprechende Rückgabewert (Boolean) generiert dann in Zeile 36 den geposteten Fehler: Fatal error: Uncaught Error: Call to a member function fetch_object() on boolean in C:\xampp\htdocs\dfgfdg.php:36 Stack trace: #0 {main} thrown in C:\xampp\htdocs\dfgfdg.php on line 36 Boolean (true oder false) lassen nicht einfach nicht mit Schleifen durchlaufen oder in entsprechende Objekte konvertieren...
25. September 20186 j vor 17 Stunden schrieb el_pollo_diablo: Boolean (true oder false) lassen nicht einfach nicht mit Schleifen durchlaufen oder in entsprechende Objekte konvertieren... Doch, klar. Gerade bei While-Schleifen funktioniert while(true) doch super ? $ergebnis ist false, da gibt es die Methode fetch_object() nicht und deshalb wirft er, beim Versuch diese Methode aufzurufen, den Fatal Error. Bearbeitet 25. September 20186 j von PVoss
25. September 20186 j Auf W3schools findest du ein Bisschen Code wie man per mysqli Daten ausliest. Kurzum, du solltest erst mit if ($ergebnis->num_rows > 0) { prüfen, ob du überhaupt Ergebnisse zurückbekommst. Du kannst mit den beiden Befehlen print_r($ergebnis); var_dump($ergebnis); auch das Ergebnis mal genauer anschauen um festzustellen ob mit dem Objekt was nicht stimmt. Ich bin mir außerdem nich ganz sicher, was das "@" in $db = @new mysqli('localhost', 'root', ''); zu suchen hat, kenne mich mit mysqli aber nicht so wahnsinnig gut aus, da ich meistens pbo verwende
25. September 20186 j vor 13 Minuten schrieb äymm: if ($ergebnis->num_rows > 0) { Würde immer noch einen Error werfen, weil $ergebnis false ist und num_rows nicht kennt. @DomentusTMWelcher Code soll jetzt eigentlich gefixed werden? Im zweiten Code-Snippet hast du andere Fehler drin als im ersten. Beim ersten muss du halt das Ergebnis fetchen. Beim zweiten musst du die Syntax-Fehler in deiner SQL-Abfrage korrigieren. vor 13 Minuten schrieb äymm: Ich bin mir außerdem nich ganz sicher, was das "@" in Damit unterdrückt man Fehlermeldungen. Wenn das Connecten zur Datenbank also scheitern würde, würde man es erst merken wenn man anschließend mit der Verbindung arbeiten möchte. Es wird aber durch das anschließende if(mysqli_connect_error() == 0) einigermaßen ausgebügelt. Bearbeitet 25. September 20186 j von PVoss
27. September 20186 j Autor @PVoss, ich habe jetzt das ganze mal übersichtlicher gestaltet.. Konnte die letzten 2 Tage nicht weiter dran arbeiten und fand das heute morgen sehr unübersichtlich. Zudem kommt auch keine Fehlermeldung mehr, dennoch wird nichts ausgegeben leider. Code: <?php // Start Suche ausgeben if(isset($_GET["search"])) { $suchwort = $_GET["search"]; $verbindung=mysqli_connect("localhost","projekt_clab","","projekt_clab"); // Start Verbindung $sql = "select * from bearbeiter where Bearbeiter_ID like '%$suchwort%' and Name like '%$suchwort%'"; // SQL Abfrage $result = mysqli_query($verbindung, $sql) or die( mysqli_error($verbindung) ); while($row = mysqli_fetch_object($result)) { echo $row->Bearbeiter_ID; // Start Ausgabe echo "<br>"; echo $row->Name; echo "<br>"; } } // Ende Suche // Start Neue Eintragung in "Nutzer" if(isset($_POST["submit"])): $vorname = $_POST['vorname']; $nachname = $_POST['nachname']; $email = $_POST['email']; $telefonnummer = $_POST['telefonnummer']; $raum = $_POST['raum']; $geraet = $_POST['geraet']; $absenden = $db->prepare("INSERT INTO nutzer (vorname, nachname, email, telefonnummer, raum, geraet) VALUES (?,?,?,?,?,?)"); $absenden->bind_param('sssiis',$vorname,$nachname,$email,$telefonnummer,$raum,$geraet); $absenden->execute(); // Ende Eintragung endif; ?>
27. September 20186 j Autor Das mit der Eintragung klappt super, ohne Fehlermeldungen und nach dem absenden, ist das eingetragene auch in der db gespeichert.. Lediglich nur die Suche funktioniert nicht so, wie ich es gern hätte..
27. September 20186 j Ich kann mir vorstellen, dass es an der AND-Verknüpfung zwischen der Abfrage von ID und Namen in der Abfrage liegt. Mach da mal ein OR draus.
27. September 20186 j Autor vor 1 Minute schrieb PVoss: Ich kann mir vorstellen, dass es an der AND-Verknüpfung zwischen der Abfrage von ID und Namen in der Abfrage liegt. Mach da mal ein OR draus. kommt leider auch nichts als Ausgabe raus.. aber auch keine fehlermeldung Das hatte ich auch schon versucht
27. September 20186 j vor 22 Minuten schrieb DomentusTM: Bearbeiter_ID like '%$suchwort%' ist der Datentyp von Bearbeiter_ID eine Zeichenkette?
27. September 20186 j Autor vor 1 Minute schrieb _n4p_: ist der Datentyp von Bearbeiter_ID eine Zeichenkette? Wie meinst du das?
27. September 20186 j Autor Hatte überlegt, ob es eventuell damit zusammenhängen könnte? <form action="(Weil das hier leer ist?)" method="post"><p align="center"> <font color="black"><strong>Geben sie einen Nutzer ein: </strong><input type="text" name="search" size="100" maxlength="150" placeholder="Suche"><br> <input type="submit" name="submit1" value="Suchen"><br> </form>
27. September 20186 j Nein, weil du beim PHP-Teil auf Get-Parameter zugreifst, du die Daten im Formular aber mit Post schickst. $_GET["search"] mustt $_POST['search'] sein
27. September 20186 j Autor vor 35 Minuten schrieb PVoss: Nein, weil du beim PHP-Teil auf Get-Parameter zugreifst, du die Daten im Formular aber mit Post schickst. $_GET["search"] mustt $_POST['search'] sein So, ich hab es geschafft.. Genau das war Problem 1. Problem 2. war: Er hat keine Verbindung zur DB bekommen, obwohl ich es in einer anderen Datei auch so hatte und es da ging. -Habe ich das geändert. Jetzt funktioniert es, wie es soll Nur noch eine Tabelle machen, damit das auch schön aussieht. Danke!
27. September 20186 j vor einer Stunde schrieb DomentusTM: Wie meinst du das? weil ich tatsächlich davon ausging das das nicht geht, da man ja einen String mit einer Zahl vergleicht. Geht aber offensichtlich ^^
27. September 20186 j Autor Jetzt habe ich doch nochmal eine frage.. Wenn ich einen Namen ausgeben möchte, schreibe ich ja den SQL Befehl in den PHP text so rein: $sql = "select * from bearbeiter where Bearbeiter_ID like '%$suchwort%' or Name like '%$suchwort%'"; Wie muss ich das denn schreiben, wenn ich mehrere Tabellen mit mehreren Spalten im zusammenhang ausgeben möchte? Im SQL Quelltext sieht das ganze dann so aus: select Name, Geraete_ID, Geraetebezeichnung, Seriennummer, Eingang, Ausgang, Vorname, Nachname from nutzer, geraete, status, bearbeiter where nutzer.Nutzer_ID = geraete.Geraete_Nutzer and geraete.Geraete_ID = status.Geraet and status.Bearbeiter = bearbeiter.Bearbeiter_ID Dann ist aber Jeder Name ausgegeben mit dem zusammenhang der anderen Tabellen. Ich möchte aber nur einen Namen ausgeben lassen. Da muss ja auch wieder irgendwo ein like '%$suchwort%' oder irre ich mich da? Ich hab damit schon so vieles versucht..
27. September 20186 j Ja, du musst deine Suche von oben mit an deine Where-Klausel anhängen wenn du das Ergebnis weiter einschränken möchtest. "SELECT ... WHERE .. AND (name LIKE ... OR blabla LIKE ...)" Ich würde dir stark empfehlen, für deine Abfragen ebenfalls Prepared Statements zu nutzen. So wie du es beim Insert-Statement auch schon machst. Außerdem ist die explizite Join-Schreibweise zu empfehlen, weil es viel einfacher zu lesen ist. Dann würdest du auch schnell sehen, dass du da einfach deine Where-Klausel mit der LIKE-Suche anhängen kannst, weil das dann die einzige Einschränkung per Where wäre. SELECT Name, Geraete_ID, Geraetebezeichnung, Seriennummer, Eingang, Ausgang, Vorname, Nachname FROM nutzer INNER JOIN geraete ON nutzer.Nutzer_ID = geraete.Geraete_Nutzer INNER JOIN status ON geraete.Geraete_ID = status.Geraet INNER JOIN bearbeiter ON status.Bearbeiter = bearbeiter.Bearbeiter_ID Dann die Bezeichnungen. So Dinge wie "Name" und "Status" sind zwar keine reservierten Bezeichner, aber haben trotzdem eine besondere Bedeutung. Hier würde ich auch empfehlen die umzubenennen solange dein Projekt noch nicht groß ist. Mal zum schnellen Lesen: https://stackoverflow.com/a/41462375/3595565
27. September 20186 j Autor @PVoss ok, das hat super geklappt.. auf das einfachste kommt man nicht Tausend dank!
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.