Zum Inhalt springen
  • 0

Suchausgabe über PHPscript von Datenbank


FoxOff

Frage

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 :(

phpscript.JPG

seite.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

22 Antworten auf diese Frage

Empfohlene Beiträge

  • 1

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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 "&nbsp;::&nbsp;";
                        echo $zeile->betreff;
                        echo "&nbsp;&nbsp;<b>";
                        echo $zeile->nachricht;
                        echo "</b></p>";
                        }
                    }
                    $db->close;
                }
            ?>
            </p>
        </section>
    </body>

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
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 von PVoss
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
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 von PVoss
Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

@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;
?>

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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>    

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0
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! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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.. :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 0

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...