Jump to content
xt:Commerce Community Forum

Fehler bei der Suche


Recommended Posts

Hallo,

(XTC 3.04) Ich habe festgestellt, dass in meiner Webstatistik relativ viele 404 Errors täglich vorkommen und nach einigem Suchen herausgefunden, dass dies passiert, wenn ein Kunde in der Suche einen Slash "/" eingibt. Die Suche ist dann zunächst erfolgreich, jedoch wird dann beim Blättern zur nächsten Seite ein 404 Error (Objekt nicht gefunden) ausgegeben. Bisher konnte ich bei aller Mühe diesen Fehler nicht beheben. Hat jemand einen Tipp?

Wie ich soeben unter "Live Shops" festgestellt habe, taucht dieses Problem auch in anderen Shops auf.

Gruß,

DiNO

Link to comment
Share on other sites

  • 2 months later...

Ich hab' da Folgendes in der inc/xtc_parse_search_string.inc.php gemacht:

function xtc_parse_search_string($search_str = '', &$objects) {
$search_str = trim(strtolower($search_str));
// added trash removal by IaN - 07/Jan/2007
$search_str = str_replace( array("/", "\n", "\r", "$", "&", "&"), " ", $search_str );
// end trash removal

// (...und so weiter...)[/PHP]

Link to comment
Share on other sites

Hat leider nicht geholfen. Ich habe viele Produkte in Form von Produkt c/d.

Wenn ich das so wie du umschreibe, ignoriert er ja den / und wirft mir alles als Ergebnis aus. Aber wenn ich dann auf kaufen klicke, ist kommt trotzdem die Error-Seite. Genauso wennn ich auf die nächste Seite der Suchtreffer gehen will.

Die Suche mit dem / soll schon möglich sein.

Link to comment
Share on other sites

Guest tuvalu

das einbinden:

$_GET['keywords'] = str_replace("/", "", $_GET['keywords']);

Jau, funktioniert schon. Nur werden Suchbegriffe mit / im Text dann nicht mehr gefunden.

tuvalu

Link to comment
Share on other sites

@pixeleyes:

schau mal in diie adavanced_search_result.php

Ist eigentlich das Gleiche wie bei meiner Lösung, nur in einer anderen Datei und so, dass Du den Slash mit einem leeren String ersetzt, ich nehm da ein Leerzeichen zu.

@cytrade:

Die Suche mit dem / soll schon möglich sein.

Das ist in der Tat ein Problem - da die Suchwörter als Zeichenkette an die URL der Ergebnisseiten angehängt werden, taucht auch der Slash in der URL auf. Einige Server versuchen dann offenbar, das als Ordnernamen zu interpretieren (der Slash ist halt das Trennzeichen in URLs), finden die angeblich angefragte Datei nicht und schon ist der 404 da... Es scheint am Server zu liegen, denn bei unserem Shop funktioniert das vorzüglich.

Wie hast Du denn im Admin die Suchverknüpfungen eingestellt? AND oder OR? Wenn Du, wie in meinem Codebeispiel, den Slash durch ein Leerzeichen ersetzt und als Suchverknüpfung AND benutzt, müsste die Suche eigentlich wieder was finden (aus c/d würde dann c AND d).

Sonst fiele mir nur ein, den Slash "on the fly" gegen ein weniger URL-lastiges und sonst nicht benutztes Zeichen auszutauschen - z.B. die Suche noch "/" suchen lassen, bevor aber die Links für die Ergebnisseiten zusammengebaut würden, den Slash durch "[slash]" oder so zu ersetzen...

Klingt kompliziert, was besseres (einfacheres) fällt mir aber grad nicht ein...

Link to comment
Share on other sites

Guest tuvalu

Hi Mr. Steed!

Ist eigentlich das Gleiche wie bei meiner Lösung, nur in einer anderen Datei und so, dass Du den Slash mit einem leeren String ersetzt, ich nehm da ein Leerzeichen zu.

Deine Variante hat bei mir nicht funktioniert da ich Cookies abgeschaltet habe. Die Session wird über die URL übergeben und wird bei Deinem Code zwei mal angehängt.

Wie hast Du denn im Admin die Suchverknüpfungen eingestellt? AND oder OR? Wenn Du, wie in meinem Codebeispiel, den Slash durch ein Leerzeichen ersetzt und als Suchverknüpfung AND benutzt, müsste die Suche eigentlich wieder was finden (aus c/d würde dann c AND d).

Ich hatte AND voreingestellt. Mit OR funktionierts.

Ist sicher eine Glaubensfrage ob OR oder AND besser als Voreinstellung sind. Ich muß mal die Suchwort-Erweiterung installieren um zu sehen ob die Kunden eher nach kurzen oder langen Ausrücken suchen. Im ersteren wäre OR besser, im zweiten Fall AND.

tuvalu

Link to comment
Share on other sites

Hi Mr. Steed!

Wenn schon förmlich, dann Sir! ;)

und wird bei Deinem Code zwei mal angehängt.

Ups, seltsam... Jedenfalls ist mir Folgendes eingefallen:

Versuchts mal so - in der advanced_search_result.php wie tuvalu vorschlägt, aber etwas anders, nach

/*
* search process starts here
*/[/PHP]

dies einfügen:

[PHP]$_GET['keywords'] = str_replace("/", "[slash]", $_GET['keywords']);[/PHP]

Damit würde der Slash schonmal für die Breadcrumb-Navigation maskiert!

Dann kurz darunter vor

[PHP]// define additional filters //[/PHP]

dies einfügen:

[PHP]$_GET['keywords'] = str_replace("[slash]", "/", $_GET['keywords']);[/PHP]

damit würde der Slash wieder für den Suchprozess im "Original" eingebunden.

Dann ganz unten vor

[PHP]//glue together

$listing_sql = $select_str.$from_str.$where_str;
require (DIR_WS_MODULES.FILENAME_PRODUCT_LISTING);[/PHP]

wieder dies einfügen:

[PHP]$_GET['keywords'] = str_replace("/", "[slash]", $_GET['keywords']);[/PHP]

Denn die Seitennavigation (die die 404-Fehler provoziert) wird aus den GET-Übergaben an die includes/modules/product_listing.php generiert, die darf also keinen Slash bekommen.

Ist alles NICHT getestet, und nur eine schnelle Idee...

Cheers,

IaN

Link to comment
Share on other sites

Ich möchte mich recht herzlich bedanken.

Ich habe die advanced_search_result.php so geändert und jetzt kann ich mit / suchen, die Suchausgabe ist glaube ich in Ordnung. Der Kaufen-Button funktioniert und ich kann zur nächsten Ergebnisseite wechseln.

Also Sir Steed, Danke, Respekt und eine erfolgreiche Woche.

Gruß Frank

Link to comment
Share on other sites

Guest tuvalu

Ich möchte mich recht herzlich bedanken.

Ich habe die advanced_search_result.php so geändert und jetzt kann ich mit / suchen, die Suchausgabe ist glaube ich in Ordnung. Der Kaufen-Button funktioniert und ich kann zur nächsten Ergebnisseite wechseln.

Also Sir Steed, Danke, Respekt und eine erfolgreiche Woche.

Da will ich mich gerne anschließen. Danke.

tuvalu

Link to comment
Share on other sites

Sorry, bei mir sieht die nun so aus wie unten gelistet.

LEIDER funktioniert es immer noch nicht.

Der Artikel hat die Artikelnummer W/Ag7

und wird wenn ich W/Ag7 ins suchfeld eingebe NICHT gefunden.

Vielleicht habe ich die codes falsch gepastet wie in der Anleitung beschrieben. Könnt ihr einmal ein Auge darauf werfen oder zumindest

eure funktionierende advanced_search.php einmal asl anhang posten ?

DANKE :D

<?php

/* -----------------------------------------------------------------------------------------
$Id: advanced_search_result.php 1141 2005-08-10 11:31:36Z novalis $

XT-Commerce - community made shopping
http://www.xt-commerce.com

Copyright (c) 2005 XT-Commerce
-----------------------------------------------------------------------------------------
based on:
(c) 2000-2001 The Exchange Project (earlier name of osCommerce)
(c) 2002-2003 osCommerce(advanced_search_result.php,v 1.68 2003/05/14); www.oscommerce.com
(c) 2003 nextcommerce (advanced_search_result.php,v 1.17 2003/08/21); www.nextcommerce.org

Released under the GNU General Public License
---------------------------------------------------------------------------------------*/

include ('includes/application_top.php');
// create smarty elements
$smarty = new Smarty;
// include boxes
require (DIR_FS_CATALOG.'templates/'.CURRENT_TEMPLATE.'/source/boxes.php');
// include needed functions
require_once (DIR_FS_INC.'xtc_parse_search_string.inc.php');
require_once (DIR_FS_INC.'xtc_get_subcategories.inc.php');
require_once (DIR_FS_INC.'xtc_get_currencies_values.inc.php');

/*
* check search entry
*/

$error = 0; // reset error flag to false
$errorno = 0;
$keyerror = 0;

if (isset ($_GET['keywords']) && empty ($_GET['keywords'])) {
$keyerror = 1;
}

if ((isset ($_GET['keywords']) && empty ($_GET['keywords'])) && (isset ($_GET['pfrom']) && empty ($_GET['pfrom'])) && (isset ($_GET['pto']) && empty ($_GET['pto']))) {
$errorno += 1;
$error = 1;
}
elseif (isset ($_GET['keywords']) && empty ($_GET['keywords']) && !(isset ($_GET['pfrom'])) && !(isset ($_GET['pto']))) {
$errorno += 1;
$error = 1;
}

if (strlen($_GET['keywords']) < 3 && strlen($_GET['keywords']) > 0 && $error == 0) {
$errorno += 1;
$error = 1;
$keyerror = 1;
}

if (strlen($_GET['pfrom']) > 0) {
$pfrom_to_check = xtc_db_input($_GET['pfrom']);
if (!settype($pfrom_to_check, "double")) {
$errorno += 10000;
$error = 1;
}
}

if (strlen($_GET['pto']) > 0) {
$pto_to_check = $_GET['pto'];
if (!settype($pto_to_check, "double")) {
$errorno += 100000;
$error = 1;
}
}

if (strlen($_GET['pfrom']) > 0 && !(($errorno & 10000) == 10000) && strlen($_GET['pto']) > 0 && !(($errorno & 100000) == 100000)) {
if ($pfrom_to_check > $pto_to_check) {
$errorno += 1000000;
$error = 1;
}
}

if (strlen($_GET['keywords']) > 0) {
if (!xtc_parse_search_string(stripslashes($_GET['keywords']), $search_keywords)) {
$errorno += 10000000;
$error = 1;
$keyerror = 1;
}
}

if ($error == 1 && $keyerror != 1) {

xtc_redirect(xtc_href_link(FILENAME_ADVANCED_SEARCH, 'errorno='.$errorno.'&'.xtc_get_all_get_params(array ('x', 'y'))));

} else {

/*
* search process starts here
*/
$_GET['keywords'] = str_replace("/", "[slash]", $_GET['keywords']);
$breadcrumb->add(NAVBAR_TITLE1_ADVANCED_SEARCH, xtc_href_link(FILENAME_ADVANCED_SEARCH));
$breadcrumb->add(NAVBAR_TITLE2_ADVANCED_SEARCH, xtc_href_link(FILENAME_ADVANCED_SEARCH_RESULT, 'keywords='.xtc_db_input($_GET['keywords']).'&search_in_description='.xtc_db_input($_GET['search_in_description']).'&categories_id='.(int)$_GET['categories_id'].'&inc_subcat='.xtc_db_input($_GET['inc_subcat']).'&manufacturers_id='.(int)$_GET['manufacturers_id'].'&pfrom='.xtc_db_input($_GET['pfrom']).'&pto='.xtc_db_input($_GET['pto']).'&dfrom='.xtc_db_input($_GET['dfrom']).'&dto='.xtc_db_input($_GET['dto'])));

require (DIR_WS_INCLUDES.'header.php');
$_GET['keywords'] = str_replace("[slash]", "/", $_GET['keywords']);
// define additional filters //

//fsk18 lock
if ($_SESSION['customers_status']['customers_fsk18_display'] == '0') {
$fsk_lock = " AND p.products_fsk18 != '1' ";
} else {
unset ($fsk_lock);
}

//group check
if (GROUP_CHECK == 'true') {
$group_check = " AND p.group_permission_".$_SESSION['customers_status']['customers_status_id']."=1 ";
} else {
unset ($group_check);
}

//manufacturers if set
if (isset ($_GET['manufacturers_id']) && xtc_not_null($_GET['manufacturers_id'])) {
$manu_check = " AND p.manufacturers_id = '".(int)$_GET['manufacturers_id']."' ";
}

//include subcategories if needed
if (isset ($_GET['categories_id']) && xtc_not_null($_GET['categories_id'])) {
if ($_GET['inc_subcat'] == '1') {
$subcategories_array = array ();
xtc_get_subcategories($subcategories_array, (int)$_GET['categories_id']);
$subcat_join = " LEFT OUTER JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." AS p2c ON (p.products_id = p2c.products_id) ";
$subcat_where = " AND p2c.categories_id IN ('".(int) $_GET['categories_id']."' ";
foreach ($subcategories_array AS $scat) {
$subcat_where .= ", '".$scat."'";
}
$subcat_where .= ") ";
} else {
$subcat_join = " LEFT OUTER JOIN ".TABLE_PRODUCTS_TO_CATEGORIES." AS p2c ON (p.products_id = p2c.products_id) ";
$subcat_where = " AND p2c.categories_id = '".(int) $_GET['categories_id']."' ";
}
}

if ($_GET['pfrom'] || $_GET['pto']) {
$rate = xtc_get_currencies_values($_SESSION['currency']);
$rate = $rate['value'];
if ($rate && $_GET['pfrom'] != '') {
$pfrom = $_GET['pfrom'] / $rate;
}
if ($rate && $_GET['pto'] != '') {
$pto = $_GET['pto'] / $rate;
}
}

//price filters
if (($pfrom != '') && (is_numeric($pfrom))) {
$pfrom_check = " AND (IF(s.status = '1' AND p.products_id = s.products_id, s.specials_new_products_price, p.products_price) >= ".$pfrom.") ";
} else {
unset ($pfrom_check);
}

if (($pto != '') && (is_numeric($pto))) {
$pto_check = " AND (IF(s.status = '1' AND p.products_id = s.products_id, s.specials_new_products_price, p.products_price) <= ".$pto." ) ";
} else {
unset ($pto_check);
}

//build query
$select_str = "SELECT distinct
p.products_id,
p.products_price,
p.products_model,
p.products_quantity,
p.products_shippingtime,
p.products_fsk18,
p.products_image,
p.products_weight,
p.products_tax_class_id,
pd.products_name,
pd.products_short_description,
pd.products_description ";

$from_str = "FROM ".TABLE_PRODUCTS." AS p LEFT JOIN ".TABLE_PRODUCTS_DESCRIPTION." AS pd ON (p.products_id = pd.products_id) ";
$from_str .= $subcat_join;
if (SEARCH_IN_ATTR == 'true') { $from_str .= " LEFT OUTER JOIN ".TABLE_PRODUCTS_ATTRIBUTES." AS pa ON (p.products_id = pa.products_id) LEFT OUTER JOIN ".TABLE_PRODUCTS_OPTIONS_VALUES." AS pov ON (pa.options_values_id = pov.products_options_values_id) "; }
$from_str .= "LEFT OUTER JOIN ".TABLE_SPECIALS." AS s ON (p.products_id = s.products_id) AND s.status = '1'";

if ((DISPLAY_PRICE_WITH_TAX == 'true') && ((isset ($_GET['pfrom']) && xtc_not_null($_GET['pfrom'])) || (isset ($_GET['pto']) && xtc_not_null($_GET['pto'])))) {
if (!isset ($_SESSION['customer_country_id'])) {
$_SESSION['customer_country_id'] = STORE_COUNTRY;
$_SESSION['customer_zone_id'] = STORE_ZONE;
}
$from_str .= " LEFT OUTER JOIN ".TABLE_TAX_RATES." tr ON (p.products_tax_class_id = tr.tax_class_id) LEFT OUTER JOIN ".TABLE_ZONES_TO_GEO_ZONES." gz ON (tr.tax_zone_id = gz.geo_zone_id) ";
$tax_where = " AND (gz.zone_country_id IS NULL OR gz.zone_country_id = '0' OR gz.zone_country_id = '".(int) $_SESSION['customer_country_id']."') AND (gz.zone_id is null OR gz.zone_id = '0' OR gz.zone_id = '".(int) $_SESSION['customer_zone_id']."')";
} else {
unset ($tax_where);
}

//where-string
$where_str = " WHERE p.products_status = '1' "." AND pd.language_id = '".(int) $_SESSION['languages_id']."'".$subcat_where.$fsk_lock.$manu_check.$group_check.$tax_where.$pfrom_check.$pto_check;

//go for keywords... this is the main search process
if (isset ($_GET['keywords']) && xtc_not_null($_GET['keywords'])) {
if (xtc_parse_search_string(stripslashes($_GET['keywords']), $search_keywords)) {
$where_str .= " AND ( ";
for ($i = 0, $n = sizeof($search_keywords); $i < $n; $i ++) {
switch ($search_keywords[$i]) {
case '(' :
case ')' :
case 'and' :
case 'or' :
$where_str .= " ".$search_keywords[$i]." ";
break;
default :
$where_str .= " ( ";
$where_str .= "pd.products_keywords LIKE ('%".addslashes($search_keywords[$i])."%') ";
if (SEARCH_IN_DESC == 'true') {
$where_str .= "OR pd.products_description LIKE ('%".addslashes($search_keywords[$i])."%') ";
$where_str .= "OR pd.products_short_description LIKE ('%".addslashes($search_keywords[$i])."%') ";
}
$where_str .= "OR pd.products_name LIKE ('%".addslashes($search_keywords[$i])."%') ";
$where_str .= "OR p.products_model LIKE ('%".addslashes($search_keywords[$i])."%') ";
if (SEARCH_IN_ATTR == 'true') {
$where_str .= "OR (pov.products_options_values_name LIKE ('%".addslashes($search_keywords[$i])."%') ";
$where_str .= "AND pov.language_id = '".(int) $_SESSION['languages_id']."')";
}
$where_str .= " ) ";
break;
}
}
$where_str .= " ) GROUP BY p.products_id ORDER BY p.products_id ";
}
}
$_GET['keywords'] = str_replace("/", "[slash]", $_GET['keywords']);
//glue together
$listing_sql = $select_str.$from_str.$where_str;
require (DIR_WS_MODULES.FILENAME_PRODUCT_LISTING);
}
$smarty->assign('language', $_SESSION['language']);
$smarty->caching = 0;
if (!defined(RM))
$smarty->load_filter('output', 'note');
$smarty->display(CURRENT_TEMPLATE.'/index.html');
include ('includes/application_bottom.php');
?>[/PHP]

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
  • Create New...