PHP Datenbank Suchfunktion mit Ergebnisausgabe

Warum überschreibst du eine Variable, die das Ergebnis einer Datenbank-Selektierung enthält (also boolean) mit dem Rückgabewert einer Query (Ressourcen-Kennung im Erfolgsfall)? Die Variable hat dann nicht nur einen anderen Datentyp sondern auch eine andere Bedeutung. Es ist schlimm, dass PHP so etwas zulässt und IMHO schlechter Programmierstil.
 
Was noch so auffällt:
NIE NIE NIE NIE ungeprüft POST- oder GET-Variablen irgendwo verwenden, erst recht nicht in einem SQL Query. Sony hat sowas gemacht, hast ja im April/Mai diesen Jahres gesehen, was dabei raus kam... Ein Hoch auf SQL Injections.
Übergebene Variablen sollten immer geprüft werden, ob sie a) Schadcode enthalten oder b) überhaupt nicht gesetzt sind.

Eine Suche mit LIKE %bla% funktioniert zwar, ist aber extrem langsam. Das kannst du bringen, wenn du vielleicht 50-100 Einträge hast, wenn du bei 10.000 bist werden deine Querys zu lange laufen und evtl. sogar die Max Execution Time überschreiten. Das Problem ist, dass alle LIKE-Abfragen, die mit der Wildcard beginnen, nicht über den Index ausgeführt werden können.
Such dir lieber eine Lösung, bei der du einen FULLTEXT-Index verwendest mit MATCH ... AGAINST. Geht zwar (noch) nicht mit InnoDB, aber das kann man wohl verschmerzen.
 
So die Suche wurde nochmal überarbeitet, nun findet man wenn man nach dem exacten Namen sucht auch etwas, aber wenn man zb nur marc anstatt marco eingibt kommt nichts.

und was mich noch stört, iwie gibt er mir über region und genre noch gar nichts aus, da ist wohl noch ein fehler drin :(

und wie kriege ich es eigentlich hin, das die auswahlfelder, region + genre leer bleiben bis man selber was auswählt?

PHP:
<?php
        require_once('auth.php');
        include('navigation.php');
                        //Datenbankverbindungsdetails
        include('config.php');
?>
<head>
<title>Suche</title>
<link href="design.css" rel="stylesheet" type="text/css" />
</head>
<body>
<?php echo $navigation; ?>
<br>
<br>
<div style="width:800px;margin:0 auto;position:relative;">
<?php if(isset($_POST['Submit'])){ echo '<img src="images/pdf.png" style="position:absolute;top:0;right:0;" />'; } ?>
<h1> Suche deinen DJ  </h1>

<?php if(isset($_POST['Submit'])){

        //Array zum speichern von Fehlern
        $errmsg_arr = array();

        //validierung der errorflags
        $errflag = false;

        //Verbindung zum My SQL Server
        $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
        if(!$link) {
                die('Fehler bei Verbindunsaufbau: ' . mysql_error());
        }

        //auswahl der Datenbank
        $db = mysql_select_db(DB_DATABASE);
        if(!$db) {
                die("auswahl der datenbank nicht möglich");
        }

$search_name = $_POST['vname'];
$search_dj = $_POST['dj_name'];
$search_region = $_POST['region'];
$search_genre = $_POST['dj_genre'];

if($_POST['vname'] != ""){

$sql = mysql_query("SELECT * FROM members WHERE vname='$search_name'");
$result = mysql_query("SELECT * FROM members WHERE vname='$search_name'")
        or die ("MySQL-Error: " . mysql_error());

        echo "Ergebnisse für Ihre Suche nach <b>Vorname</b> ".$search_name.":<br /><br />";
        while($row = mysql_fetch_array($sql)){
                echo "<b>".$row[2].", ".$row[1]."</b><br />
                DJ Name: ".$row[8]."<br /><br />";
        }
        echo "<br /><hr /><br />";
}

if($_POST['dj_name'] != ""){

$sql = mysql_query("SELECT * FROM members WHERE dj_name='$search_dj'");
$result = mysql_query("SELECT * FROM members WHERE dj_name='$search_dj'")
        or die ("MySQL-Error: " . mysql_error());

        echo "Ergebnisse für Ihre Suche nach <b>DJ Name</b> ".$search_dj.":<br /><br />";
        while($row = mysql_fetch_array($sql)){
                echo "<b>".$row[2].", ".$row[1]."</b><br />
                DJ Name: ".$row[8]."<br /><hr /><br />";
        }
        echo "<br /><hr /><br />";
}

if($_POST['region'] != ""){

$sql = mysql_query("SELECT * FROM members WHERE region='$search_region'");
$result = mysql_query("SELECT * FROM members WHERE region='$search_region'")
        or die ("MySQL-Error: " . mysql_error());

        echo "Ergebnisse für Ihre Suche nach <b>Region</b> ".$search_region.":<br /><br />";
        while($row = mysql_fetch_array($sql)){
                echo "<b>".$row[2].", ".$row[1]."</b><br />
                DJ Name: ".$row[8]."<br /><hr /><br />";
        }
        echo "<br /><hr /><br />";
}

if($_POST['dj_genre'] != ""){

$sql = mysql_query("SELECT * FROM members WHERE dj_genre='$search_genre'");
$result = mysql_query("SELECT * FROM members WHERE dj_genre='$search_genre'")
        or die ("MySQL-Error: " . mysql_error());

        echo "Ergebnisse für Ihre Suche nach <b>Genre</b> ".$search_genre.":<br /><br />";
        while($row = mysql_fetch_array($sql)){
                echo "<b>".$row[2].", ".$row[1]."</b><br />
                DJ Name: ".$row[8]."<br /><hr /><br />";
        }
        echo "<br /><hr /><br />";
}

} else {
        echo '

<form id="Search" name="Search" method="post" action="">
  <table width="300" border="0" align="center" cellpadding="2" cellspacing="0">
    <tr>
      <th>Name </th>
      <td><input name="vname" type="text" class="textfield" id="vname" /></td>
    </tr>
    <tr>
      <th>DJ Name </th>
      <td><input name="dj_name" type="text" class="textfield" id="dj_name" /></td>
    </tr>
    <tr>
      <th>Region</th>
      <td><form action="search-exec.php" id="region" methode="post">
      <p>
      <select name="region" size="1">
       <option value="1" name="region">Baden-Württemberg</option>
       <option value="2" name="region">Bayern</option>
       <option value="3" name="region">Berlin</option>
       <option value="4" name="region">Brandenburg</option>
       <option value="5" name="region">Bremen</option>
       <option value="6" name="region">Hamburg</option>
       <option value="7" name="region">Hessen</option>
       <option value="8" name="region">Mecklenburg-Vorpommern</option>
       <option value="9" name="region">Niedersachsen</option>
       <option value="10" name="region">Nordrhein-Westfalen</option>
       <option value="11" name="region">Rheinland-Pfalz</option>
       <option value="12" name="region">Saarland</option>
       <option value="13" name="region">Sachsen</option>
       <option value="14" name="region">Sachsen-Anhalt</option>
       <option value="15" name="region">Schleswig-Holstein</option>
       <option value="16" name="region">Thüringen</option>
       <option value="17" name="region">Sonstige</option>
       </select>
       </p>
       </td>
      <tr>
      <th>Musik Genre</th>
      <td><form action="search-exec.php" id="dj_genre" methode="post">
      <p>
      <select name="dj_genre" size="1">
       <option value="1" name="region">Elektronik</option>
       <option value="2" name="region">Pop & Charts</option>
       <option value="3" name="region">Rock</option>
       <option value="4" name="region">Schlager</option>
       <option value="5" name="region">Sonstige</option>
       </select>
       </p>
       </td>
      <tr>
      <tr>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><input type="submit" name="Submit" value="Suche" /></td>
    </tr>
  </table>
</form>';

} ?>

</div>

</body>
</html>


so meine frage

eigentlich kann ich doch dann hier

# $sql = mysql_query("SELECT * FROM members WHERE vname='$search_name'");
# $result = mysql_query("SELECT * FROM members WHERE vname='$search_name'")

noch ein LIKE einfügen? dann müsste das doch klappen mit der "ungenauen" suche? oder irre ich mich ^^
 
Zuletzt bearbeitet:
JhnWyn schrieb:
und wie kriege ich es eigentlich hin, das die auswahlfelder, region + genre leer bleiben bis man selber was auswählt?
Einfach ein leeres Region/Genre-Feld einfügen. Zu LIKE und SQL-Injection steht ja schon hier was.

Übrigens kannst auch deine 4 Parameter in ein,zwei Arrays packen, dann brauchst du statt 4 großen SQL-Blöcken nur noch einen, Stichwort Code-Duplizierung.
 

Ähnliche Themen

Zurück
Oben