irgendwer: einfache suchabfrage

Hallo,

Ich habe jetzt schon länger versucht eine einfache Suchabfrage zu erstellen, alles was ich dazu im internet finden konnte hat mir leider nicht geholfen sondern eher noch mehr verwirtt...*bin nueling*

Ich will doch nur etwas ganz einfaches machen, habe eine datenbank mit einer tabelle und mehreren feldern die ich durchsuchen will (nicht alle)

Ich habe eine Seite erstellt die mir alle feldinhalte anzeigt, und ich habe eine seite wo ein suchformular drauf ist.
wenn ich jetzt im suchformular etwas eingebe kann ich dies doch auf der nächsten seite entgegennehmen und zu einer variable machen nach der gesucht wird oder? nur irgendwie bekomme ich das nicht auf die reihe...

das ist meine anzeige seite:

------------
<html>
<head>
 <title>B&uuml;cherliste anzeigen</title>

<?php
include("db.inc.php");

$result = mysql_query("SELECT * FROM buecher") OR die(mysql_error());

?>

</head>
<body>
<h1>Anzeige aller B&uuml;cher</h1>

<table width="80%" border="1">

<tr>
 <td>ID</td>
 <td>Titel</td>
 <td>Beschreibung</td>
 <td>Autor</td>
 <td>Erscheinungsdatum</td>
 <td>Aktion</td>

</tr>

<?php
while ($datensatz = mysql_fetch_array($result)){
echo "<tr>";
 echo "<td>",$datensatz['id'],"</td>";
 echo "<td>",$datensatz['title'],"</td>";
 echo "<td>",$datensatz['description'],"</td>";
 echo "<td>",$datensatz['author'],"</td>";
 echo "<td>",$datensatz['publication_date'],"</td>";
 echo "<td>";
  echo "<a href='aendern.php?id=".$datensatz['id']."'>&auml;ndern </a> &#8226; ";
  echo "<a href='loeschen.php?id=".$datensatz['id']."'>l&ouml;schen </a>";
 echo "</td>";
echo "</tr>\n";

}
?>

</table>

</body>
</html>
------------
in der db.inc.php sind natürlich die angaben zu nutzer und passwort ebenso wie mysql_connect und mysql_select_db
das funktiniert auch so wunderbar...

und ich dachte wenn ich nun die suchseite so ähnlich mache nur mit dem unterschied das ich die SELECT abfrage verändere müsste das doch gehen, deswegen hab ich das so umgebaut:

$suchbegriff = $_POST['suchbegriff'];

$result = mysql_query("SELECT * FROM buecher WHERE title='".$suchbegriff."'") or die("Fehler");

das geht aber irgendwie nicht so wie ich mir das gedacht habe, ich hatte es mit wörtern getestet die tatsächlich so dort drin stehen, ich bekam aber ein ergebnis das mit meiner anfage nichts zu tun hatte, er hat mir einfach irgendwelche ergebnisse angezeigt, es waren immer die gleichen, keine ahnung wonach das geht...

dann hab ich einige andere sachen ausprobiert die ich im web gefunden habe, die funktionierten aber auch alle nicht, sobald mysql_num_row drin vorkam und ich kann damit auch ehrlich gesagt gar nichts anfangen, vielleicht könnte mir mal jemand erklären wozu dieser befehl da ist? (damit wäre mir ja auch schon ein wenig geholfn ;)

Danke

  1. Hallo,

    da ist im Prinzi schon richtig, aber das

    WHERE title='".$suchbegriff."'"

    ist noch verbesserungswürig. Bei dem muss du jetzt nämlich genau das so suchen wie es in der DB ist auch mit eventuellen Leerzeichen, also rate ich dir bei der freien Eingabe eher zu LIKE, also

    WHERE title LIKE '".$suchbegriff."'"

    mit % kannst du wildcats hinten und vorne machen,

    PS, wenn du PHMYADMIN hast schau dir dann die Sete Suche an, und wie de den String genau aufbauen.

    Grüße
    http://www.rechtsrat-jetzt.de Anwalt gesucht?

    Hallo,

    Ich habe jetzt schon länger versucht eine einfache Suchabfrage zu erstellen, alles was ich dazu im internet finden konnte hat mir leider nicht geholfen sondern eher noch mehr verwirtt...*bin nueling*

    Ich will doch nur etwas ganz einfaches machen, habe eine datenbank mit einer tabelle und mehreren feldern die ich durchsuchen will (nicht alle)

    Ich habe eine Seite erstellt die mir alle feldinhalte anzeigt, und ich habe eine seite wo ein suchformular drauf ist.
    wenn ich jetzt im suchformular etwas eingebe kann ich dies doch auf der nächsten seite entgegennehmen und zu einer variable machen nach der gesucht wird oder? nur irgendwie bekomme ich das nicht auf die reihe...

    das ist meine anzeige seite:


    <html>
    <head>
    <title>B&uuml;cherliste anzeigen</title>

    <?php
    include("db.inc.php");

    $result = mysql_query("SELECT * FROM buecher") OR die(mysql_error());

    ?>

    </head>
    <body>
    <h1>Anzeige aller B&uuml;cher</h1>

    <table width="80%" border="1">

    <tr>
    <td>ID</td>
    <td>Titel</td>
    <td>Beschreibung</td>
    <td>Autor</td>
    <td>Erscheinungsdatum</td>
    <td>Aktion</td>

    </tr>

    <?php
    while ($datensatz = mysql_fetch_array($result)){
    echo "<tr>";
    echo "<td>",$datensatz['id'],"</td>";
    echo "<td>",$datensatz['title'],"</td>";
    echo "<td>",$datensatz['description'],"</td>";
    echo "<td>",$datensatz['author'],"</td>";
    echo "<td>",$datensatz['publication_date'],"</td>";
    echo "<td>";
      echo "<a href='aendern.php?id=".$datensatz['id']."'>&auml;ndern </a> &#8226; ";
      echo "<a href='loeschen.php?id=".$datensatz['id']."'>l&ouml;schen </a>";
    echo "</td>";
    echo "</tr>\n";

    }
    ?>

    </table>

    </body>
    </html>

    in der db.inc.php sind natürlich die angaben zu nutzer und passwort ebenso wie mysql_connect und mysql_select_db
    das funktiniert auch so wunderbar...

    und ich dachte wenn ich nun die suchseite so ähnlich mache nur mit dem unterschied das ich die SELECT abfrage verändere müsste das doch gehen, deswegen hab ich das so umgebaut:

    $suchbegriff = $_POST['suchbegriff'];

    $result = mysql_query("SELECT * FROM buecher WHERE title='".$suchbegriff."'") or die("Fehler");

    das geht aber irgendwie nicht so wie ich mir das gedacht habe, ich hatte es mit wörtern getestet die tatsächlich so dort drin stehen, ich bekam aber ein ergebnis das mit meiner anfage nichts zu tun hatte, er hat mir einfach irgendwelche ergebnisse angezeigt, es waren immer die gleichen, keine ahnung wonach das geht...

    dann hab ich einige andere sachen ausprobiert die ich im web gefunden habe, die funktionierten aber auch alle nicht, sobald mysql_num_row drin vorkam und ich kann damit auch ehrlich gesagt gar nichts anfangen, vielleicht könnte mir mal jemand erklären wozu dieser befehl da ist? (damit wäre mir ja auch schon ein wenig geholfn ;)

    Danke

    1. Hallo,

      da ist im Prinzi schon richtig, aber das

      WHERE title='".$suchbegriff."'"

      ist noch verbesserungswürig. Bei dem muss du jetzt nämlich genau das so suchen wie es in der DB ist auch mit eventuellen Leerzeichen, also rate ich dir bei der freien Eingabe eher zu LIKE, also

      WHERE title LIKE '".$suchbegriff."'"

      mit % kannst du wildcats hinten und vorne machen,

      PS, wenn du PHMYADMIN hast schau dir dann die Sete Suche an, und wie de den String genau aufbauen.

      »»

      Danke, das hab ich mir auch shcon so gedacht,, aber ich wollte halt erstmal das es funktioniert, nur weiß ich halt nicht wodran es hagt...
      wi meinst du das mit dem ansehen bei phpmyadmin? hab xampp, da ist auch phpmyadmin drauf...

      1. Hallo,

        mit ansehen meine ich dass du doch mittels PHPMyAdmin auch suchen kannst und die dann der String angezeigt wird wie gescht wurde, da steht dann auch was von PHP-Code erzeugen usw. den schaust du dir an

        also z.b.

        SELECT *  FROM plzs WHERE plz LIKE CONVERT(_utf8 '82044' USING latin1) COLLATE latin1_german1_ci

        und dass kopiert du dann einfach und tauscht das Suchwort aus

        Grüße
        http://www.rechtsrat-jetzt.de

        Hallo,

        da ist im Prinzi schon richtig, aber das

        WHERE title='".$suchbegriff."'"

        ist noch verbesserungswürig. Bei dem muss du jetzt nämlich genau das so suchen wie es in der DB ist auch mit eventuellen Leerzeichen, also rate ich dir bei der freien Eingabe eher zu LIKE, also

        WHERE title LIKE '".$suchbegriff."'"

        mit % kannst du wildcats hinten und vorne machen,

        PS, wenn du PHMYADMIN hast schau dir dann die Sete Suche an, und wie de den String genau aufbauen.
        »»

        Danke, das hab ich mir auch shcon so gedacht,, aber ich wollte halt erstmal das es funktioniert, nur weiß ich halt nicht wodran es hagt...
        wi meinst du das mit dem ansehen bei phpmyadmin? hab xampp, da ist auch phpmyadmin drauf...

        1. DAnke für deine antwort, hab da noch so zwei kliene fehlerchen gefunden die richtigen ergebnisse zeigt er jetzt zumindest an :-)

  2. echo $begrüßung;

    $suchbegriff = $_POST['suchbegriff'];

    Häufig gesehen aber völlig unnötig ist dieses Anlegen einer neuen Variable. Du kannst auch im weiteren Script-Verlauf direkt auf $_POST['suchbegriff'] zugreifen. Der Vorteil dabei ist, dass du bei $_POST/$_GET['foo'] direkt siehst, dass es sich um eine Benutzereingabe handelt, die ungeprüft ist und Werte enthalten kann, die gegebenenfalls erst noch entschärft werden müssen. Einer $variable sieht man nicht mehr an, ob der Inhalt vertrauenswürdig ist oder nicht.

    $result = mysql_query("SELECT * FROM buecher WHERE title='".$suchbegriff."'") or die("Fehler");

    Es ist immer eine gute Idee, das SQL-Statement zuerst in einer weiteren Variable zusammenzubauen, welche man dann der Funktion mysql_query() übergibt. So kann man sich das zusammengebaute Statement zu Prüfzwecken auch mal ausgeben lassen. Auch wird dann die mysql_query()-Zeile nicht so unübersichtlich, wenn du die unbedingt empfehlenswerten Maskierungsfunktionen noch einbaust.

    Ein harmloses Beispiel: Wenn du nach einem Titel suchst, der ein ' enthält, was passiert dann mit deinem SQL-Statement? SELECT * FROM buecher WHERE title='was'n das' - Das ergibt _nur_ einen Syntax-Fehler. In weniger harmlosen Fällen kann man durch gezieltes Manipulieren des SQL-Statements an Daten gelangen, die nicht für einen bestimmt sind, oder auch Änderungen an Datensätzen vornehmen, die nicht von dir vorgesehen sind.

    Benutzereingaben sollten stets mittels mysql_real_escape_string() entschärft werden, bevor sie in ein Statement eingebaut werden. Aus ' wird ' und ist somit kein Stringbegrenzungszeichen mehr.

    Mein Vorschlag, eine Abfrage zu gestalten sieht so aus:

    $sql = [link:http://de.php.net/manual/en/function.sprintf.php@title=sprintf]("SELECT * FROM buecher WHERE title='%s'",  
      mysql_real_escape_string($_POST['suchbegriff']));  
    //echo $sql; // zum Zwecke der eventuellen Kontrollausgabe  
    $result = mysql_query($sql) or die("Fehler");
    

    PHP in Versionen kleiner als 6 hat einen eingebauten Mechanismus namens Magic Quotes, der bereits eine solche Entschärfung vorzunehmen vorgibt. Dies macht er aber nicht sehr gut, weil er dabei nicht alle für MySQL notwendigen Zeichen behandelt. Wenn dieser Mechanismus eingeschaltet ist, und du dich entschlossen hast statt seiner ordentlich zu maskieren, solltest du ihn entweder ausschalten oder seine Auswirkungen rückgängig machen, was man am besten mit der an der verlinkten Stelle aufgeführten Funktion einmalig am Scriptanfang vornimmt.

    Ein Script beim Auftreten eines Fehler sterben zu lassen ist zwar sehr einfach zu implentieren, aber alles andere als benutzerfreundlich. Hier solltest du dir etwas besseres überlegen.

    das geht aber irgendwie nicht so wie ich mir das gedacht habe, ich hatte es mit wörtern getestet die tatsächlich so dort drin stehen, ich bekam aber ein ergebnis das mit meiner anfage nichts zu tun hatte, er hat mir einfach irgendwelche ergebnisse angezeigt, es waren immer die gleichen, keine ahnung wonach das geht...

    Kannst du genauer beobachten/beschreiben, welche Daten angezeigt werden? Wird einfach alles ausgegeben? Passiert das auch, wenn du das Statement mittels phpMyAdmin ausführen lässt?

    mysql_num_row [...] vielleicht könnte mir mal jemand erklären wozu dieser befehl da ist?

    Dafür hat man Handbücher erfunden: mysql_num_rows().

    echo "$verabschiedung $name";