JavaScript [PHP] Suchfunktion optimieren

JhnWyn

Lt. Junior Grade
Registriert
Aug. 2008
Beiträge
318
Hey liebe CB Community!

Also ich hab eine Suchfunktion gebastelt welche wie folgt aussieht:

PHP:
<script type="text/javascript">
                function searchFor(suchbegriff){
                        var xmlHttp = null;
                        // Mozilla, Opera, Safari sowie Internet Explorer 7
                        if (typeof XMLHttpRequest != "undefined") {
                                xmlHttp = new XMLHttpRequest();
                        }
                        if (!xmlHttp) {
                                // Internet Explorer 6 und älter
                                try {
                                        xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
                                } catch(e) {
                                        try {
                                                xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
                                        } catch(e) {
                                                xmlHttp  = null;
                                        }
                                }
                        }
                        // Wenn das Objekt erfolgreich erzeugt wurde
                        if (xmlHttp) {
                                var url = "suche.php";
                                var params = "suchbegriff="+suchbegriff;

                                xmlHttp.open("POST", url, true);

                                //Headerinformationen für den POST Request
                                xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                                xmlHttp.setRequestHeader("Content-length", params.length);
                                xmlHttp.setRequestHeader("Connection", "close");

                                xmlHttp.onreadystatechange = function () {
                                        if (xmlHttp.readyState == 4) {
                        // Zurückgeliefertes Ergebnis wird in den DIV "ergebnis" geschrieben
                                                document.getElementById("ergebnis").innerHTML = xmlHttp.responseText;
                                        }
                                };
                                xmlHttp.send(params);
                        }
                }
        </script>


<body>
        <input type="text" onkeyup="searchFor(this.value);"/>
        <div id="ergebnis"></div>
</body>

Die "suche.php" sieht wie folgt aus:

PHP:
<?php
        // Verbindung
        $server = "localhost";
        $benutzername = "****";
        $passwort = "****";

        $datenbank = "test";

        // Server Verbindung herstellen
        mysql_connect($server,$benutzername,$passwort) or
        die ("Keine Verbindung moeglich");

        // Datenbank Verbidung
        mysql_select_db($datenbank) or
        die ("Die Datenbank existiert nicht");

        $tabelle = "members";

        if ($_POST["suchbegriff"]){
                // Mysql Abfrage wird gespeichert mit den Notwendigen Parameter
                $sql = "SELECT * FROM ".$tabelle." WHERE vname LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%')";

                // Mysql Abfrage wird durchgeführt
                $result = mysql_query($sql);

                // Suchbegriff wird ausgegeben
                echo "Sie Suchten nach: ".$_POST["suchbegriff"]."<br/><br/>";

                // Ergebnis wird ausgegeben mit Zeilenumbruch
                while($row = mysql_fetch_object($result)){

                        echo utf8_encode($row->vname);
                        echo "<br/>";
                }
        }
?>

Mein Problem bzw meine Frage ist eigentlich simpel jedoch für mich schwer zu lösen :D

Und zwar wird, wenn man etwas in das Suchfeld eingibt zb Rene, nur die ergebnisse aus der Spalte "vname" angezeigt. In dieser Spalte werden die Vornamen angegeben, soweit so gut.
Jedoch möchte ich eben das nicht nur die Spalte "vname" durchsucht wird sondern auch noch "nname" (Nachnahme) und auch "dj_name" (DJ Spitznamen).

Wenn ich nun den sql befehl in " WHERE vname OR nname OR dj_name " ergänze, wird jedoch immer nur in der letzten angegebenen Spalte durchsucht, in diesem Fall "dj_name".

Das ist mein erstes Problem und meine zweite Frage ist:

Als Ergebnis wird nur als row die Spalte "vname" ausgegeben, wie kann ich das Ergebnis ergänzen das die komplette Zeile bzw mehrere Spalten angegeben werden? Also wenn man zb nach DJ Dingsbums sucht, dass das Ergebnis ca so aussieht:

Rene, Mayer, DJ Dingsbums, Nordrhein-Westfalen

Ich hoffe ich konnte mich einigermaßen verständlich ausdrücken :)

MfG
 
Zuletzt bearbeitet:
Die Antwort ist trivial:
Code:
$sql = "SELECT * FROM ".$tabelle." WHERE vname LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%')";
erweitern zu:
Code:
$sql = "SELECT * FROM ".$tabelle." WHERE vname LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%' OR nname LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%' OR dj_name LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%')";

und unten dann:
Code:
 echo utf8_encode($row->vname);
erweitern zu:
Code:
 echo utf8_encode($row->vname);
 echo utf8_encode($row->nname);
 echo utf8_encode($row->dj_name);

Daraus schließe ich, dass du keine Ahnung davon hast, was du da eigentlich tust :-/
Schreib dich nicht ab: Lern SQL!
 
Du musst die "WHERE-Klausel" richtig erweitern:
Code:
... WHERE vname LIKE '...' OR nname LIKE '...' OR dj_name LIKE '...'
Einfach mal googlen und im MySQL Referenzhandbuch lesen:
http://dev.mysql.com/doc/refman/5.1/de/select.html


Wenn du mehr als nur den vnamen ausgeben willst, einfach entsprechend anpassen? Verstehe das Problem nicht ganz...
Code:
while($row = mysql_fetch_object($result)){
echo utf8_encode($row->vname);
echo "<br/>";
echo utf8_encode($row->SPALTENNAME1);
echo "<br/>";
echo utf8_encode($row->SPALTENNAME2);
echo "<br/>";
echo utf8_encode($row->SPALTENNAME3);
echo "<br/>";
echo utf8_encode($row->SPALTENNAME...);
echo "<br/>";
}
 
benneque schrieb:
Die Antwort ist trivial:
Code:
$sql = "SELECT * FROM ".$tabelle." WHERE vname LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%')";
erweitern zu:
Code:
$sql = "SELECT * FROM ".$tabelle." WHERE vname LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%' OR nname LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%' OR dj_name LIKE ('%".mysql_real_escape_string(utf8_decode($_POST["suchbegriff"]))."%')";

und unten dann:
Code:
 echo utf8_encode($row->vname);
erweitern zu:
Code:
 echo utf8_encode($row->vname);
 echo utf8_encode($row->nname);
 echo utf8_encode($row->dj_name);

Daraus schließe ich, dass du keine Ahnung davon hast, was du da eigentlich tust :-/
Schreib dich nicht ab: Lern SQL!

Hey danke für die superschnellen Antworten!
Ja das kann gut sein das ich kein Profi darin bin :)

Hab es nun mal angepasst jedoch bekomme ich nun einen Fehler bei der Ausgabe bei

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in

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

Ergo hab ich nach dieser Warnung gegoogelt und rausgefunden das man sich den Fehler anzeigen lassen kann durch -> OR die("Error: $abfrage <br>".mysql_error());

wenn ich dies nun unter die $result = mysql_query($sql); zeile setze, bekomme ich keine Fehler anzeige sondern einen Parse error: syntax error, unexpected T_LOGICAL_OR in ( OR die("Error: $abfrage <br>".mysql_error()); )

also stimmt nun was nicht mit der SQL Abfrage?

MfG
 
Ganz genau fehler im SQL!
 
Ich verstehe nur nicht wo hier -> while($row = mysql_fetch_object($result)){
der Fehler sein soll. Denn wenn ich eben nur nach einer Spalte (vname) durchsuche funktioniert es ja.

MfG
 
Wie gesagt der Fehler ist in deinem SQL-Statement.

Code:
$sql = "..." <--hier dein fehler
 
// Mysql Abfrage wird durchgeführt
$result = mysql_query($sql);
 
// Suchbegriff wird ausgegeben
echo "Sie Suchten nach: ".$_POST["suchbegriff"]."<br/><br/>";
 
// Ergebnis wird ausgegeben mit Zeilenumbruch
while($row = mysql_fetch_object($result)){ <-- Hier tritt der Fehler erst auf beim ausführen
 
echo utf8_encode($row->vname);
echo "<br/>";
}
 
Jap danke diesmal kriege ich auch eine Fehlermeldung:

Error: SELECT * FROM members WHERE vname LIKE ('%mario%' OR nname LIKE ('%mario%' OR dj_name LIKE ('%mario%')
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1

So es funktioniert nun alles, hab nur noch ein problem, wie kriege ich bei der Ergebniss ausgabe ein ", " dazwischen? denn jetzt wird alles so ausgegeben

mariobarthDj BartiSachsen-Anhalt

bräuchte aber noch ein Komma und leerzeichen dazwischen :)

die ausgabe sieht so aus:

echo utf8_encode($row->vname);
echo utf8_encode($row->nname);
echo utf8_encode($row->dj_name);
echo utf8_encode($row->region);
echo "<br/>";

wäre auch schon super dankbar wenn ihr vielleicht einen Link zu der Formartierung habt, ich finde da nichts

mfg
 
Du solltest die dringend ein bis zwei Bücher besorgen.

Code:
echo utf8_encode($row->vname) + ', ';
echo utf8_encode($row->nname) + ', ';
echo utf8_encode($row->dj_name) + ', ';
echo utf8_encode($row->region) + ', ';
echo "<br/>";

oder

Code:
echo utf8_encode($row->vname) + ', ' + utf8_encode($row->nname) + ', ' + utf8_encode($row->dj_name) + ', ' + utf8_encode($row->region) + "<br/>";
 
Ja ich weiß ^^

aber das klappt leider nicht, jetzt gibt er nur noch 0000 aus ?

mfg
 
Strings werden in PHP mit '.' (Punkt) zusammengebaut und nicht mit '+' :)
 
Super vielen dank euch allen! Alles klappt nun wie es sein sollte :)

MfG
 
Wenn man nicht auf die Features einer InnoDB - Datenbank (wie z.B. Referentielle Integrität durch Fremdschlüssel) angewiesen ist, dann kann man solche Abfrage-Konstrukte übrigens mit einem Fulltext-Key deutlich schneller lösen.
 
Das halte ich zum aktuellen Zeitpunkt für Zeitverschwendung, sich mit dieser Möglichkeit mehr als theoretisch zu befassen. Du wirst in naher Zukunft keine "natürliche" Umgebung finden, bei der MySQL 5.6 läuft (wenn denn 5.6 erst einmal raus ist). Debian Squeeze (immerhin eine der verbreitesten Server-Distributionen) nutzt z.B. sogar nur MySQL 5.1.63. Debian Wheezy wird, selbst wenn es 5.6 enthält, noch ne ganze Weile auf sich warten lassen.
So gesehen: Schön das man könnte, aber außer bei einem stark modifizierten Rootserver wirst du kein MySQL 5.6 antreffen. Bei einigen der üblichen Hostern kann man doch sogar schon froh sein, wenn PHP5 zur Verfügung steht und man die Dateien nicht .php5 nennen muss, damit der richtige Parser genutzt wird.
 
Zurück
Oben