allstarmusic Posted January 5, 2007 Report Share Posted January 5, 2007 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 More sharing options...
cytrade Posted April 2, 2007 Report Share Posted April 2, 2007 Hallo, ich habe das selbe Problem bei meiner Suche. Hast du schon eine Lösung? Gruß Link to comment Share on other sites More sharing options...
Guest tuvalu Posted April 2, 2007 Report Share Posted April 2, 2007 Jep, ist bei mir auch. tuvalu Link to comment Share on other sites More sharing options...
John Steed Posted April 2, 2007 Report Share Posted April 2, 2007 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 More sharing options...
cytrade Posted April 2, 2007 Report Share Posted April 2, 2007 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 More sharing options...
pixeleyes Posted April 2, 2007 Report Share Posted April 2, 2007 schau mal in diie adavanced_search_result.php über /* * search process starts here */ das einbinden: $_GET['keywords'] = str_replace("/", "", $_GET['keywords']); Link to comment Share on other sites More sharing options...
Guest tuvalu Posted April 2, 2007 Report Share Posted April 2, 2007 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 More sharing options...
cytrade Posted April 3, 2007 Report Share Posted April 3, 2007 Als Suchausgabe kommt dann kein Ergebnis gefunden wurde, wenn man c/d sucht. Das kann es aber auch nicht sein. Geht es denn nicht anders? Link to comment Share on other sites More sharing options...
John Steed Posted April 3, 2007 Report Share Posted April 3, 2007 @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 More sharing options...
Guest tuvalu Posted April 3, 2007 Report Share Posted April 3, 2007 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 More sharing options...
John Steed Posted April 3, 2007 Report Share Posted April 3, 2007 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 More sharing options...
cytrade Posted April 4, 2007 Report Share Posted April 4, 2007 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 More sharing options...
Guest tuvalu Posted April 4, 2007 Report Share Posted April 4, 2007 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 More sharing options...
tbmarcom Posted April 8, 2007 Report Share Posted April 8, 2007 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 <?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 More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.