PHP Musiktitel suchen

Crysko

Cadet 3rd Year
Registriert
Feb. 2011
Beiträge
33
Hallo,

ich wollte gerne auf meiner Webseite eine Suche nach bestimmten Musiktiteln programmieren, wo man Kriterien wie Stimmung, Tempo und Instrumente auswählen kann. Je nach Eingaben wird dann ein passender Datensatz aus der MySQL-Datenbank ausgewählt, der mit einem oder mehreren dieser Kriterien übereinstimmt.

Mein erster Versuch scheiterte leider:

PHP:
mysql_query ("SELECT * FROM shop_artikel WHERE stimmung LIKE '%$Stimmung%'
 OR tempo = '$Tempo' OR instrument LIKE '%$Instrument%'");

Bei "Stimmung" und "Instrument" gibt es mehrere Möglichkeiten, da ein Titel mehrere Instrumente verwendet und sowohl friedlich, als auch ruhig und sanft klingen kann. Diese Stichwort-Sammlung habe ich in der Datenbank mit TEXT-Feldern erzeugt. Bei Tempo braucht man kein LIKE, da es nur eine Möglichkeit gibt (langsam, mittel oder schnell).

Egal was ich für ein Kriterium auswähle, er zeigt mir mit dem oberen Code keinen Datensatz an. Wie könnte man das realisieren?

Achja, folgende Seite verwendet solch eine Suchfunktion:
http://www.soundtaxi.net/de/Filmmusik:::19
Da ist oben die Suchfunktion zu finden.

Wäre sehr dankbar für eure Hilfe! :)
 
Es liefert einfach keinen Datensatz aus. Es zeigt mit diesem Code nichts an. Also keine Ergebnisse.
 
PHP:
mysql_query ("SELECT * FROM shop_artikel WHERE stimmung LIKE '".$Stimmung."' 
 OR tempo = '".$Tempo."' OR instrument LIKE '".$Instrument."'");
Versuch das mal so....

Poste noch den Rest vom Code....
 
Zuletzt bearbeitet:
Danke, funktioniert aber leider auch nicht :(
Zeigt ebenfalls keine Daten an.

Danach kommt noch folgender Code:
PHP:
if (mysql_num_rows($qsuche) > 0) {
  while ($row = mysql_fetch_object($qsuche)) {
    $ID = $row->id;
    $desc = $row->beschreibung;
    $name = $row->name;
    $spielzeit = $row->spielzeit;
    $probe = $row->probe;

Die erste Zeile wertet einfach aus, ob ein Datensatz gefunden wurde. Wenn 0 ausgegeben wird, gebe ich eine eigene Fehlermeldung aus. Der Rest sind halt die Variablen und die zugehörigen Tabellenspalten.
 
Ich würde erstmal richtig debuggen.
Für das entwickeln ist es immer gut die Erroranzeigen so einzustellen, dass du immer alle Fehler sieht.
Das machst du indem du am Anfang des Skriptes vor allem anderen die Zeile

error_reporting(E_ALL);

einfügst.

Dann würd ich möglichst den Query in einer Variable speichern. Die kann man dann einfach ausgeben um zu sehen, welche Werte für die Variablen eingesetzt wurde.
 
Speicher den Query erstmal zwischen und lass diesen ausgeben, sodass du auch siehst, was an die Datenbank geschickt wird. Der nächste Schritt wäre dann zu schauen, was in phpMyAdmin o.ä. als Ausgabe erscheint.
 
PHP:
$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE stimmung LIKE '".$Stimmung."' 
 OR tempo = '".$Tempo."' OR instrument LIKE '".$Instrument."'");  


if (mysql_num_rows($qsuche) > 0) {
  while ($row = mysql_fetch_array($qsuche)) {
    $ID = $row['id'];
    $desc = $row['beschreibung'];
    $name = $row['name'];
    $spielzeit = $row['spielzeit'];
    $probe = $row['probe']; 
   echo ..... 
    }
}
So, damit muss es gehen, wenn nicht dann Debuggen wie meine Vorredner es schon gesagt haben.
 
1) angreifbar durch sql injection
2) fehlerhafter query wird _nicht_ mit if (mysql_num_rows($qsuche) > 0) geprüft, sondern mit $qsuche !== false
3) normalerweise gehört bei mysql_query ein argument für die datenbankverbindung mit dazu
 
Danke für all eure Tipps und Vorschläge!

Es funktioniert jetzt, nachdem ich mir mal was gebastelt habe. Hier nun der fertige Code:

PHP:
<?php
//Variablen der Musiksuche
$Stimmung = $_REQUEST['Stimmung'];
$Tempo = $_REQUEST['Tempo'];
$Instrument = $_REQUEST['Instrument'];
?>

...HTML-Code für die Drop-Down-Menüs...

<?php
   if ($action=="check") {       //Prüfvariable für das Formular mit den Drop-Down-Menüs
	
	connect(); //Verbindungsfunktion zur MySQL-Datenbank

        /*Hier folgt der selbst gebastelte Teil.
        Es fragt einfach ab, welche Drop-Down-Menüs leer bzw. nicht leer sind
        und gibt dann entsprechend unterschiedliche MySQL-Queries aus.
        */
	
	
    if ($Stimmung=="" && $Tempo != "" && $Instrument != "")
	{
		$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE tempo = '".$Tempo."' AND instrument LIKE '%$Instrument%'");
	}
	elseif ($Stimmung=="" && $Tempo=="")
	{
		$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE instrument LIKE '%$Instrument%'");
	}
	elseif ($Stimmung=="" && $Instrument=="")
	{
		$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE tempo = '".$Tempo."'");
	}
	elseif ($Tempo=="" && $Stimmung != "" && $Instrument != "")
	{
		$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE stimmung LIKE '%$Stimmung%' AND instrument LIKE '%$Instrument%'");
	}
	elseif ($Tempo=="" && $Instrument=="")
	{
		$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE stimmung LIKE '%$Stimmung%'");
	}
	elseif ($Instrument=="" && $Stimmung != "" && $Tempo != "")
	{
		$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE stimmung LIKE '%$Stimmung%' AND tempo = '".$Tempo."'");
	}
	elseif ($Stimmung != "" && $Tempo != "" && $Instrument != "")
	{
		$qsuche = mysql_query ("SELECT * FROM shop_artikel WHERE stimmung LIKE '%$Stimmung%' AND tempo = '".$Tempo."' AND instrument LIKE '%$Instrument%'");
	}

        //Hier wie gehabt meine Auslesung aus der Datenbank
	
	if (mysql_num_rows($qsuche) > 0) {
		while ($row = mysql_fetch_object($qsuche)) {
			$ID = $row->id;
			$desc = $row->beschreibung;
			$name = $row->name;
			$spielzeit = $row->spielzeit;
			$probe = $row->probe;

        //...hier folgen dann die HTML-Einträge der Ausgabe...

        }
    }
}

Es lag wohl an diesen OR-Verknüpfungen in der letzten Codeversion. Hier habe ich aber mit AND gearbeitet, was auch logischer ist, denn wenn man z.B. nur Stimmung auswählt und die Felder Tempo und Instrument leer bleiben, sucht er nur nach Musiktiteln mit der ausgewählten Stimmung.
Wenn aber Stimmung und Tempo ausgewählt wurde und Instrument leer bleibt, sucht er nach Musiktiteln mit der angegebenen Stimmung UND dem angegebenen Tempo. Daher das AND.

Mag sein, dass das nicht die einfachste und komfortabelste Lösung ist, aber es funktioniert, so wie ich es wollte :cool_alt:

Danke an alle für eure Hilfe! :)
 
Eagle-PsyX- schrieb:
@IceMatrix
Wieso SQL-Injektion?
Du weißt doch nicht, ob $Stimmung, $Tempo oder $Instrument bereits escaped wurden...?

Crysko schrieb:
PHP:
<?php
//Variablen der Musiksuche
$Stimmung = $_REQUEST['Stimmung'];
$Tempo = $_REQUEST['Tempo'];
$Instrument = $_REQUEST['Instrument'];
?>

Beantwortet das deine Frage? Ich hab nen Riecher für solche Fehler, weil _alle_ Anfänger sie machen. Wenn jemand ne SQL-Abfrage mit String-Concat zusammenbastelt ist zu 95% SQL Injection im Spiel.
 
Beantwortet das deine Frage? Ich hab nen Riecher für solche Fehler, weil _alle_ Anfänger sie machen. Wenn jemand ne SQL-Abfrage mit String-Concat zusammenbastelt ist zu 95% SQL Injection im Spiel.

Wie kann man denn die SQL-Sicherheitslücke verhindern? In Wikipedia habe ich dazu den Befehl mysql_real_escape_string gefunden, d.h. die zu übergebenden Variablen mit diesem Befehl ansprechen, damit diese maskiert werden.

Auch wäre eine Typenumwandlung laut Wikipedia möglich mit intval und dann die Variable.
 
Zurück
Oben