Hilfe bei Suchfunktion

Slick

Grünschnabel
Hallo,

ich könnte wirklich Hilfe bei meiner Suchfunktion in PHP gebrauchen. Ziel ist eine einfache Suche nach Musikvideos und Ausgabe über ein Suchformular aus einer in in MySQL erstellten Datenbank sein. Dazu habe ich zunächst in der Klasse VideosGateway die Funktion "find" definiert (erster code, ab Zeile 4). In einer SQL Abfrage soll auf den Namen des Videos (abgelegt in der Datenbank unter k_name) zugegriffen werden, während die Ausgabe durch LIMIT auf wenige Ergebnisse pro Seite beschränkt wird.


Code:
<?php
 class VideosGateway{

public function find($name, $from, $rows){

$sql = "SELECT * FROM kuenstler INNER JOIN kategorien INNER JOIN videos ON k_id = fk_k_id AND a_id= fk_a_id LIMIT :from,:interval WHERE k_name LIKE  %:name%"; 
$params = array(array(':name', $name,  PDO::PARAM_STR), array(':from', $from,  PDO::PARAM_STR), array(':interval', $rows,  PDO::PARAM_STR));
$db = DB::getInstance();
$result = $db->executePreparedStatement($sql, $params);
$videos = null;
if(count($result) > 0){
$videos = self::load($result[0]);
}
return $videos;
}
 


public function find_begin($name, $from, $rows){

$sql = "SELECT * FROM kuenstler INNER JOIN kategorien INNER JOIN videos ON k_id = fk_k_id AND a_id= fk_a_id LIMIT :from,:interval WHERE k_name LIKE  %:name" ;
$params = array(array(':name', $name,  PDO::PARAM_STR), array(':from', $from,  PDO::PARAM_STR), array(':interval', $rows,  PDO::PARAM_STR));
$db = DB::getInstance();
$result = $db->executePreparedStatement($sql, $params);
$videos = null;
if(count($result) > 0){
$videos = self::load($result[0]);
}
return $videos;
}




public static function load($row){
 if(!is_null($row) && is_Array($row)){
 $id = $row['v_id'];
 $kuenstler = $row['k_name'];
 $titel = $row['titel'];
 $genre = $row['a_name'];
 $groesse = $row['dateigroesse'];
 $result = new Videos($id, $kuenstler, $titel, $genre, $groesse);
 return $result;
 }else{
 return null;
 }
 }

 public function size(){
 return DB::getInstance()->sizeOf("kuenstler");
 }
 
  
 public function findRange($from = 0, $numberRows = 15){
 $sql = "SELECT * FROM kuenstler INNER JOIN kategorien INNER JOIN videos ON k_id = fk_k_id AND a_id= fk_a_id LIMIT :from,:interval";
 if(is_numeric($from) && is_numeric($numberRows)){
 $from = (integer)$from;
 $numberRows = (integer)$numberRows;
 }else{
 return array();
 }
 
 $params = array(array(':from', $from, PDO::PARAM_INT),
 array(':interval', $numberRows, PDO::PARAM_INT));
 $db = DB::getInstance();
 $videos = $db->executePreparedStatement($sql, $params);
 $liste = array();
 foreach($videos as $row) {
 $liste[] = self::load($row);
 }
 return $liste;
 
 }
 }
 ?>

Die Suchfunktion wird dann im Hauptprogramm aufgerufen (ab Zeile 73) mit dem Wert des Suchformulars $suche als Eingabe. Die anderen Variablen ( $from, $rows) sind für die LIMIT Anweisung in der SQL Abfrage.

Code:
 <?php
 require_once("environment.php");

 $videosTable = new VideosGateway();
 $max = $videosTable->size();
 $rows = 15;
 
 if(isset($_REQUEST['direction'])){
$direction = $_REQUEST['direction'];
if($direction == "forward"){
$from = $_REQUEST['oldvalue'] + $rows;
}else{
$from = $_REQUEST['oldvalue'] - $rows;
if($from < 0) $from = 0;
}
}else{
if(isset($_REQUEST['from'])){
$from = $_REQUEST['from'];
}else{
$from = 0;
}
}
$videosListe = $videosTable->findRange($from, $rows);


 
 
 HTML::printPageHeader("Musikvideos");
 HTML::printCaption("Suche nach Musikvideos", 1);
 HTML::printCaption("Mit folgenden Begriffen im Dateinamen", 10);

function printFormsearch(){
print "<form action=" . $_SERVER['PHP_SELF'] . " method='post'>";
print"<p><input type=checkbox name='auswahl' value=''>";
print"Suche am Anfang des Titels</p>";
print"<p><input type=text name='suche' value=''></p>";
print"<p><input type=submit name='eingabe' value='Suchen'></p>";
print "</form>";
print "<br />";
}



 HTML::printTableBegin(5,4,1);
 HTML::printTableHeader(array("ID", "Künstler", "Titel", "Genre", "Dateigroesse"));
 printFormsearch();
 
 foreach($videosListe as $videos){
print "<tr>";
print $videos->toHTMLTableColumns();
print "<td>";
}
 


 HTML::printTableEnd();
 HTML::printPageFoot();
 
 if($from > 0){
HTML::printLink($_SERVER['PHP_SELF'] . "?direction=backward&oldvalue=$from",
"Zurück");
HTML::printBlanks(2);
}
if($from + $rows < $max){
HTML::printLink($_SERVER['PHP_SELF'] . "?direction=forward&oldvalue=$from",
"Vorwärts");
} 

if(isset($_REQUEST['eingabe']) && !empty($_REQUEST['suche'])){
$suche = $_REQUEST['suche'];
}

if(!isset($_REQUEST['auswahl']) && !empty($_REQUEST['suche'])){
$videosListe = $videosTable-> find($suche, $from, $rows);
echo "<left><h1>Sie suchen nach $suche.</h1></left>";
}


print "Seite: ";
$numbers = $max / $rows;
for ($i = 0; $i < $numbers; $i++){
$newFrom = $i * $rows;
HTML::printLink($_SERVER['PHP_SELF'] . "?from=$newFrom",
($i + 1));
HTML::printBlanks(1);
}

print"<p><input type=submit name='newsearch' value='Neue Suche'></p>";

 ?>

Wenn ich nun eine Suche starten will (d.h. einen Wert in das Suchfeld wie z.B. "ACDC" eingebe ) erhalte ich folgende Fehlermeldung (in rot).

SQLSTATE[42000]: Syntax error or access violation: 1064 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 ''0','15' WHERE k_name LIKE %'ACDC'%' at line 1
Errortrace:
Datei: C:\xampp\htdocs\php04\esa04\class_DB.php Zeile: 51 Funktion: execute Klasse: PDOStatement
Datei: C:\xampp\htdocs\php04\esa04\class_VideosGateway3.php Zeile: 40 Funktion: executePreparedStatement Klasse: DB
Datei: C:\xampp\htdocs\php04\esa04\Musikvideos2.php Zeile: 112 Funktion: find Klasse: VideosGateway3


Ich nehme an dass mit meiner SQL Abfrage etwas nicht stimmt, kann mir aber nicht erklären was. Etwas Hilfe wäre sehr nett.


Mfg.

Slick
 
Wenn ich mich nicht ganz täusche, müsste der Ausdruck %'ACDC'% in Anführungsstriche. Abgesehen davon, dürfen – so glaube ich – die Zahlenangaben bei LIMIT nicht in Anführungsstrichen stehen.
 

Neue Beiträge

Zurück