php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2010

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 09.02.2010, 12:18  
Benutzer
 
Registriert seit: 08.02.2010
Beiträge: 75
PHP-Kenntnisse:
Anfänger
bench78 kann nur auf Besserung hoffen
Standard [Erledigt] Querey: Probleme mit Against()

!!!THREAD CLOSED!!!

Hi PHP-Leutz,

ich hoffe mich mit meinem gestrigen (1.) Beitrag (Crossposting) nicht all zu unbeliebt in diesem Forum gemacht zu haben. Jetzt weiss ich wenigstens, was man unter Crossposting versteht und vor allem weshalb dies gemieden werden soll. THX Leutz. Ich dachte eben auf diese Art mein Problem schneller lösen zu können. Naja, wie dem auch sei, aller Anfang ist schwer...ich hoffe, dass jetzt wieder alles Passt und ich nicht so wie gestern auf die Schnauze fliege.


Der User soll für seine Suche die Möglichkeit haben entweder das Texteingabefeld und das Sprungmenü gleichzeitig zu benutzen ODER für seine Such nur eines der beiden Felder zu benutzen. Also entweder er tippt einen Suchbegriff in das Texteingabefeld ein und lässt dabei das Sprungmenü (Marke auswählen) unberührt oder er wählt nur eine Marke aus dem Sprungmenü und lässt dabei das Texteingabefeld unberührt.

Ich möchte, dass der User im Texteingabefeld das Wort "Produktfinder" sehen bzw. lesen kann solange er nichts darin eintippt aber das Wort "Produktfinder" nicht für die Suche berücksichtigt wird. Also wenn das Texteingabefeld bei der Suche unberührt bleibt, soll folgende Querey erscheinen:
SELECT * FROM test WHERE Marke LIKE '%Adidas%'

Um das zu erreichen, habe ich meine Querey zerteilt die jetzt so aussieht:

PHP-Code:
// Querey
$sql "SELECT * FROM test 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());

...Vor der Zerteilung sah meine Query im Skript so aus:
PHP-Code:
// Querey
$sql "SELECT * FROM test WHERE 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());

Trotz der Zerteilung erhalte ich weiterhin folgende Query bei unberührtem Texteingabefeld:

SELECT * FROM test WHERE MATCH (Bezeichnung, Beschreibung, Marke) AGAINST('Produktfinder') AND Marke LIKE '%Adidas%'

...und somit 0 Suchergebnisse, weil hier nach dem Suchbegriff "Produktfinder" gesucht wird.

Alle anderen Suchkombis funzen einwandfrei. Also wenn in das Texteingabefeld ein Suchbegriff getippt wird und gleichzeitig eine Marke aus dem Sprungmenü gewählt wird oder nur ein Suchbegriff in das Texteingabefeld getippt wird, ohne dass eine Marke aus dem Sprungmenü ausgewählt wird.

Sobald ich aber das Texteingabefeld unberührt lasse, wird automatisch nach dem Wort "Produktfinder" gesucht und es werden mir 0 Suchergebnisse ausgegeben.

War die Zerteilung überhaupt der richtige Ansatz zu meinem Problem oder kann hier eine Stoppwortliste mit folgender Zeile besser helfen:

PHP-Code:
$stopwords["de"][] = "Produktfinder"
...und wenn nein, was wäre hier die beste bzw. richtigste Lösung???

Schonmal VERY BIG THX im Voraus!

Geändert von bench78 (11.02.2010 um 07:15 Uhr).
bench78 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 09.02.2010, 12:33  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.192
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist ein sehr geschätzer MenschDark Guardian ist ein sehr geschätzer MenschDark Guardian ist ein sehr geschätzer MenschDark Guardian ist ein sehr geschätzer Mensch
Standard

Mach es doch einfach folgendermaßen::

PHP-Code:
$sql "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) . "')";

Erläuterung: Du definierst zunächst den Query ohne WHERE Klausel. Dann erzeugst du die WHERE Klausel mit der Bedingung 1=1. Das hat für die Ergebnisse keine Auswirkungen aber auf den Query->Syntax denn wie du siehst werden die beiden Abfragen für die Suchfelder per AND angehängt. Um umständliche Abfragen zu vermeiden starten beide Befehle immer mit AND. In Kombination mit dem 1=1 ist es nun egal welche Bedingung als erstes angehängt wird und ob schon eine Bedingung angehängt wurde.
__________________
Möglicherweise kommt zu "Menschen lügen" auch "Menschen bauen Mist".

Geändert von Dark Guardian (09.02.2010 um 12:36 Uhr).
Dark Guardian ist offline  
Alt 09.02.2010, 12:47  
Benutzer
 
Registriert seit: 08.02.2010
Beiträge: 75
PHP-Kenntnisse:
Anfänger
bench78 kann nur auf Besserung hoffen
Standard

Ich habe mal ganz mutig gleich bei der Übernahme folgendes probiert:
PHP-Code:
$suchwort = (isset($_POST['suche']) AND $_POST['suche'] != 'Produktfinder') ? trim($_POST['suche']) : ''
...und ich glaube es kaum, das Problem scheint gelöst zu sein. Ich lasse den Thread noch offen, weil ich mir noch nicht ganz sicher bin...Aber es schaut jetzt schonmal sehr sehr gut aus...für mich unglaublich, aber wahr. Freu Freu

Geändert von bench78 (09.02.2010 um 13:17 Uhr).
bench78 ist offline  
Alt 11.02.2010, 03:49  
Benutzer
 
Registriert seit: 08.02.2010
Beiträge: 75
PHP-Kenntnisse:
Anfänger
bench78 kann nur auf Besserung hoffen
Standard

Hi Leute,

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):
PHP-Code:
$query mysql_query("SELECT id FROM beauty"); // DB Abfrage
echo "$query"
Ausgangsvariante der 2. Query (abfrage):
PHP-Code:
$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
PHP-Code:
// 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.

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:
PHP-Code:
$total mysql_num_rows($query);  // liefert die Anzahl der Datensaetze der Abfrage 
...und diese Zeilen befindet sich ebenfalls in meinem Skript...
PHP-Code:
echo "Ihre Sucheingabe <strong>" mysql_real_escape_string($suchwort) . " " mysql_real_escape_string($marke) . "</strong>";
$anzahl mysql_num_rows($abfrage);
echo 
" ergab" mysql_real_escape_string($anzahl) . " 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):
PHP-Code:
//----------------------VARS----------------------------VARS-------------------------------------VARS------------------------------
$suchwort = (isset($_POST['suche']) AND $_POST['suche'] != 'Produktfinder') ? trim($_POST['suche']) : '';
$marke = isset($_POST['hersteller']) ? trim($_POST['hersteller']) : '';
//------------------------------BLÄTTERFUNKTION---START-----------------------------BLÄTTERFUNKTION----START-------------------------BLÄTTERFUNKTION---START---------------------BLÄTTERFUNKTION---START--------------
// ------------------------------1.ABFRAGE---------------------------------1.ABFRAGE-----------------1.ABFRAGE------
$query "SELECT * FROM beauty WHERE";

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

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

echo 
"$query";


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


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):
PHP-Code:
$query "SELECT * FROM beauty WHERE id <> 0";

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


if (
$marke) { 
$query " Marke LIKE '%" mysql_real_escape_string($marke) . "%'";
}



echo 
"$query";



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

3. Variante (Versuch):
Hier wollte ich den Vorschlag von Dark Guardian, ein Beitrag über mir umsetzen. Hier erhalte ich genau das gleiche Ergebnis wie bei meinem 1 Query-Versuch. Nur das mein echo "$query"; halt so aussieht:
SELECT * FROM beauty.

2.Query-Variante (Versuch):
PHP-Code:
$query "SELECT * FROM beauty";

$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());

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...

Geändert von bench78 (11.02.2010 um 05:23 Uhr).
bench78 ist offline  
Alt 11.02.2010, 03:59  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.170
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

Deine ganzen Varianten und Ausführungen sind mehr als verwirrend. Trotzdem:

In mysql_num_rows gehört eine Abfrageressource (expects parameter 1 to be resource), also das Ergebnis von mysql_query, kein Querystring (string given).
Umgekehr kannst Du das Ergebnis von mysql_query nicht ausgeben (echo "$var") weil Du hier nur einen nicht darstellbaren Ressourcetyp (Resource id #3) erhältst.
Und gewöhn Dir bitte sowas ab:
PHP-Code:
$echo "$var"
Das ist schlichtweg Unsinn. PHP unterstützt Variablenparsing in Strings, das heißt nicht, dass das notwendig ist.
PHP-Code:
echo $var// mehr nicht! 
Und es heißt natürlich auch nicht $echo.
Zitat:
PHP-Code:
echo "Ihre Sucheingabe <strong>" mysql_real_escape_string($suchwort) . " " mysql_real_escape_string($marke) . "</strong>";
$anzahl mysql_num_rows($abfrage);
echo 
" ergab" mysql_real_escape_string($anzahl) . " Ergebnisse."
mysql_real_escape_string ist für die Arbeit in Querystrings gedacht. Für die Ausgabe am Bildschirm ist das Unsinn.
PHP-Code:
echo "Ihre Sucheingabe <strong>" 
     
htmlspecialchars($suchwort) . " " 
     
htmlspecialchars($marke) . " </strong> ergab" 
     (int) 
mysql_num_rows($db_erg) . " Ergebnisse."
PHP-Code:
?>
Ihre Sucheingabe 
<strong><?php echo htmlspecialchars($suchwort); ?> <?php echo htmlspecialchars($marke); ?> 
</strong> ergab <?php echo (int) mysql_num_rows($db_erg); ?> Ergebnisse.
<?php
PHP-Code:
printf (
       
'Ihre Sucheingabe <strong>%s %s</strong> ergab %d Ergebnisse.' ,
       
htmlspecialchars($suchwort)    ,
       
htmlspecialchars($marke)       ,
       
mysql_num_rows($db_erg)        
       ); 
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (11.02.2010 um 04:10 Uhr).
nikosch ist offline  
Alt 11.02.2010, 04:51  
Benutzer
 
Registriert seit: 08.02.2010
Beiträge: 75
PHP-Kenntnisse:
Anfänger
bench78 kann nur auf Besserung hoffen
Standard

@nikosch Vielen Dank!...ich werde die einzelnen Punkte durcharbeiten, die Du genannt hast!

THEMA WURDE NEU ERÖFFNET:
HIER GEHT'S ZUM THEMA SUMA MIT BLÄTTERFUNKTION WEITER

!!!THREAD CLOSED!!!

Geändert von bench78 (11.02.2010 um 05:57 Uhr).
bench78 ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
CHarset und Probleme mit IE KeKs0r HTML, Usability und Barrierefreiheit 10 26.01.2010 21:59
[Erledigt] fopen() Probleme jN^ PHP Tipps 2009 2 18.08.2009 12:31
Firefox / IE - Probleme HTML, Usability und Barrierefreiheit 5 20.07.2009 17:04
Win+Firefox alles ok, IE oder Linux: Probleme vollderdude PHP Tipps 2009 6 02.01.2009 16:17
[Erledigt] Probleme mit iFrame rocco HTML, Usability und Barrierefreiheit 1 28.12.2008 17:44
Einzeltreffer von MATCH ... AGAINST ... ermitteln proud Datenbanken 3 09.05.2008 08:31
match, against: ergebnisse filtern DarkThunder Datenbanken 4 30.03.2007 10:51
MATCH .... AGAINST ... Problem Denise Datenbanken 4 21.03.2007 20:05
Probleme bei Speicherung von serialize() Strings Manni2k PHP Tipps 2006 13 15.10.2006 15:06
[Erledigt] Probleme mit Sonderzeichen... Datenbanken 1 02.08.2005 23:37
[Erledigt] hilfe! probleme mit... PHP Tipps 2005 4 12.04.2005 22:55
[Erledigt] CSV Größe macht Probleme mit php PHP Tipps 2005 5 15.03.2005 21:29
MySQL Match Against Problem RcRaCk2k PHP-Fortgeschrittene 1 15.03.2005 12:22
Zwei Rechner ins Netz - Router - Hub - Probleme... imported_Ben Off-Topic Diskussionen 37 13.01.2005 21:36
Technische Probleme mit Sessions PHP-Fortgeschrittene 4 18.11.2004 14:45

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
querey, mysql match against resource id, sql reihenfolge der suchbegriffe egal

Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum