MySQL-Datenbank mit php durchsuchen.

philsch

Grünschnabel
Hallo,
ich habe gerade eine Suchfunktion in php geschrieben.
Soweit alles auch in Ordnung, allerdings wird mir keine Ergebnisse ausgegeben

Mein Code:
PHP:
<!DOCTYPE HTML>
<html>
    <head>
        <title>Suchanfrage</title>
    </head>
    <body>
        <form action="index.php" method="POST">
            <input type="text" name="suchfeld"><input type="submit" name="suche_enter" value="suchen">
        </form>
        <hr><br>
        <?php_egg_logo_guid
        if(isset($_POST['suche_enter']))
        {
            $host = "localhost";
            $user = "root";
            $pass = "";
            $con = mysql_connect($host,$user,$pass) or die(mysql_error());
            mysql_selct_db("suche",$con) or die(mysql_error());
            $suchbegriff = trim(htmlentities(stripslashes(mysql_real_escape_string($_POST['suchfeld']))));
         
            $sql = "
            SELECT
                v_bandbreite,strasse,hausnummer,vorwahl,telefonnr
            FROM
                bandbreite
            WHERE
                vorwahl LIKE '%$suchbegriff%'
                OR
                telefonnr LIKE '%$suchbegriff%'
                OR
                strasse LIKE '%$suchbegriff%'
                OR
                hausnummer LIKE '%$suchbegriff%'
            ORDER BY
                strasse,hausnummer,vorwahl,telefonnr
            ";
            $query = mysql_query($sql)
         
            echo '<ul>';
            WHILE($row = mysql_fetch_assoc($query))
            {
                $strasse = $row['strasse'];
                $hausnummer = $row['hausnummer'];
                $vorwahl = $row['vorwahl'];
                $telefonnr = $row['telefonnr'];
                $v_bandbreite = $row['v_bandbreite'];
             
                echo '<li>Test $strasse $hausnummer ($vorwahl - $telefonnr) - <b>$v_bandbreite</b></li>';
            }
            echo '</ul>'
        }
        ?>
    </body>
</html>

Meine Datenbank (suche) enthält folgende Tabelle (bandbreite):
id vorwahl telefonnr strasse hausnummer v_bandbreite
1 01234 2345 bahnhofstrasse 22 32000
2 05678 9876 hauptweg 11 6000

Wenn ich nun die index.php über XAMPP laufen lasse und sie in Chrome öffne, dann erhalte ich das:

[Suchfeld] [suchen]
__________________________________________________________
'; WHILE($row = mysql_fetch_assoc($query)) { $strasse = $row['strasse']; $hausnummer = $row['hausnummer']; $vorwahl = $row['vorwahl']; $telefonnr = $row['telefonnr']; $v_bandbreite = $row['v_bandbreite']; echo '
  • Test $strasse $hausnummer ($vorwahl - $telefonnr) - $v_bandbreite
'; } echo '' } ?>

Ich kann auch nicht suchen. Was habe ich falsch gemacht. Danke schonmal im voraus.

philsch
 
Zuletzt bearbeitet:
<?php_egg_logo_guid
Was soll das bewirken? normal kommt da nur ein <?php hin.
$query = mysql_query($sql)
Hier fehlt ein Semikolon.

Aber dennoch solltest du darauf achten, dass diese Art der Datenbankabfrage veraltet ist.
Zieh dir am besten das: mysql_selct_db() mal zu gemühte

Dort findest du auch Links zu MySQLi und PDO, welche aktuell sind.

Das trim(htmlentities(stripslashes(mysql_real_escape_string($_POST['suchfeld'])))), kannst du meines wissens mit PDO-Statement wunderbar weg lassen, wenn du mit bindparam() arbeitest.
 
Zuletzt bearbeitet:
Hallo vielen Dank für deinen Hinweis. Habe diese Art der Abfrage in einem Tutorial von 2013 gesehen. Ich werde mir das mal anschauen. Das egg...... hat notepad++ automatisch hinzugefügt, wenn ich das aber nun so abändere, wie du es mir gesagt hast, dann erhalte ich immer noch keine Ergebnisse.
 
Achja, zur leichteren Auswertung bitte ich dich, in Zukunft Codes über den Einfügen-Button/CODE des Editors in deine Post´s einzufügen und dabei bitte nicht vergessen, die richtige Programmiersprache auszuwählen, so dass man diese farbig wiedergegeben bekommt.
 
(Für die "mysql_"-Funktionen gibts seit 9 Jahren etwas Besseres.
Wenn du das in einem Tutorial von 2013 gesehen hast, lies es nicht.)
 
Hallo danke erstmal für alle Antworten, ist echt klasse, wie schnell hier geantwortet wird :)
Ich habe nochmal eine andere Suche nach einem Tutorial aus dem letzten Jahr erstellt. Thema ist eine Chartliste bzw. eine Chartplatzierung abzurufen.
Es funktioniert soweit auch alles, allerdings bekomme ich nach dem "submit" die Error-Meldung: Notice: Undefined property: mysqli::$close in C:\xampp\htdocs\suche\design\index.php on line 49
Mein Code:
PHP:
<!DOCTYPE html>
<html>
    <head>
        <title>Suche</title>
        <link rel="stylesheet" type="text/css" href="design.css" />
    </head>
    <body>
        <header>Suche</header>
        <section>
            <form method="get">
                <input type="text" class="suchfeld" name="search" />
                <input type="submit" class="suchbutton" value="Suche" />
            <form>
            <p>
            <?php
                if(isset($_GET["search"])) {
                    $suchwort = $_GET["search"];
                    $suchwort = explode(" ", $suchwort);
                    $abfrage = "";
                    $abfrage2 = "";
                    for($i = 0; $i < sizeof($suchwort); $i++)
                    {
                        $abfrage .= "`interpret` LIKE '%".$suchwort[$i]."%'";
                        $abfrage2 .= "`song` LIKE '%".$suchwort[$i]."%'";
                        if($i < (sizeof($suchwort) - 1)) {
                            $abfrage .= "OR";
                            $abfrage2 .= "OR";
                        }
                    }
                    //$suchwort = str_replace(" ", "%", $suchwort);
                    $db = @new mysqli('localhost', 'root', '', 'meinewelt');
                       
                    if(mysqli_connect_errno() == 0)
                    {
                        $sql = "SELECT * FROM `chart` WHERE ".$abfrage . "OR" . $abfrage2;
                        $ergebnis = $db->query($sql);
                           
                        while($zeile = $ergebnis->fetch_object())
                        {
                            echo "<p>";
                            echo $zeile->id;
                            echo "&nbsp;::&nbsp;";
                            echo $zeile->interpret;
                            echo "&nbsp;&nbsp;<b>";
                            echo $zeile->song;
                            echo "</b></p>";
                        }
                    }
                    $db -> close;
                }
            ?>
            </p>
        </section>
    </body>
</html>
 
Danke funktioniert jetzt. Ist das denn zeitgemäßer ? Funktioniert allerdings auch so:
PHP:
<?php
                if(isset($_GET["search"])) {
                    $suchwort = $_GET["search"];
                    $suchwort = explode(" ", $suchwort);
                    $abfrage = "";
                    $abfrage2 = "";
                    for($i = 0; $i < sizeof($suchwort); $i++)
                    {
                        $abfrage .= "`interpret` LIKE '%".$suchwort[$i]."%'";
                        $abfrage2 .= "`song` LIKE '%".$suchwort[$i]."%'";
                        if($i < (sizeof($suchwort) - 1)) {
                            $abfrage .= "OR";
                            $abfrage2 .= "OR";
                        }
                    }
                    //$suchwort = str_replace(" ", "%", $suchwort);
                    $host_name  = "DBName";
                    $database   = "DB";
                    $user_name  = "DBUser";
                    $password   = "DPPasswort";

                    $db = mysqli_connect($host_name, $user_name, $password, $database);
                      
                    if(mysqli_connect_errno() == 0)
                    {
                        $sql = "SELECT * FROM `chart` WHERE ".$abfrage . "OR" . $abfrage2;
                        $ergebnis = $db->query($sql);
                          
                        while($zeile = $ergebnis->fetch_object())
                        {
                            echo "<p>";
                            echo $zeile->id;
                            echo "&nbsp;::&nbsp;";
                            echo $zeile->interpret;
                            echo "&nbsp;&nbsp;<b>";
                            echo $zeile->song;
                            echo "</b></p>";
                        }
                    }
                    $db->close;
                }
            ?>
 
Zuletzt bearbeitet:
ohne der Klammern von @sheel´s Kommentar wirds zwar bestimmt nicht funktionieren, da das close noch eine nicht existierende Variable des Objekts wäre, aber mit den Klammern dürfte es zwar funktionieren, da es eine vom MySQLi vorhandene Objekt-Funktion ist.

Desweiteren solltest du dich meines Wissens entscheiden, ob du den prozeduraler Stil oder objektorientierten Stil verwendest.

  • $suchwort = $_GET["search"];
  • $suchwort = explode(" ", $suchwort);
  • $abfrage = "";
  • $abfrage2 = "";
  • for($i = 0; $i < sizeof($suchwort); $i++)
  • {
  • $abfrage .= "`interpret` LIKE '%".$suchwort[$i]."%'";
  • $abfrage2 .= "`song` LIKE '%".$suchwort[$i]."%'";
  • if($i < (sizeof($suchwort) - 1)) {
  • $abfrage .= "OR";
  • $abfrage2 .= "OR";
  • }
  • }

Bei MySQLi solltest du wie bei MySQL-Funktionen, ebenso die von allen externen ($_GET, $_POST usw.) empfangenen Daten überprüfen bzw. entschärfen, bevor du diese mit MySQLi-Funktionen in Verbindung bringst.

Anders ist es bei dem PDO-Statements, da übernehmen es die Platzhalter-Funktionen für dich mit.
Mit den 3 Funktionen, die mit "bind" anfangen, werden die Platzhalter ersetzt.
 
Zurück