Seite 1 von 1

Suma mit Blätterfunktion

Verfasst: 11.02.2010, 10:54
von ben78
Hi Abakus-Leutz,

ich versuche meiner SUMA eine Blätterfunktion hinzu zu fügen. Das ist mir, bis auf ein Problem in der Query, einigermaßen gut gelungen.

Ausgangsvarianten der beiden Querys im Skript:
Ausgangsvariante der 1. Query (query):

Code: Alles auswählen

$query = mysql_query("SELECT id FROM beauty"); // DB Abfrage
echo "$query";
Ausgangsvariante der 2. Query (abfrage):

Code: Alles auswählen

$abfrage = mysql_query("SELECT DISTINCT * FROM beauty LIMIT $start,$datensaetze_pro_seite "); 
echo "$abfrage";
Wenn beide Querys - siehe oben - so im Skript stehen bleiben, wird mir meine Tabelle wunderbar mit all ihrem Inhalt angezeigt. Die Blätterfunktion scheint ihre Aufgabe gut zu erfüllen und ich kann einwandfrei durch meine Tabelle hin und her blättern.

Bevor ich die Blätterfunktion in meinem Skript hatte, sah meine Query wie folgt aus:
QUERY OHNE BLÄTTERFUNKTION

Code: Alles auswählen

// Vars
$suchwort = (isset($_POST['suche']) AND $_POST['suche'] != 'Produktfinder') ? trim($_POST['suche']) : '';
$marke = isset($_POST['hersteller']) ? trim($_POST['hersteller']) : '';

// Querey
$sql = "SELECT * FROM beauty WHERE";

if ($suchwort) $sql .= " MATCH (Bezeichnung, Beschreibung, Marke)  AGAINST('" . mysql_real_escape_string($suchwort) . "')";

if ($marke) 
{
if ($suchwort) $sql .= "AND";
$sql .= " Marke LIKE '%" . mysql_real_escape_string($marke) . "%'";
}

// if sucheingabe
$db_erg = mysql_query( $sql );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}
Mit dieser Query - noch ohne Blätterfunktion versteht sich - konnte ich einwandfrei...und mich zufrieden stellend...meine Tabelle durchstöbern.

Seit dem ich jetzt aber meine Blätterfunktion drinnen habe, geht das nicht mehr, wie man das anhand der Ausgangs-Querys (siehe oben Ausgangsvariante 1+2) sehen kann. In anderen Worten: "Die Suchfunktion greift nicht mehr".

Um dieses Problem zu lösen, habe ich - als Anfänger versteht sich - drei mir logisch-mögliche Varianten der 1.Query ausprobiert und jedes Mal ein $echo "$var"; zum betrachten der Query hinzugefügt. Bei den Ausgangs-Querys (siehe oben Ausgangsvariante 1+2)
erhalte ich übrigens jeweils als $echo "$var"; folgende 2 Query-Ausgaben:
Resource id #3
Resource id #4


1. Variante (Versuch):
Hier habe ich versucht, die erste Query ohne Blätterfunktion dem Skript der Blätterfunktion anzupassen, da mir diese am logischsten und einfachsten erschien.
Jedoch liefert diese Variante folgendes Ergebnis, wenn ich jetzt eine Sucheingabe ins Textfeld tippe und oder gleichzeitig eine Marke aus dem Sprungmenü für meine Suche auswähle (Reihenfolge der Sucheingabe egal):
Es erscheint meine Tabelle mit den ersten 15 Einträgen (Datensätze), die jedoch NICHT den Suchkriterien entsprechen. Es handelt sich hierbei um die ersten 15 Datensätze meiner DB. D. h. also, dass die Sucheingaben nicht berücksichtigt wird, obwohl mir echo "$query"; meiner Meinung nach korrekt angezeigt wird. Zudem verschwinden alle Sitelinks der Blätterfunktion. Und die Zahlen bei Seite 1 von 0 sind auch nicht mehr korrekt.

Oberhalb der Tabelle erscheinen mir 3 Zeilen wie folgt:

1. Zeile:
SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('schuhe')AND Marke LIKE '%adidas%'
=> Query: hier scheint doch alles in Ordnung zu sein, oder täusche ich mich da???

2. Zeile:
Warning: mysql_num_rows() expects parameter 1 to be resource, string given in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search-fulltext5.php on line 99
=> LINE 99 sieht bei mir im Skript so aus:

Code: Alles auswählen

$total = mysql_num_rows($query);  // liefert die Anzahl der Datensaetze der Abfrage
...und diese Zeilen befindet sich ebenfalls in meinem Skript...

Code: Alles auswählen

echo "Ihre Sucheingabe <strong>" . mysql_real_escape_string&#40;$suchwort&#41; . " " . mysql_real_escape_string&#40;$marke&#41; . "</strong>";
$anzahl = mysql_num_rows&#40;$abfrage&#41;;
echo " ergab" . mysql_real_escape_string&#40;$anzahl&#41; . " Ergebnisse.";
...wo ich glaube, dass das WARNING hierdurch verursacht wird. Liege ich da richtig???...wenn ja, WIE kann ich das lösen???

3. Zeile:
Resource id #4
=> Query: wird durch echo "$abfrage"; ausgegeben.

Wenn ich keine Sucheingaben mache, erhalte ich eine Fehlermeldung für die Syntax at LINE 1

1.Query-Variante (Versuch):

Code: Alles auswählen

//----------------------VARS----------------------------VARS-------------------------------------VARS------------------------------
$suchwort = &#40;isset&#40;$_POST&#91;'suche'&#93;&#41; AND $_POST&#91;'suche'&#93; != 'Produktfinder'&#41; ? trim&#40;$_POST&#91;'suche'&#93;&#41; &#58; '';
$marke = isset&#40;$_POST&#91;'hersteller'&#93;&#41; ? trim&#40;$_POST&#91;'hersteller'&#93;&#41; &#58; '';
//------------------------------BLÄTTERFUNKTION---START-----------------------------BLÄTTERFUNKTION----START-------------------------BLÄTTERFUNKTION---START---------------------BLÄTTERFUNKTION---START--------------
// ------------------------------1.ABFRAGE---------------------------------1.ABFRAGE-----------------1.ABFRAGE------
$query = "SELECT * FROM beauty WHERE";

if &#40;$suchwort&#41; $query .= " MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";

if &#40;$marke&#41; 
&#123;
if &#40;$suchwort&#41; $query .= "AND";
$query .= " Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

echo "$query";


// if sucheingabe
$db_erg = mysql_query&#40; $query &#41;;
if &#40; ! $db_erg &#41;
&#123;
die&#40;'Ungültige Abfrage&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;

2. Variante (Versuch):
Als zweite Variante habe ich eine weitere Zerteilung des Query probiert und erhalte bei jeder Form der Sucheingabe folgende Fehlermeldung:

Marke LIKE '%adidas%'Ungültige Abfrage: 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 'Marke LIKE '%adidas%'' at line 1

Wenn ich keine Sucheingaben mache und einfach nur so auf OK klicke, erhalte ich selbiges Ergebnis, wie in Versuchs-Variante 1 geschildert.

2.Query-Variante (Versuch):

Code: Alles auswählen

$query = "SELECT * FROM beauty WHERE id <> 0";

if &#40;$suchwort&#41; &#123; 
$query .= " MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;"; 
&#125; 

if &#40;$marke&#41; &#123; 
$query = " Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;



echo "$query";



// if sucheingabe
$db_erg = mysql_query&#40; $query &#41;;
if &#40; ! $db_erg &#41;
&#123;
die&#40;'Ungültige Abfrage&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;
3. Variante (Versuch):
Hier erhalte ich genau das gleiche Ergebnis wie bei meinem 1. Query-Versuch. Nur das mein echo "$query"; halt so aussieht:
SELECT * FROM beauty.

3.Query-Variante (Versuch):

Code: Alles auswählen

$query = "SELECT * FROM beauty";

$where = "WHERE 1=1";

if &#40;!empty&#40;$marke&#41;&#41; &#123;
   $where .= " AND Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

if &#40;!empty&#40;$suchwort&#41; && $suchwort != 'Produktfinder'&#41; &#123;
   $where .= " AND MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";
&#125;  



echo "$query";



// if sucheingabe
$db_erg = mysql_query&#40; $query &#41;;
if &#40; ! $db_erg &#41;
&#123;
die&#40;'Ungültige Abfrage&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;
Welche dieser Varianten ist vom Ansatz her die richtige, um eine Suma mit Blätterfunktion zu realisieren?

Wenn keines Dieser Varianten zutrifft, wäre ich für neue weitere Lösungsvorschläge sehr Dankbar.

@ALL...BIG THX 4 HLP...

Verfasst:
von

Verfasst: 11.02.2010, 11:20
von Synonym
Also irgendwie verstehe ich da nur Bahnhof. Ist für mich zu viel auf einmal...
SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('schuhe')AND Marke LIKE '%adidas%'
Die mag so funktionieren, aber genau gesehen fehlt zwischen "('schuhe')AND" nach der Klammer ein Leerzeichen
$total = mysql_num_rows($query); // liefert die Anzahl der Datensaetze der Abfrage
mysql_num_rows() expects parameter 1 to be resource, string given
Welchen Wert hat denn $query. Das müsste eigentlich eine Resourcen-Kennung sein, so wie oben die beiden Beispiele #3 und #4, aber bei Dir scheint es da ein String zu sein. Steht zumindest so in der Meldung. Allerdings kennt hier keiner die Zeilen vor 99
..wo ich glaube, dass das WARNING hierdurch verursacht wird. Liege ich da richtig???...wenn ja, WIE kann ich das lösen???
Glaube ich nicht, da in den drei Zeilen Code $query gar nicht vorkommt.
Wenn ich keine Sucheingaben mache, erhalte ich eine Fehlermeldung für die Syntax at LINE 1
"//----------------------VARS----------------------------VARS-------------------------------------"
Könnte als Kommentar gewertet werden, bin mir da aber nicht sicher

Was soll das sein?
VARS------------------------------
Das ist weder PHP-Code noch ein Kommentar

Andererseits
Wenn ich keine Sucheingaben mache
Wenn keine Suchwort und keine Marke, dann ist $query einfach nur "SELECT * FROM beauty WHERE" und somit würde die fehlschlagen. Where ohne Bedingung.

Und zum Thema oben mit dem mysql_num_rows. Bei der Funktion darfst Du nicht diese $query übergeben. Ist keine Kennung sondern ein String. Die Kennung wäre in dem Fall weiter unten das "$db_erg". Aber wie gesagt, ohne den ganzen Code und vor allem Zeilenzahlen (Reihenfolge) ist das mehr oder weniger einfache Rateversuche.


So, aber nun höre ich mal auf, ich steigt da nicht mehr durch mit Abfrage 1/2, $query, Version 1/2 oben/unten....

Kannst Du nicht mal den ganzen Code posten und vor allem mit Zeilennummern?

Nachtrag:
$query .= " Marke LIKE '%" . mysql_real_escape_string($marke) . "%'";
Hieß das zuvor nicht mal $sql? Nun ist es $query. Da hast da ein schönes Durcheinander :wink:

Nachtrag 2:
Rein theoretisch brauchst Du nur an die vorhandene Query (oder wie Du die auch immer nennen magst) am Ende ein Limit von,bis setzen. Mehr ist die Blätterfunktion in Bezug auf MySQL eigentlich nicht. Die Berechnungen wo von beginnt und bis aufhört wird mit PHP gemacht.

Nachtrag3:
Dein Problem, wenn es weder ein Suchwort noch eine Marke gibt und daher alles abgefragt werden soll

Vier Möglichkeiten der Such-Query:

1. Keine Bedingungen
2. Ein Suchwort
3. Eine Marke
4. Suchwort und Marke

Würde etwas in der Art ergeben (ungetestet):

Code: Alles auswählen

$query = "SELECT * FROM beauty"; // erst mal alles

//prüfen ob Suchwort und/oder Marke
if&#40;$suchwort OR $marke&#41;
&#123;
	// Hier wird auf jeden Fall schon mal das WHERE benötigt
	$query .= " WHERE";
	
	// Suchwort?
	if &#40;$suchwort&#41; $query .= " MATCH &#40;Bezeichnung, Beschreibung, Marke&#41; AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";
	
	// Marke?
	// Wenn $suchwort, dann mit AND verbinden
	// Wenn !$suchwort, dann direkt anhängen
	if &#40;$marke&#41;
	&#123;
		if &#40;$suchwort&#41; $query .= " AND";
		$query .= " Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
	&#125;
&#125;

echo "$query";

Verfasst: 11.02.2010, 12:44
von ben78
@Synonym: ja, hast recht...dets zu viel da oben.

Im Grunde genommen, geht es bei meinem Anliegen um eine ganz einfache Sache. Seit dem ich mein Such-Skript um eine Blätterfunktion erweitert habe, funktioniert die Suche nicht mehr. Das liegt mit Sicherheit an der Query.
Das separate Skript für die Blätterfunktion sieht so aus:

Code: Alles auswählen

<?php  

// Datenbankverbindung  
//---------------------------------------------------  
$host = "localhost";     // Adresse des Datenbankservers, meist localhost  
$user = "";             // Ihr MySQL Benutzername  
$pass = "";             // Ihr MySQL Passwort  
$dbase = "";             // Name der Datenbank  

$connection = mysql_connect&#40;"$host" , "$user" , "$pass"&#41;   
              OR die &#40;"Keine Verbindung zu der Datenbank moeglich."&#41;;  
$db = mysql_select_db&#40;$dbase , $connection&#41;   
              OR die &#40;"Auswahl der Datenbank nicht moeglich."&#41;;   
//---------------------------------------------------   

$pfad = $_SERVER&#91;'PHP_SELF'&#93;;    // aktuellen Dateipfad ermitteln, wichtig fuer die Links der Seitennavigation 

$query = mysql_query&#40;"SELECT id FROM user"&#41;; // DB Abfragee 

// ------------------------------------------------------------------------ 

$datensaetze_pro_seite = "10";      // Anzahl der Datensaetze die Pro Seite angezeigt werden sollen 
$p = "3";                                // Anzahl der Links die in der Seitenavigation ausgegeben werden 

$total = mysql_num_rows&#40;$query&#41;;                      // liefert die Anzahl der Datensaetze der Abfrage 
$seiten = ceil&#40;$total / $datensaetze_pro_seite&#41;;     // Berechnet die Seitenanzahl insgesamt 

// ------------------------------------------------------------------------ 

if&#40;empty&#40;$_GET&#91;'go'&#93;&#41;&#41;&#123; // korrigieren der aktuellen Seite 

    $go = 1;             // Sofern $go nicht uebergeben wurde 

&#125;elseif&#40;$_GET&#91;'go'&#93; <= 0 || $_GET&#91;'go'&#93; > $seiten&#41;&#123; 

    $go = 1;         // Variable definieren 

&#125;else&#123; // Wenn Obiges nicht zutraf 

    $go = mysql_real_escape_string&#40;$_GET&#91;'go'&#93;&#41;;     // Variable definieren 
&#125; 

$links = array&#40;&#41;; // Linkkette bilden 

// Seite die vor der aktuellen Seite kommt definieren 
if&#40;&#40;$go - $p&#41; < 1&#41;&#123; $davor = $go - 1;  &#125;else &#123; $davor = $p; &#125;             

// Seite die nach der aktuellen Seite kommt definieren 
if&#40;&#40;$go + $p&#41; > $seiten&#41;&#123; $danach = $seiten - $go; &#125;else&#123; $danach = $p; &#125;    
        
$off = &#40;$go - $davor&#41;; // Variable definieren    
                 
if &#40;$go- $davor > 1&#41;&#123; // Link definieren => Zur Erste Seite springen          
    $first = 1; 
       $links&#91;&#93; = "<a href=\"$pfad?go=$first\" title=\"Zur ersten Seite springen\">&laquo; Erste ...</a>\n";       
&#125;       

if&#40;$go != 1&#41;&#123; // Link definieren => eine Seite zurueck blaettern           
    $prev = $go-1; 
    $links&#91;&#93; = "<a href=\"$pfad?go=$prev\" title=\"Eine Seite zurueck blaettern\"> &laquo;</a>\n";      
&#125;    
        
        
for&#40;$i = $off; $i <= &#40;$go + $danach&#41;; $i++&#41;&#123; // einzelne Seitenlinks erzeugen 

  if &#40;$i != $go&#41;&#123;  // Link definieren             
   
        $links&#91;&#93; = "<a href=\"$pfad?go=$i\">$i</a>\n"; 
         
  &#125;elseif&#40;$i == $seiten&#41; &#123; // aktuelle Seite, ein Link ist nicht erforderlich              
         
        $links&#91;&#93; = "<span class=\"current\">&#91; $i &#93;</span>\n";   
         
  &#125;elseif&#40;$i == $go&#41;&#123; // aktuelle Seite, ein Link ist nicht erforderlich              
   
        $links&#91;&#93; = "<span class=\"current\">&#91; $i &#93;</span>\n"; 
         
  &#125; // close if $i       
&#125;                 

if&#40;$go != $seiten&#41;&#123; // Link definieren => eine Seite weiter blaettern        
    $next = $go+1; 
    $links&#91;&#93; = "<a href=\"$pfad?go=$next\" title=\"Eine Seite weiter blaettern\"> &raquo; </a>\n"; 
&#125;       
     
if&#40;$seiten - $go - $p > 0 &#41;&#123; // Link definieren => Zur letzen Seite springen    
    $last = $seiten;  
    $links&#91;&#93; = "<a href=\"$pfad?go=$last\" title=\"Zur letzten Seite springen\">... Letzte &raquo;</a>\n"; 
&#125;       

$start = &#40;$go-1&#41; * $datensaetze_pro_seite;             // Berechne den Startwert fuer die DB 


$link_string = implode&#40;" ", $links&#41;; // Zusammenfuegen der einzelnen Links zu einem String 

$abfrage = mysql_query&#40;"SELECT ID, Name, Email, DATE_FORMAT&#40;Datum, '%d.%m.%Y'&#41; AS datum FROM user LIMIT $start,$datensaetze_pro_seite "&#41;; 

// Daten ausgeben 
while&#40;$row = mysql_fetch_object&#40;$abfrage&#41;&#41;&#123; 
     
    echo "<p>".$row->ID." - "$row->Name."<br />\n"; 
    echo "Email&#58; ".$row->Email."<br /> \n"; 
    echo "Datum&#58; ".$row->datum."\n </p>"; 

&#125; // close while 

// -------------------------------------- Seitennavigation ausgeben ---------------------------- 
 echo "<div id=\"navigation\">\n"; 

 echo "<span class=\"pages\">Seite $go von $seiten</span>\n"; 

 echo $link_string; // Ausgabe der Seitennavigation 
     
 echo "</div> \n"; 
// -------------------------------------- Seitennavigation ende -------------------------------- 
?>
...und so sah mein Such-Skript aus, wo mit der Suche alles gepasst hat und BEVOR ich mit der Erweiterung der Blätterfunktion begonnen habe. Stoppwortliste etc. folgt noch.

Code: Alles auswählen

<?php

// Error-Reporting
error_reporting&#40;E_ALL&#41;;

//Verbindung zur Datenbank
define &#40; 'MYSQL_HOST', '' &#41;;
define &#40; 'MYSQL_BENUTZER', '' &#41;;
define &#40; 'MYSQL_KENNWORT', '' &#41;;
define &#40; 'MYSQL_DATENBANK', '' &#41;;

$db_link = mysql_connect &#40;MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT&#41;;
$db_sel = mysql_select_db&#40; MYSQL_DATENBANK &#41;
or die&#40;"Auswahl der Datenbank fehlgeschlagen"&#41;;

// Vars
$suchwort = &#40;isset&#40;$_POST&#91;'suche'&#93;&#41; AND $_POST&#91;'suche'&#93; != 'Produktfinder'&#41; ? trim&#40;$_POST&#91;'suche'&#93;&#41; &#58; '';
$marke = isset&#40;$_POST&#91;'hersteller'&#93;&#41; ? trim&#40;$_POST&#91;'hersteller'&#93;&#41; &#58; '';

// Querey
$sql = "SELECT * FROM beauty WHERE";

if &#40;$suchwort&#41; $sql .= " MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";

if &#40;$marke&#41; 
&#123;
if &#40;$suchwort&#41; $sql .= "AND";
$sql .= " Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

// if sucheingabe
$db_erg = mysql_query&#40; $sql &#41;;
if &#40; ! $db_erg &#41;
&#123;
die&#40;'Ungültige Abfrage&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;



// functions & echos
echo "Bei Ihrer Sucheingabe <strong>" . mysql_real_escape_string&#40;$suchwort&#41; . " " . mysql_real_escape_string&#40;$marke&#41; . "</strong>";
$anzahl = mysql_num_rows&#40;$db_erg&#41;;
echo " konnten" . mysql_real_escape_string&#40;$anzahl&#41; . " Ergebnisse</b> gefunden werden.";

// Table
echo '<table border="1" style="border-collapse&#58;collapse">';
while &#40;$zeile = mysql_fetch_array&#40; $db_erg, MYSQL_ASSOC&#41;&#41;
&#123;
echo "<tr class='tabelle'>";
echo "<td class='bild'><img src='". htmlspecialchars&#40;$zeile&#91;'Abbildung'&#93;&#41; . "' /></td>";
echo "<td class='marke'>". $zeile&#91;'Marke'&#93; . "</td>";
echo "<td class='body'>". $zeile&#91;'Beschreibung'&#93; . "</td>";
echo "<td class='title'>". $zeile&#91;'Bezeichnung'&#93; . "</td>";
echo "<td class='preis'>". $zeile&#91;'Preis'&#93; . " &euro;</td>";
echo "<td class='bestellen'><a href='". htmlspecialchars&#40;$zeile&#91;'Anbieter'&#93;&#41; . " title='zur Bestellung'>Schicken lassen</a></td>";
echo "</tr>";
&#125;
echo "</table>";


mysql_free_result&#40; $db_erg &#41;;
if &#40; $db_link &#41;
&#123;
echo 'Verbindung erfolgreich&#58; ';
echo $db_link;
&#125;
else
&#123;

// hier sollte dann später dem Programmierer eine
// E-Mail mit dem Problem zukommen gelassen werden
die&#40;'keine Verbindung möglich&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;
mysql_close&#40;$db_link &#41;;
?>
Ich habe versucht beide Skripts zusammen zu fügen, also quasi eine Suma mit Blätterfunktion daraus zu machen und seit dem funktioniert die Suche nicht mehr. Das liegt bestimmt an der query!...glaube ich.

Also habe ich sie verändert bzw. dem Skript für die Blätterfunktion angepasst. Im Grunde genommen habe ich versucht, das Suchskript mit dem Skript für die Blätterfunktion zu vereinen.

Und das ganze sieht jetzt so aus:

Code: Alles auswählen

<?php
//-------------------Error-Reporting--------------------------------------------  
error_reporting&#40;E_ALL&#41;;
//-------------------Datenbankverbindung------------------------------------------
$host = "";     // Adresse des Datenbankservers, meist localhost  
$user = "";             // Ihr MySQL Benutzername  
$pass = "";             // Ihr MySQL Passwort  
$dbase = "test";             // Name der Datenbank  
//--------------------------------------------------------------------------------
$connection = mysql_connect&#40;"$host" , "$user" , "$pass"&#41;   
OR die &#40;"Keine Verbindung zu der Datenbank moeglich."&#41;;  
$db = mysql_select_db&#40;$dbase , $connection&#41;   
OR die &#40;"Auswahl der Datenbank nicht moeglich."&#41;;   
//----------------------VARS----------------------------VARS-------------------------------------VARS------------------------------
$suchwort = &#40;isset&#40;$_POST&#91;'suche'&#93;&#41; AND $_POST&#91;'suche'&#93; != 'Produktfinder'&#41; ? trim&#40;$_POST&#91;'suche'&#93;&#41; &#58; '';
$marke = isset&#40;$_POST&#91;'hersteller'&#93;&#41; ? trim&#40;$_POST&#91;'hersteller'&#93;&#41; &#58; '';
//------------------------------BLÄTTERFUNKTION---START-----------------------------BLÄTTERFUNKTION----START-------------------------BLÄTTERFUNKTION---START---------------------BLÄTTERFUNKTION---START--------------
// ------------------------------1.ABFRAGE---------------------------------1.ABFRAGE-----------------1.ABFRAGE------
$query = "SELECT * FROM test";

$where = "WHERE 1=1";

if &#40;!empty&#40;$marke&#41;&#41; &#123;
   $where .= " AND Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

if &#40;!empty&#40;$suchwort&#41; && $suchwort != 'Produktfinder'&#41; &#123;
   $where .= " AND MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";
&#125;  



echo "$query";



// if sucheingabe
$db_erg = mysql_query&#40; $query &#41;;
if &#40; ! $db_erg &#41;
&#123;
die&#40;'Ungültige Abfrage&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;


//----------------VARS--------------------------------------VARS-----------------------------------------VARS------ 
$pfad = $_SERVER&#91;'PHP_SELF'&#93;;    // aktuellen Dateipfad ermitteln, wichtig fuer die Links der Seitennavigation 
$datensaetze_pro_seite = "15";      // Anzahl der Datensaetze die Pro Seite angezeigt werden sollen 
$p = "5";                                // Anzahl der Links die in der Seitenavigation ausgegeben werden 
$total = mysql_num_rows&#40;$query&#41;;                      // liefert die Anzahl der Datensaetze der Abfrage 
$seiten = ceil&#40;$total / $datensaetze_pro_seite&#41;;     // Berechnet die Seitenanzahl insgesamt 
// ------------------------------FUNCTION-------------------FUNCTION---------------------------------FUNCTION-------
if&#40;empty&#40;$_GET&#91;'go'&#93;&#41;&#41;&#123; // korrigieren der aktuellen Seite 
$go = 1;             // Sofern $go nicht uebergeben wurde 
&#125;elseif&#40;$_GET&#91;'go'&#93; <= 0 || $_GET&#91;'go'&#93; > $seiten&#41;&#123; 
$go = 1;         // Variable definieren 
&#125;else&#123; // Wenn Obiges nicht zutraf 

$go = mysql_real_escape_string&#40;$_GET&#91;'go'&#93;&#41;;     // Variable definieren 
&#125; 
$links = array&#40;&#41;; // Linkkette bilden 

// Seite die vor der aktuellen Seite kommt definieren 
if&#40;&#40;$go - $p&#41; < 1&#41;&#123; $davor = $go - 1;  &#125;else &#123; $davor = $p; &#125;             

// Seite die nach der aktuellen Seite kommt definieren 
if&#40;&#40;$go + $p&#41; > $seiten&#41;&#123; $danach = $seiten - $go; &#125;else&#123; $danach = $p; &#125;    

$off = &#40;$go - $davor&#41;; // Variable definieren    

if &#40;$go- $davor > 1&#41;&#123; // Link definieren => Zur Erste Seite springen          
$first = 1; 
$links&#91;&#93; = "<a href=\"$pfad?go=$first\" title=\"Zur ersten Seite springen\">&laquo; Erste ...</a>\n";       
&#125;

if&#40;$go != 1&#41;&#123; // Link definieren => eine Seite zurueck blaettern           
$prev = $go-1; 
$links&#91;&#93; = "<a href=\"$pfad?go=$prev\" title=\"Eine Seite zurueck blaettern\"> &laquo;</a>\n";      
&#125;

for&#40;$i = $off; $i <= &#40;$go + $danach&#41;; $i++&#41;&#123; // einzelne Seitenlinks erzeugen 

if &#40;$i != $go&#41;&#123;  // Link definieren             

$links&#91;&#93; = "<a href=\"$pfad?go=$i\">$i</a>\n"; 

&#125;elseif&#40;$i == $seiten&#41; &#123; // aktuelle Seite, ein Link ist nicht erforderlich              

$links&#91;&#93; = "<span class=\"current\">&#91; $i &#93;</span>\n";   

&#125;elseif&#40;$i == $go&#41;&#123; // aktuelle Seite, ein Link ist nicht erforderlich              

$links&#91;&#93; = "<span class=\"current\">&#91; $i &#93;</span>\n"; 

&#125; // close if $i       
&#125;

if&#40;$go != $seiten&#41;&#123; // Link definieren => eine Seite weiter blaettern        
$next = $go+1; 
$links&#91;&#93; = "<a href=\"$pfad?go=$next\" title=\"Eine Seite weiter blaettern\"> &raquo; </a>\n"; 
&#125;

if&#40;$seiten - $go - $p > 0 &#41;&#123; // Link definieren => Zur letzen Seite springen    
$last = $seiten;  
$links&#91;&#93; = "<a href=\"$pfad?go=$last\" title=\"Zur letzten Seite springen\">... Letzte &raquo;</a>\n"; 
&#125;

$start = &#40;$go-1&#41; * $datensaetze_pro_seite;             // Berechne den Startwert fuer die DB 


$link_string = implode&#40;" ", $links&#41;; // Zusammenfuegen der einzelnen Links zu einem String 
//------------------------------BLÄTTERFUNKTION---ENDE-----------------------------BLÄTTERFUNKTION----ENDE-------------------------BLÄTTERFUNKTION---ENDE---------------------BLÄTTERFUNKTION---ENDE--------------
//------------2.ABFRAGE----------------------2.ABFRAGE----------------------------2.ABFRAGE--------------------------2.ABFRAGE----------
$abfrage = mysql_query&#40;"SELECT DISTINCT * FROM test LIMIT $start,$datensaetze_pro_seite "&#41;; 
echo "$abfrage";

// if sucheingabe


//---------Sucheingabe Anzeige top----------------------Sucheingabe Anzeige top----------------------------Sucheingabe Anzeige top------
echo "Bei Ihrer Sucheingabe <strong>" . mysql_real_escape_string&#40;$suchwort&#41; . " " . mysql_real_escape_string&#40;$marke&#41; . "</strong>";
$anzahl = mysql_num_rows&#40;$abfrage&#41;;
echo " konnten" . mysql_real_escape_string&#40;$anzahl&#41; . " Ergebnisse</b> gefunden werden.";
// ----------------Blätterfunktion Anzeige top--------------------------------------------Blätterfunktion Anzeige top-------------------
echo "<div id=\"navigation\">\n"; 
echo "<span class=\"pages\">Seite $go von $seiten</span>\n"; 
echo $link_string; // Ausgabe der Seitennavigation 
echo "</div> \n"; 
// -------------------------------------- Tabelle ---------------------------- Tabelle ----------------------- Tabelle ---------------------
echo '<table border="1" style="border-collapse&#58;collapse">';
while &#40;$zeile = mysql_fetch_array&#40; $abfrage, MYSQL_ASSOC&#41;&#41;
&#123;
echo "<tr class='tabelle'>";
echo "<td class='bild'><img src='". htmlspecialchars&#40;$zeile&#91;'Abbildung'&#93;&#41; . "' /></td>";
echo "<td class='marke'>". $zeile&#91;'Marke'&#93; . "</td>";
echo "<td class='body'>". $zeile&#91;'Beschreibung'&#93; . "</td>";
echo "<td class='title'>". $zeile&#91;'Bezeichnung'&#93; . "</td>";
echo "<td class='preis'>". $zeile&#91;'Preis'&#93; . " &euro;</td>";
echo "<td class='bestellen'><a href='". htmlspecialchars&#40;$zeile&#91;'Anbieter'&#93;&#41; . " title='zur Bestellung'>Schicken lassen</a></td>";
echo "</tr>";
&#125;// while ende
echo "</table>";
// ----------------------------------- Blätterfunktion Anzeige bottom--------------- Blätterfunktion Anzeige bottom--------------------------- 
echo "<div id=\"navigation\">\n"; 
echo "<span class=\"pages\">Seite $go von $seiten</span>\n"; 
echo $link_string; // Ausgabe der Seitennavigation 
echo "</div> \n"; 
// ---------------------------------------------------------------------- 
mysql_free_result&#40; $abfrage &#41;;
if &#40; $connection &#41;
&#123;
echo 'Verbindung erfolgreich&#58; ';
echo $connection;
&#125;
else
&#123;

// hier sollte dann später dem Programmierer eine
// E-Mail mit dem Problem zukommen gelassen werden
die&#40;'keine Verbindung möglich&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;
mysql_close&#40;$connection &#41;;
Hierbei erhalte ich meine Tabelle mit den folgenden 3 Zeilen über ihr:
1. SELECT * FROM beauty
=>>Query

2. Warning: mysql_num_rows() expects parameter 1 to be resource, string given in /Applications/XAMPP/xamppfiles/htdocs/web-content/mysql/search-fulltext5.php on line 96
=>>LINE 96 im Skript:

Code: Alles auswählen

$total = mysql_num_rows&#40;$query&#41;;     // liefert die Anzahl der Datensaetze der Abfrage 
3. Resource id #4Bei Ihrer Sucheingabe Sportschuhe Adidas konnten 15 Ergebnisse gefunden werden.


Zudem werden hier auch keine Sitelinks mehr für der Blätterfunktion angezeigt. Das nächste Prob. sind die Ergebnisse der Sucheingabe. Diese entsprechen in keinster Form den eingegebenen Suchkriterien. Es werden lediglich nur die ersten 15 Einträge aus meiner MySQL-DB-Tabelle angezeigt.

Anders verhält es sich, wenn das Skript folgender Maßen aussieht:

Code: Alles auswählen

<?php
//-------------------Error-Reporting--------------------------------------------  
error_reporting&#40;E_ALL&#41;;
//-------------------Datenbankverbindung------------------------------------------
$host = "";     // Adresse des Datenbankservers, meist localhost  
$user = "";             // Ihr MySQL Benutzername  
$pass = "";             // Ihr MySQL Passwort  
$dbase = "test";             // Name der Datenbank  
//--------------------------------------------------------------------------------
$connection = mysql_connect&#40;"$host" , "$user" , "$pass"&#41;   
OR die &#40;"Keine Verbindung zu der Datenbank moeglich."&#41;;  
$db = mysql_select_db&#40;$dbase , $connection&#41;   
OR die &#40;"Auswahl der Datenbank nicht moeglich."&#41;;   
//----------------------VARS----------------------------VARS-------------------------------------VARS------------------------------
$suchwort = &#40;isset&#40;$_POST&#91;'suche'&#93;&#41; AND $_POST&#91;'suche'&#93; != 'Produktfinder'&#41; ? trim&#40;$_POST&#91;'suche'&#93;&#41; &#58; '';
$marke = isset&#40;$_POST&#91;'hersteller'&#93;&#41; ? trim&#40;$_POST&#91;'hersteller'&#93;&#41; &#58; '';
//------------------------------BLÄTTERFUNKTION---START-----------------------------BLÄTTERFUNKTION----START-------------------------BLÄTTERFUNKTION---START---------------------BLÄTTERFUNKTION---START--------------
// ------------------------------1.ABFRAGE---------------------------------1.ABFRAGE-----------------1.ABFRAGE------
$query = mysql_query&#40;"SELECT id FROM test"&#41;; // DB Abfrage 
echo "$query";


//----------------VARS--------------------------------------VARS-----------------------------------------VARS------ 
$pfad = $_SERVER&#91;'PHP_SELF'&#93;;    // aktuellen Dateipfad ermitteln, wichtig fuer die Links der Seitennavigation 
$datensaetze_pro_seite = "15";      // Anzahl der Datensaetze die Pro Seite angezeigt werden sollen 
$p = "5";                                // Anzahl der Links die in der Seitenavigation ausgegeben werden 
$total = mysql_num_rows&#40;$query&#41;;                      // liefert die Anzahl der Datensaetze der Abfrage 
$seiten = ceil&#40;$total / $datensaetze_pro_seite&#41;;     // Berechnet die Seitenanzahl insgesamt 
// ------------------------------FUNCTION-------------------FUNCTION---------------------------------FUNCTION-------
if&#40;empty&#40;$_GET&#91;'go'&#93;&#41;&#41;&#123; // korrigieren der aktuellen Seite 
$go = 1;             // Sofern $go nicht uebergeben wurde 
&#125;elseif&#40;$_GET&#91;'go'&#93; <= 0 || $_GET&#91;'go'&#93; > $seiten&#41;&#123; 
$go = 1;         // Variable definieren 
&#125;else&#123; // Wenn Obiges nicht zutraf 

$go = mysql_real_escape_string&#40;$_GET&#91;'go'&#93;&#41;;     // Variable definieren 
&#125; 
$links = array&#40;&#41;; // Linkkette bilden 

// Seite die vor der aktuellen Seite kommt definieren 
if&#40;&#40;$go - $p&#41; < 1&#41;&#123; $davor = $go - 1;  &#125;else &#123; $davor = $p; &#125;             

// Seite die nach der aktuellen Seite kommt definieren 
if&#40;&#40;$go + $p&#41; > $seiten&#41;&#123; $danach = $seiten - $go; &#125;else&#123; $danach = $p; &#125;    

$off = &#40;$go - $davor&#41;; // Variable definieren    

if &#40;$go- $davor > 1&#41;&#123; // Link definieren => Zur Erste Seite springen          
$first = 1; 
$links&#91;&#93; = "<a href=\"$pfad?go=$first\" title=\"Zur ersten Seite springen\">&laquo; Erste ...</a>\n";       
&#125;

if&#40;$go != 1&#41;&#123; // Link definieren => eine Seite zurueck blaettern           
$prev = $go-1; 
$links&#91;&#93; = "<a href=\"$pfad?go=$prev\" title=\"Eine Seite zurueck blaettern\"> &laquo;</a>\n";      
&#125;

for&#40;$i = $off; $i <= &#40;$go + $danach&#41;; $i++&#41;&#123; // einzelne Seitenlinks erzeugen 

if &#40;$i != $go&#41;&#123;  // Link definieren             

$links&#91;&#93; = "<a href=\"$pfad?go=$i\">$i</a>\n"; 

&#125;elseif&#40;$i == $seiten&#41; &#123; // aktuelle Seite, ein Link ist nicht erforderlich              

$links&#91;&#93; = "<span class=\"current\">&#91; $i &#93;</span>\n";   

&#125;elseif&#40;$i == $go&#41;&#123; // aktuelle Seite, ein Link ist nicht erforderlich              

$links&#91;&#93; = "<span class=\"current\">&#91; $i &#93;</span>\n"; 

&#125; // close if $i       
&#125;

if&#40;$go != $seiten&#41;&#123; // Link definieren => eine Seite weiter blaettern        
$next = $go+1; 
$links&#91;&#93; = "<a href=\"$pfad?go=$next\" title=\"Eine Seite weiter blaettern\"> &raquo; </a>\n"; 
&#125;

if&#40;$seiten - $go - $p > 0 &#41;&#123; // Link definieren => Zur letzen Seite springen    
$last = $seiten;  
$links&#91;&#93; = "<a href=\"$pfad?go=$last\" title=\"Zur letzten Seite springen\">... Letzte &raquo;</a>\n"; 
&#125;

$start = &#40;$go-1&#41; * $datensaetze_pro_seite;             // Berechne den Startwert fuer die DB 


$link_string = implode&#40;" ", $links&#41;; // Zusammenfuegen der einzelnen Links zu einem String 
//------------------------------BLÄTTERFUNKTION---ENDE-----------------------------BLÄTTERFUNKTION----ENDE-------------------------BLÄTTERFUNKTION---ENDE---------------------BLÄTTERFUNKTION---ENDE--------------
//------------2.ABFRAGE----------------------2.ABFRAGE----------------------------2.ABFRAGE--------------------------2.ABFRAGE----------
$abfrage = mysql_query&#40;"SELECT DISTINCT * FROM test LIMIT $start,$datensaetze_pro_seite "&#41;; 
echo "$abfrage";

// if sucheingabe


//---------Sucheingabe Anzeige top----------------------Sucheingabe Anzeige top----------------------------Sucheingabe Anzeige top------
echo "Bei Ihrer Sucheingabe <strong>" . mysql_real_escape_string&#40;$suchwort&#41; . " " . mysql_real_escape_string&#40;$marke&#41; . "</strong>";
$anzahl = mysql_num_rows&#40;$abfrage&#41;;
echo " konnten" . mysql_real_escape_string&#40;$anzahl&#41; . " Ergebnisse gefunden werden.";
// ----------------Blätterfunktion Anzeige top--------------------------------------------Blätterfunktion Anzeige top-------------------
echo "<div id=\"navigation\">\n"; 
echo "<span class=\"pages\">Seite $go von $seiten</span>\n"; 
echo $link_string; // Ausgabe der Seitennavigation 
echo "</div> \n"; 
// -------------------------------------- Tabelle ---------------------------- Tabelle ----------------------- Tabelle ---------------------
echo '<table border="1" style="border-collapse&#58;collapse">';
while &#40;$zeile = mysql_fetch_array&#40; $abfrage, MYSQL_ASSOC&#41;&#41;
&#123;
echo "<tr class='tabelle'>";
echo "<td class='bild'><img src='". htmlspecialchars&#40;$zeile&#91;'Abbildung'&#93;&#41; . "' /></td>";
echo "<td class='marke'>". $zeile&#91;'Marke'&#93; . "</td>";
echo "<td class='body'>". $zeile&#91;'Beschreibung'&#93; . "</td>";
echo "<td class='title'>". $zeile&#91;'Bezeichnung'&#93; . "</td>";
echo "<td class='preis'>". $zeile&#91;'Preis'&#93; . " &euro;</td>";
echo "<td class='bestellen'><a href='". htmlspecialchars&#40;$zeile&#91;'Anbieter'&#93;&#41; . " title='zur Bestellung'>Schicken lassen</a></td>";
echo "</tr>";
&#125;// while ende
echo "</table>";
// ----------------------------------- Blätterfunktion Anzeige bottom--------------- Blätterfunktion Anzeige bottom--------------------------- 
echo "<div id=\"navigation\">\n"; 
echo "<span class=\"pages\">Seite $go von $seiten</span>\n"; 
echo $link_string; // Ausgabe der Seitennavigation 
echo "</div> \n"; 
// ---------------------------------------------------------------------- 
mysql_free_result&#40; $abfrage &#41;;
if &#40; $connection &#41;
&#123;
echo 'Verbindung erfolgreich&#58; ';
echo $connection;
&#125;
else
&#123;

// hier sollte dann später dem Programmierer eine
// E-Mail mit dem Problem zukommen gelassen werden
die&#40;'keine Verbindung möglich&#58; ' . mysql_error&#40;&#41;&#41;;
&#125;
mysql_close&#40;$connection &#41;;
?>
Hier bekomme ich als erste Zeile über der Tabelle folgende Meldung:
Resource id #3Resource id #4Bei Ihrer Sucheingabe Sportschuhe adidas konnten 15 Ergebnisse gefunden werden
Dann erscheinen alle ermittelten Sitelinks der Blätterfunktion, die auch alle einwandfrei funktionieren. Also ich kann wie gewünscht von Seit zu Seite umher blättern. Was hier aber nicht funktioniert ist die Suche. Es werden mir hier ebenfalls die ersten 15 Einträge meiner MySQL-DB-Tabelle angezeigt ohne das diese den eingegebnen Suchkriterien entsprechen.

Im ersten Beitrag dieses Threads, habe ich die drei verschiedenen Varianten aufgezeigt, die ich ohne Erfolg ausprobiert habe.

Verfasst:
von

Verfasst: 11.02.2010, 13:00
von Synonym
Na das ist ja schon wieder so viel.

Für eine Blätterfunktion und vor allem zum Testen brauchst Du erst mal nur Deine funktionierende Suche und ein Limit von bis, mehr nicht. Alles andere ist Zusatz wenn die DB-Abfrage auch funktioniert ;-)
$query = "SELECT * FROM test";

$where = "WHERE 1=1";

if (!empty($marke)) {
$where .= " AND Marke LIKE '%" . mysql_real_escape_string($marke) . "%'";
}

if (!empty($suchwort) && $suchwort != 'Produktfinder') {
$where .= " AND MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('" . mysql_real_escape_string($suchwort) . "')";
}

echo "$query";

// if sucheingabe
$db_erg = mysql_query( $query );
if ( ! $db_erg )
{
die('Ungültige Abfrage: ' . mysql_error());
}

//----------------VARS--------------------------------------VARS-----------------------------------------VARS------
$pfad = $_SERVER['PHP_SELF']; // aktuellen Dateipfad ermitteln, wichtig fuer die Links der Seitennavigation
$datensaetze_pro_seite = "15"; // Anzahl der Datensaetze die Pro Seite angezeigt werden sollen
$p = "5"; // Anzahl der Links die in der Seitenavigation ausgegeben werden
$total = mysql_num_rows($query); // liefert die Anzahl der Datensaetze der Abfrage
$seiten = ceil($total / $datensaetze_pro_seite); // Berechnet die Seitenanzahl insgesamt
// ------------------------------FUNCTION-------------------FUNCTION---------------------------------FUNCTION-------
Ist logisch, da wie schon gesagt, in dem Fall $query eben keine Kennung ist, sondern ein String. Die Kennung wäre in dem Fall also nicht $query, sondern $db_erg

Aber wie schon gesagt, das ist irgendwie der falsche Ansatz. Deine Blätterfunktion muss kombiniert werden mit der Suche.

Das ist doch Deine Suche, oder?

Code: Alles auswählen

$query = "SELECT * FROM test";

$where = "WHERE 1=1";

if &#40;!empty&#40;$marke&#41;&#41; &#123;
   $where .= " AND Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

if &#40;!empty&#40;$suchwort&#41; && $suchwort != 'Produktfinder'&#41; &#123;
   $where .= " AND MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";
&#125; 
Die filtert also nach Suchbegriff und Marke. Da ist aber nichts von einem Limit von bis zu sehen!

Die Limitierung kommt ja erst hier unten

Code: Alles auswählen

$abfrage = mysql_query&#40;"SELECT DISTINCT * FROM test LIMIT $start,$datensaetze_pro_seite "&#41;;
echo "$abfrage"; 
Und das hat nun mal nichts mit der Suche zu tun, also bekommst Du da nur die Ergebnisse anhand von Limit. Suchbegriffe und Marken kommen in der Query ja nicht vor.

Wenn Du also die Suchergebnis limitieren willst, dann muss das "LIMIT $start,$datensaetze_pro_seite " auch dort mit rein und nicht extra irgendwo in einer zweiten Query.

Verfasst: 11.02.2010, 17:54
von mgutt
Du nimmst den Code der funktioniert und verlängerst $sql vor der Ausführung einfach:

Code: Alles auswählen

$sql .= ' LIMIT ' . intval&#40;$offset&#41; . ',' . intval&#40;$limit&#41;;
Denk auch hier an die Maskierung der Variablen. Diesmal mit intval() erfolgt, da wir hier nur Zahlen wünschen (statt mit mysql_real_escape_string).

Verfasst: 12.02.2010, 09:25
von ben78
Ich weiss manchmal gar nicht, wie ich in Sachen PHP meine Fragen stellen soll, kann oder muss. So geht's bestimmt vielen am Anfang und ich hoffe ihr könnt mich verstehen. Meine beiden Bücher in diesem Thread sind echt Katastrophal und äusserst verwirrend. ...Sorry Leutz...:D:oops:

Also ich habe die ganze Angelegenheit noch mal von vorne neu überarbeitet. Dabei ist es mir endlich gelungen, dass die Suchfunktion greift und mir die erste Ergebnisseite perfekt angezeigt wird. Also Suchergebnisse und Navi der Blätterfunktion...und hehe...ganz stolz....keine einzige Fehlermeldung...

:cry: Aber jetzt habe ich das Problem, dass die Links der Blätterfunktions-Navi nicht funktionieren. Bei jedem Klick darauf erscheint folgende Meldung:

Ungültige Abfrage: 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 'LIMIT 20,10' at line 1


...und meine Query sieht jetzt wie folgt aus...die Tante Google konnte auch nicht helfen...und ich erkenne hier keinen Syntaxfehler. Also in der letzten Zeile bei LIMIT - Als Anfänger versteht sich...gelll!:rolleyes::
Ich habe die LIMIT-Zeile einfach von mgutt's Beitrag über mir rauskopiert und in meine neue query kopiert nachdem ich mit der neuen Bearbeitung des Skripts fertig war. Dets bestimmt falsch oder, also syntaxtechnisch?

Code: Alles auswählen

// Querey
$abfrage = "SELECT * FROM beauty WHERE";

if &#40;$suchwort&#41; $abfrage .= " MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";

if &#40;$marke&#41; 
&#123;
if &#40;$suchwort&#41; $abfrage .= "AND";
$abfrage .= " Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

$abfrage .= ' LIMIT ' . intval&#40;$start&#41; . ',' . intval&#40;$datensaetze_pro_seite&#41;;

Verfasst: 12.02.2010, 09:44
von Synonym
So, und an der Stelle wären jetzt mehr Informationen notwendig, denn keiner Weiß so genau wie Deine "Links" aussehen.

Ich gehe davon aus, dass Die alle ohne Suchwort und ohne Marke sind. Wenn ja, dann ist der Fehler klar.

Du beginnst Deine Query wieder mit

Code: Alles auswählen

$abfrage = "SELECT * FROM beauty WHERE"; 
Wenn nun aber keine "$suchwort" und auch kein "$marke" vorhanden ist, dann hast Du wieder ein "WHERE ohne Bedingung" in der Query.

Sprich, Du hast etwas in der Art:
SELECT * FROM beauty WHERE LIMIT 20,10

Und genau zwischen dem WHERE und dem LIMIT fehlt die Bedingung.

Bei den "Blätter-Links" musst Du natürlich auch die "Suchbegriffe und Marken" wieder mit übergeben, sonst weiß die DB davon ja nichts und die würdest quasi durch alles Blättern und nicht nur durch die Suchtreffer.

Und das hier "the right syntax to use near 'LIMIT 20,10' at line 1" heißt nicht, dass der Fehler am "LIMIT 20,10" liegt. Das heißt nur in der Nähe von "LIMIT 20,10", mehr nicht.

Und da Du Deine komplette Query jeweils mit .= zusammenhängst, ohne auch nur einmal eine neue Zeile zu beginnen ist Deine komplette Query auch nur in einer Zeile. Sprich, egal wo da dann der Fehler ist, MySQL meldet dann immer "at line 1"

So, gleich ein Nachtrag:

Deine Begriffe holst Du Dir ja damit

Code: Alles auswählen

$suchwort = &#40;isset&#40;$_POST&#91;'suche'&#93;&#41; AND $_POST&#91;'suche'&#93; != 'Produktfinder'&#41; ? trim&#40;$_POST&#91;'suche'&#93;&#41; &#58; '';
$marke = isset&#40;$_POST&#91;'hersteller'&#93;&#41; ? trim&#40;$_POST&#91;'hersteller'&#93;&#41; &#58; '';
Also die kommen immer über ein POST. Deine Links sind aber sicherlich keine Formularbutton die POSTen, oder? Also brauchst Du eigentlich auch eine Abfrage der Begriffe über GET.

Füge doch mal zum testen direkt unter die beiden oben genannten Zeilen folgende ein (unschön, sollte aber testweise funktionieren):

Code: Alles auswählen

$suchwort = &#40;empty&#40;$suchwort&#41; AND isset&#40;$_GET&#91;'suche'&#93;&#41;&#41; ? trim&#40;$_GET&#91;'suche'&#93;&#41; &#58; '';
$marke = &#40;empty&#40;$marke&#41; AND isset&#40;$_GET&#91;'hersteller'&#93;&#41;&#41; ? trim&#40;$_GET&#91;'hersteller'&#93;&#41; &#58; ''; 
Die Zeilen sollten dann eigentlich aus der URL die Werte übernehmen, wenn zuvor keine per POST gesendet wurden.

Dann hänge an Deine Blätter-Links mal die beiden Variablen mit an. Also "suchwort" und "hersteller". Das "go" das DU schon hast ist ja nur die Seitenzahl zu der er gehen soll, wenn ich das richtig verstanden habe.

Sprich etwas in der Art:
$pfad?go=$i&suchwort=DEINSUCHWORT&marke=DEINEMARKE

Das ist dann aber auch wieder nur die halbe Miete, da ja nur zum testen. Die Begriffe im Link müssen dann vom Script kommen, so wie die Seitenzahlen auch. Ebenso müssen die aufbereitet, maskiert, werden, etc.

Aber zum testen müsstest Du da zumindest per Hand einen Begriff eingeben können. Ich weiß leider nicht welche das so wären.

Theoretisch kannst Du das ganze auch zum testen per URL aufrufen, also was in der Art:
https://www.deinedomein.de/deinscript.p ... INSUCHWORT

Verfasst: 13.02.2010, 23:31
von nerd
mgutt hat geschrieben:Du nimmst den Code der funktioniert und verlängerst $sql vor der Ausführung einfach:

Code: Alles auswählen

$sql .= ' LIMIT ' . intval&#40;$offset&#41; . ',' . intval&#40;$limit&#41;;
Denk auch hier an die Maskierung der Variablen. Diesmal mit intval() erfolgt, da wir hier nur Zahlen wünschen (statt mit mysql_real_escape_string).
das geht aber doch nur, wenn du vorher noch eine andere abfrage ausfuehrst die dir die anzahl der ergebnisse zurueckgibt, damit du weisst wieviele [seite 1][seite 2][seite 3] ... links du anzeigen musst - oder hab ich was verpasst?

Verfasst: 13.02.2010, 23:49
von mgutt
ich gehe mal davon aus, dass er das hat. woher kommen sonst die $offset und $limit. die wird er wohl kaum manuell eingetragen haben. wenn doch: mach ne abfrage ^^

Verfasst: 14.02.2010, 14:52
von ben78
:wink: Leutz, Ihr seid der absolute Wahnsinn...Vielen Dank!
Ich bin wirklich Sprachlos. TOLLES FORUM, TOLLE MEMBERS, und vieles mehr.:wink:


@mgutt & nerd

Richtig, in meinem Skript stehen 2 Querys.
1.

Code: Alles auswählen

// DB Abfragee
$query = mysql_query&#40;"SELECT id FROM test"&#41;;
2.

Code: Alles auswählen

// Querey
$abfrage = "SELECT * FROM test WHERE";

if &#40;$suchwort&#41; $abfrage .= " MATCH &#40;Bezeichnung, Beschreibung, Marke&#41;  AGAINST&#40;'" . mysql_real_escape_string&#40;$suchwort&#41; . "'&#41;";

if &#40;$marke&#41; 
&#123;
if &#40;$suchwort&#41; $abfrage .= "AND";
$abfrage .= " Marke LIKE '%" . mysql_real_escape_string&#40;$marke&#41; . "%'";
&#125;

$abfrage .= ' LIMIT ' . intval&#40;$start&#41; . ',' . intval&#40;$datensaetze_pro_seite&#41;;
@Synonym
Füge doch mal zum testen direkt unter die beiden oben genannten Zeilen folgende ein (unschön, sollte aber testweise funktionieren):
Code:
$suchwort = (empty($suchwort) AND isset($_GET['suche'])) ? trim($_GET['suche']) : '';
$marke = (empty($marke) AND isset($_GET['hersteller'])) ? trim($_GET['hersteller']) : '';
Hab das ausprobiert. Aber dann erhalte ich schon bei der ersten Ergebnisseite folgende Meldung:
Ungültige Abfrage: 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 'LIMIT 0,10' at line 1

Lasse ich die beiden zitierten Zeilen weg, erscheint die erste Ergebnisseite nahezu Perfekt. Allerdings erhalte ich selbige Fehlermeldung, sobald ich auf einen Sitelink meiner Blätterfunktion klicke.