Suche mit mehreren Suchfeldern

Iskue

Mitglied
moin moin ihr lieben,

hab da mal wieder eine frage :-D

und zwar möchte ich ein Suchformular ertsellen der meine komplette DB durchforstet.
Dieses Formular soll aus mehreren input tags bestehen...z.B: Vorname, Nachname, Adresse, usw......

Wie schonmal erwähnt bin ich nicht ganz PHP-Fit....
Ich hab da auch schonmal was zusammen gebastelt...jedoch nur mit einem Suchfeld....

nun die Frage wie erweiter ich das ganze Sinnvoll?

PHP:
<?php
?>
<!-- Beginn HTML-Kopf -->
<html>
<head>
<title>Ducument</title>
<link rel="stylesheet" type="text/css" media="screen" href="../css/style.css">
</head>
<body>
<!-- Ende HTML-Kopf -->

<!-- Beginn der Suchform -->
<form name="suche" action="<?php $_SERVER['SCRIPT_NAME']; ?>" method="POST">
<input class="input" type="text" size=20 name="s">
<input class="button" type="submit" name="submit" value="Suche">
</form>
<br />
<!-- Ende der Suchform -->

<!-- Beginn der Ergebnisverarbeitung -->

<?php
error_reporting(0);

mysql_connect('localhost',' ','') or die ('Es konnte keine Verbindung zum MySQL-Server aufgebaut werden');
mysql_select_db(' ') or die ('Es konnte keine Verbindung zur Datenbank aufgebaut werden');

$limit = 10;
$s = mysql_real_escape_string(strip_tags($_POST['s']));

if($s == '') $s = $_GET['s'];
if($s == '') {
echo '<font style="color:#BF0000;">Sie haben keinen Suchbegriff eingegeben</font>';
}
else {
$p = $_GET['p'];
if($p == '') $p = 1;
  
$query = mysql_query("SELECT * FROM `tabelle` WHERE `spalte` LIKE '%$s%' ORDER BY `id` DESC") or die (mysql_error());
$results = mysql_num_rows($query);

if($results == 0){
echo '<font style="color:#BF0000;">Keine Treffer gefunden</font>';
}
else{

echo '<font style="color:#007F00;"><b>' . $results . '</b> Treffer gefunden</font>';

echo '<br /><br /></div><div align=left><hr noshade size=1 width=100% color=#F0F0F0 />';

$pages = ceil($results/$limit);

$result = mysql_query("SELECT * FROM `tabelle` WHERE `spalte` LIKE '%$s%' ORDER BY `id` LIMIT " . ($p-1)*$limit . ",$limit") or die (mysql_error());

while($row = mysql_fetch_object($result)) {

echo $row->spalte . '<br />';
}
echo '</div><div align=center>';

$navigation = '';
if($p > 1) {
$navigation .= '<a href="'.$_SERVER['SCRIPT_NAME'].'?p=' . ($p-1) . '&s=' .urlencode($s) . '">&laquo; Zur&uuml;ck</a>&nbsp;';
}
for($i = 1 ; $i <= $pages ; $i++) {
if($i == $p) {
$navigation .= '<b>'.$i.'</b>';
}else{
$navigation .= '&nbsp;<a href="'.$_SERVER['SCRIPT_NAME'].'?p=' . $i . '&s=' .urlencode($s) . '">'.$i.'</a>&nbsp;';
}
}
if($p < $pages) {
$navigation .= '<a href="'.$_SERVER['SCRIPT_NAME'].'?p=' . ($p+1) . '&s=' .urlencode($s) . '">&nbsp;Weiter &raquo;</a>';
}
echo '<br /><br />' . $navigation;
}
}
echo '</div>';

?>

</body>
</html>


hoffe ihr versteht meine Frage ;)

MFG
 
Zuletzt bearbeitet:
Hallo iskue!

Ich kann dir zwar keine Hilfestellung bei der Erstellung geben, möchte dir dennoch einen Tipp geben:
Hast du dich schon einmal mit mysqli und PDO beschäftigt?

mysql Abfragen sind soquasi OUT-OF-DATE!

LG
 
habe mich bedingt mit mysqli und PDO beschäftigt......muss auch gestehen dass das für mich in moment schon leicht schwer zu verstehen ist :-D bin schon froh das ich eine "einfache" suche funktionstüchtig hinbekommen habe......aber sobald ich mit PHP fiter bin werde ich mir unbedingt die PDO und mysqli sachen angucken ;-)
 
ja weil ganz beknackt....mein chef will erst was sehen bevor er mich zur schulung schickt....und so forste ich durchs I-net und probiere mich aus......und da dieses Modell bis jetzt das einzigste war was funktioniert hat, und bis jetzt das einzige was ich halbwegs überblicken kann halte ich mich da erstmal dran fest :(
 
Du kannst entweder mehrere Suchfelder erstellen, die Du über ihre ID abfragst. Oder Du musst den eingegebenen String in einem Suchfeld zerlegen, dazu muss Dir das Trennzeichen bekannt sein, vermutlich ein Leerzeichen. (zB. http://php.net/manual/de/function.explode.php) Die Einzelstrings daraus lässt Du dann gegen die Spalten in der DB laufen.
Nebenbei: Versuche im SQL-Statement die Wildcard "*" zu verhindern, sondern frag gezielt die Spalten ab, die Du haben möchtest ("SELECT spalte FROM Tabelle WHERE...). Das ist performanter und sicherer.
Weitere Hinweise: Die Eingaben im Suchstring unbedingt vor der Übergabe an die Datenbank prüfen (Stichwort SQL-Injection) und nach Möglichkeit sprechende Variablennamen verwenden. Wenn Du später mal auf den Code schaust, wird Dir $search mehr sagen als $s.
Und Zustimmung zu sheel: Setz Dich dringen mit mysqli auseinander.
 
Soo ich hab mal mein script überarbeitet und hoffe das es jetzt mehr nach den aktuellen Standards endspricht ;) nur zeigt er mir die Tabelle mit den Inhalt schon komplett an bevor überhaupt eine Suche gestartet wurde, sobald man dies tut spuckt er das richtige Ergebnis aus, nur dass die Tabelle vorher sichtbar ist stört mich.....da ist bestimmt voll der simple fehler drinne den ich in moment einfach nicht sehe ;)

PHP:
<html>
<head>
<title></title>
</head>
<body>
<form action="<?php $_SERVER['SCRIPT_NAME']; ?>" method="post">
         <h3>Suche:</h3>
         <input type="text" name="search" placeholder=" autor "/>
         <input type="text" name="search" placeholder=" preis "/>
         <input type="submit" value="Submit" />
</form>

<?php
  $host = "localhost";
  $user = "root";
  $password = "";
  $database_name = "";
  $pdo = new PDO("mysql:host=$host;dbname=$database_name", $user, $password, array(
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  ));
$search=$_POST['search'];
$query = $pdo->prepare("select * from book where preis LIKE '%$search%' OR autor LIKE '%$search%'  LIMIT 0 , 10");
$query->bindValue(1, "%$search%", PDO::PARAM_STR);
$query->execute();
  
  if (!$query->rowCount() == 0) {
           echo "Suchergebnisse:<br/>";
           echo "<table style=\"font-family:arial;color:#333333;\">";  
           echo "<tr><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Titel Books</td><td style=\"border-      style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Autor</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Preis</td></tr>";        
           while ($results = $query->fetch()) {
                     echo "<tr><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";      
                     echo $results['titel']; 
                     echo "</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";
                     echo $results['autor'];
                     echo "</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";
                     echo "$".$results['preis'];
                     echo "</td></tr>";        
  }
         echo "</table>";    
  }

else {
        echo 'Nichts gefunden';
  }
?>

</body>
</html>
 
Hi

PHP:
if(isset($_POST['search']))
nur dann die ganze Abfrage und Tabellenausgabe überhaupt machen.

Außerdem schaut deine Abfrage SQL-Injection-lastig aus.
Kopiert aus der Doku:
PHP:
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
: statt $ vor dem Parameternamen usw. (letzteres fügt die PHP-Variable direkt ein)
 
Sheel hat Dir den passenden Hinweis schon gegeben.
Und wenn Du schon beim (Neu-)lernen bist nochmal von mir:
PHP:
select * from book where preis LIKE
Schmeiss das * raus und frag die einzelnen Spalten ab.
PHP:
select titel,autor,preis from book where preis LIKE
So werden nur die benötigten Spalten abgefragt, was die Performance steigert. Ist auch besserer Stil :)
 

Neue Beiträge

Zurück