pappo1982
Goto Top

Suche PHP MySQL mit exaktem Ergebnis

Hallo,

ich habe wahrscheinlich irgendeinen Denkfehler in meinem Script. Ich möchte dass im Suchfeld nach der Stadt gesucht wird. Ich benötige im Ergebnis aber nur das exakte Ergebnis. Aktuell gibt es mir aber alle Datensätze aus die das Suchwort enthalten. Kann mir bitte jemand helfen?

<!DOCTYPE html>
<html>
    <head>
        <title>Suche</title>
        <link rel="stylesheet" type="text/css" href="design.css" />  
    </head>
    <body>
        
        <section>
            <div id="form">  
            <header>Suche</header>
            <form method="get">  
                <input type="text" class="suchfeld" name="search" />  
                <input type="submit" class="suchbutton" value="Suche" />  
            <form>
            </div>
            <div>
            <?php
                if(isset($_GET["search"])) {  
                    $suchwort = $_GET["search"];  
                    $suchwort = explode(" ", $suchwort);  
                    $abfrage = "";  
                    for($i = 0; $i < sizeof($suchwort); $i++)
                    {
                        $abfrage .= "`city` LIKE '%".$suchwort[$i]."%'";  
                        if($i < (sizeof($suchwort) - 1)) {
                            $abfrage .= "OR";  
                        }
                    }
                    $db = @new mysqli('localhost', 'USER', 'PASS', 'DB');  
                       
                    if(mysqli_connect_errno() == 0)
                    {
                        $sql = "SELECT * FROM rechner WHERE ".$abfrage ;  
                        $ergebnis = $db->query($sql);
                       echo '<table border="1">';      
                        while($zeile = $ergebnis->fetch_object())
                        {
                            
                            echo "<tr id='city'>";  
                            echo "<td id='city_td'>";  
                            echo "<b id='city'>Stadt&nbsp$zeile->city</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='vw'>Durschn. Windgeschwindigkeit von 11.10. - 31.03. (Windigere Zeit)</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='vw_result'>$zeile->vw</b>";  
                            echo " ";  
                            echo "<b id='vw_result'>m/s</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='ww'>Durschn. Windgeschwindigkeit von 01.04. - 10.10.(Weniger windige Zeit)</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='vw_result'>$zeile->ww</b>";  
                            echo " ";  
                            echo "<b id='vw_result'>m/s</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='pvw'>Produktion der LCG Windturbine von 11.10. - 31.03.</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='pvw_result'>$zeile->pvw</b>";;  
                            echo " ";  
                            echo "<b id='pvw_result'>kWh</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='pww'>Produktion der LCG Windturbine von 01.04. - 10.10.</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='pww_result'>$zeile->pww</b>";  
                            echo " ";  
                            echo "<b id='pww_result'>kWh</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='pjahr_result'>Erwartete Jahresproduktion in &nbsp$zeile->city</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='pjahr_result'>$zeile->pjahr</b>";  
                            echo " ";  
                            echo "<b id='pjahr_result'>kWh</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            
                        }
                        echo "</table>";  
                    }
                    $db -> close;
                }
            ?>
            </div>
            <div id="yearresult">   
                <?php
                    include('yearresult.php');  
                ?>
            </div>    
        </section>
    </body>
</html>

Content-ID: 3511412677

Url: https://administrator.de/contentid/3511412677

Ausgedruckt am: 22.11.2024 um 02:11 Uhr

michi1983
michi1983 01.08.2022 aktualisiert um 10:13:22 Uhr
Goto Top
Hallo,

$abfrage .= "`city` LIKE '%".$suchwort[$i]."%'";  

https://www.w3schools.com/sql/sql_like.asp

ist dafür verantwortlich.

Ersetzte das LIKE mit einem = und gib die % vor und nach dem Suchwort weg.

$abfrage .= "`city` = $suchwort[$i]";  

Die Sicherheitsaspekte in deinem Code jetzt mal außenvor gelassen!

Gruß
ottinho
ottinho 01.08.2022 um 10:12:34 Uhr
Goto Top
Hi,

du musst Zeile 25 anpassen. Stichwort "LIKE %".

Und so wie das aktuell aussieht baust du dir eine tolle SQL Injection. Mach dich mal schlau bezüglich prepared statements.

Viele Grüße
ottinho
Pappo1982
Pappo1982 01.08.2022 aktualisiert um 10:30:27 Uhr
Goto Top
Zitat von @michi1983:

Hallo,

$abfrage .= "`city` LIKE '%".$suchwort[$i]."%'";  

https://www.w3schools.com/sql/sql_like.asp

ist dafür verantwortlich.

Ersetzte das LIKE mit einem = und gib die % vor und nach dem Suchwort weg.

$abfrage .= "`city` = $suchwort[$i]";  

Die Sicherheitsaspekte in deinem Code jetzt mal außenvor gelassen!

Gruß

Jetzt gibt es mir aber gar keine Ergebnisse mehr aus! Auch wenn diese exakt wie in der Datenbank sind. So hatte ich das nämlich schonmal!
michi1983
michi1983 01.08.2022 um 11:16:20 Uhr
Goto Top
Zitat von @Pappo1982:
Jetzt gibt es mir aber gar keine Ergebnisse mehr aus! Auch wenn diese exakt wie in der Datenbank sind. So hatte ich das nämlich schonmal!

Kannst du denn mal das komplette "finale" SQL Statement ausgeben hier bei dem du keine Ergebnisse mehr bekommst?
Pappo1982
Pappo1982 01.08.2022 aktualisiert um 11:27:07 Uhr
Goto Top
Zitat von @michi1983:

Zitat von @Pappo1982:
Jetzt gibt es mir aber gar keine Ergebnisse mehr aus! Auch wenn diese exakt wie in der Datenbank sind. So hatte ich das nämlich schonmal!

Kannst du denn mal das komplette "finale" SQL Statement ausgeben hier bei dem du keine Ergebnisse mehr bekommst?

<!DOCTYPE html>
<html>
    <head>
        <title>Suche</title>
        <link rel="stylesheet" type="text/css" href="css/design.css" />  
    </head>
    <body>
        
        <section>
            <div id="form">  
            <header>Suche</header>
            <form method="get">  
                <input type="text" class="suchfeld" name="search" />  
                <input type="submit" class="suchbutton" value="Suche" />  
            <form>
            </div>
            <div>
            <?php
                if(isset($_GET["search"])) {  
                    $suchwort = $_GET["search"];  
                    $suchwort = explode(" ", $suchwort);  
                    $abfrage = "";  
                    for($i = 0; $i < sizeof($suchwort); $i++)
                    {
                        $abfrage .= "`city` = $suchwort[$i]";  
                        if($i < (sizeof($suchwort) - 1)) {
                            $abfrage .= "OR";  
                        }
                    }
                    $db = @new mysqli('localhost', 'USER', 'PASS', 'DB');  
                       
                    if(mysqli_connect_errno() == 0)
                    {
                        $sql = "SELECT * FROM rechner WHERE ".$abfrage ;  
                        $ergebnis = $db->query($sql);
                       echo '<table border="1">';      
                        while($zeile = $ergebnis->fetch_object())
                        {
                            
                            echo "<tr id='city'>";  
                            echo "<td id='city_td'>";  
                            echo "<b id='city'>Stadt&nbsp$zeile->city</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='vw'>Durschn. Windgeschwindigkeit von 11.10. - 31.03. (Windigere Zeit)</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='vw_result'>$zeile->vw</b>";  
                            echo " ";  
                            echo "<b id='vw_result'>m/s</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='ww'>Durschn. Windgeschwindigkeit von 01.04. - 10.10.(Weniger windige Zeit)</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='vw_result'>$zeile->ww</b>";  
                            echo " ";  
                            echo "<b id='vw_result'>m/s</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='pvw'>Produktion der LCG Windturbine von 11.10. - 31.03.</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='pvw_result'>$zeile->pvw</b>";;  
                            echo " ";  
                            echo "<b id='pvw_result'>kWh</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='pww'>Produktion der LCG Windturbine von 01.04. - 10.10.</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='pww_result'>$zeile->pww</b>";  
                            echo " ";  
                            echo "<b id='pww_result'>kWh</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            echo "<tr>";  
                            echo "<td>";  
                            echo "<b id='pjahr_result'>Erwartete Jahresproduktion in &nbsp$zeile->city</b>";  
                            echo "</td>";  
                            echo "<td>";  
                            echo "<b id='pjahr_result'>$zeile->pjahr</b>";  
                            echo " ";  
                            echo "<b id='pjahr_result'>kWh</b>";  
                            echo "</td>";  
                            echo "</tr>";  
                            
                        }
                        echo "</table>";  
                    }
                    $db -> close;
                }
            ?>
            </div>
            <div id="yearresult">   
                <?php
                    include('yearresult.php');  
                ?>
            </div>    
        </section>
    </body>
</html>

Das hier spuckt er mir aus wenn ich
echo ($sql);
ausgebe

SELECT * FROM rechner WHERE `city` = Hof
tk1234
tk1234 01.08.2022 um 11:43:38 Uhr
Goto Top
Zitat von @Pappo1982:
Das hier spuckt er mir aus wenn ich
echo ($sql);
ausgebe

SELECT * FROM rechner WHERE `city` = Hof

Die Spalte Hof gibt es nicht, du brauchst hier noch Anführungszeichen um den gesuchten Wert - der Query muss dann am Ende so aussehen: SELECT * FROM rechner WHERE `city` = 'Hof'

Aber bevor du weiter machst: beschäftige dich mit dem Thema Kontextwechsel - das was du hier machst ist nämlich richtig gefährlich!
LordGurke
LordGurke 01.08.2022 aktualisiert um 14:15:53 Uhr
Goto Top
Oder, um das Problem der SQL-Injection mal zu verdeutlichen:
Suche doch mal nach diesem Begriff:
1"; TRUNCATE TABLE `rechner`; --  
Pappo1982
Pappo1982 01.08.2022 um 15:43:09 Uhr
Goto Top
Zitat von @tk1234:

Zitat von @Pappo1982:
Das hier spuckt er mir aus wenn ich
echo ($sql);
ausgebe

SELECT * FROM rechner WHERE `city` = Hof

Die Spalte Hof gibt es nicht, du brauchst hier noch Anführungszeichen um den gesuchten Wert - der Query muss dann am Ende so aussehen: SELECT * FROM rechner WHERE `city` = 'Hof'

Aber bevor du weiter machst: beschäftige dich mit dem Thema Kontextwechsel - das was du hier machst ist nämlich richtig gefährlich!

Abgesehen mal von der Sicherheit funktioniert es jetzt einwandfrei! Danke schonmal! Mit dem Kontextwechsel muss ich mich jetzt in ruhe mal beschäftigen! Hab das zwar mal angeschaut aber ganz ehrlich da steig ich noch nicht so wirklich durch! Bin jetzt auch überhaupt kein Profi! Wollte eigentlich nur mal was ausprobieren!