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-Key: 3511412677

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

Printed on: April 27, 2024 at 00:04 o'clock

Member: michi1983
michi1983 Aug 01, 2022 updated at 08:13:22 (UTC)
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ß
Member: ottinho
ottinho Aug 01, 2022 at 08:12:34 (UTC)
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
Member: Pappo1982
Pappo1982 Aug 01, 2022 updated at 08:30:27 (UTC)
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!
Member: michi1983
michi1983 Aug 01, 2022 at 09:16:20 (UTC)
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?
Member: Pappo1982
Pappo1982 Aug 01, 2022 updated at 09:27:07 (UTC)
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
Member: tk1234
tk1234 Aug 01, 2022 at 09:43:38 (UTC)
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!
Member: LordGurke
LordGurke Aug 01, 2022 updated at 12:15:53 (UTC)
Goto Top
Oder, um das Problem der SQL-Injection mal zu verdeutlichen:
Suche doch mal nach diesem Begriff:
1"; TRUNCATE TABLE `rechner`; --  
Member: Pappo1982
Pappo1982 Aug 01, 2022 at 13:43:09 (UTC)
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!