Jump to content
xt:Commerce Community Forum

Suchergebnis - welches php-Skript aufrufen


ihoppe

Recommended Posts

Hallo,

als "Nicht-XT-Shop-Experte" möchte ich ein php-Skript in den XT-Shop einfügen, bei dem eine spezielle Suche nach bestimmten Produkten aufgerufen wird.

Das Skript liefert mir als Ergebnis der Suche die products_id aus dem table products.

Kann mir jemand sagen, an welches Skript ich die Variable übergeben muss, damit meine Suchergebnisse im Shop, untereinander angezeigt werden?

Die Suchergebnisse stammen aus verschiedenen Kategorien. Muss ich die Datei shop_content.php abändern?

Vielen Dank für die Hilfe!!

Ines Hoppe

Link to comment
Share on other sites

Das kannst du folgendermaßen realisieren. Als Vorlage schau in

advanced_search.php

und

advanced_search_results.php

Kannst du kopieren, anpassen und einbasteln in den Shop.

advanced_search erzeugt ein Suchformular dessen Formulardaten an advanced_search_results übergeben werden.

advanced_search_results konstruiert aus den Formulardaten eine komplizierte SQL-Abfrage. Diesen Teil ersetzt du gegen deine Suchfunktion und generierst eine SQL-Abfrage welche exakt nur jene Artikel liefert die deine Suchfunktion ermittelt hat.

konkret

advanced search_results

Zeile 37

if (isset ($_GET['keywords']) && empty ($_GET['keywords'])) { 

bis Zeile 232

        //glue together 

schmeisst du komplett raus und ersetzt gegen deine Suchfunktion.

In Variable $listing_sql (global) setzt du die spezielle SQL-Abfrage die nur genau definierte Artikel liefert. Zwar so.

    $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) ";[/php]

Für $where_str nun ein where deiner Ergebnisliste (products_id's).

Du hast z.B. ein Array mit products_id's: $result_products_id_arr

$in = "'".implode("','", $result_products_id_arr)."'";

$where_str = " WHERE p.products_status = '1' "." AND pd.language_id = '".(int) $_SESSION['languages_id'];

$where.= "and p.products_id in ".$in;

Dann $listing_sql bilden

$listing_sql = $select_str.$from_str.$where_str;

Ab hier geht der Rest von allein und deine Artikelliste erscheint.

Hab das nicht auf Syntax überprüft. Aber im Prinzip gehts so.

mfg

Link to comment
Share on other sites

Hallo,

Ich habe jetzt das advanced_search_result.php an meine Suchabfrage angepasst. Ich habe nun doch nicht die product_id an das Skript übergeben, sondern die gesamt sql-Abfrage eingebettet.

Die SQL-Abfrage habe ich im PHPMyAdmin überprüft, sie ist soweit i.O.

Wenn ich mein Skript einfach auf dem Server laufen lasse, d.h. ohne dass es in den Shop eingebunden ist, läuft es auch o.k. (d.h. echo $select_str; wird korrekt angezeigt)

Nur mit der Darstellung im Shop klappt es nicht: Als Ausgabe bekomme ich den letzten Teil des php-Skriptes als Text und zwar ab der Stelle, wo das erste Relationszeichen > in der Select-Abfrage erscheint (= products_modelle_gewinde.A AND products ...).

Kann das Problem mit den Relationszeichen in der Select-Abfrage zu tun haben?

Vielen Dank für jede Hilfe im Voraus!!

I. Hoppe

Hier der Quelltext der content-Datei: Die Variable $Modell stammt aus dem Formular.

<?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_once ('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;




$Marke=$_POST["selKategorie"];
$Modell=$_POST["selItems"];



$select_str = "SELECT distinct
Unterabfrage.*,

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 (
SELECT products_gewinde.products_id
FROM products_gewinde, products_modelle_gewinde
WHERE products_modelle_gewinde.Modell = \"$Modell\"
AND products_gewinde.AA >= products_modelle_gewinde.A
AND products_gewinde.BB >= products_modelle_gewinde.B
AND products_gewinde.CC >= products_modelle_gewinde.C
AND products_gewinde.DD <= products_modelle_gewinde.D
) as Unterabfrage
INNER JOIN products AS p
ON Unterabfrage.products_id=p.products_id
LEFT JOIN products_description AS pd ON (p.products_id = pd.products_id)";



$listing_sql = $select_str;
echo $listing_sql;



//glue together
$listing_sql = $select_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

Ja, vielen Dank für den Hinweis, die SQL-Abfrage ist jetzt o.k., allerdings bleibt das Skript jetzt bei den smarty's hängen. Im Browser erscheint:

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'); ?>

Weil er sich anscheinend bei der $_SESSION['language'] aufhängt, habe ich in der sql-Abfrage die language noch mit eingearbeitet (aber als 2 definiert : WHERE p.products_status = '1' AND pd.language_id = '2' ) aber klappt auch nicht .

Wenn ich assign('language', $_SESSION['language']); ganz rausnehme, hängt er am nächsten smarty fest!?

Hast Du noch eine Idee?

Vielen Dank für die Hilfe.

Link to comment
Share on other sites

Ich weiß es auch nicht. Ich kenne den Code nicht und habe keine entspr. modifizierte DB. Alles was ich noch sagen kann ist spekulativ.

Du solltest jetzt anfangen systematisch zu debuggen.

echo und print_r

Lass dir Schritt für Schritt Zustände (Var-Werte) anzeigen und prüfe ob sie dem erwarteten entsprechen. Tausche die SQL Abfrage gegen was garantiert unverfängliches und schaue ob die gleiche Panne immer noch auftritt.

Durch simples ausprobieren grenzt du den Fehler anfangs grob ein und ziehst durch immer gezielteres Probieren und ausschließen von möglichen Ursachen die Grenzen immer enger. So tastest du dich an die fehlerhafte Stelle.

Nochn Tip. SQL Konstruktionen können durch Sonderzeichen durchsetzte Datenwerte sabotiert werden. Schau auf die Datenwerte (Modell). Und vergiss nicht SQL Injection.

mfg

Link to comment
Share on other sites

Danke für die Antwort. Ich versuche schon, dem Fehler auf die Spur zu kommen. In dem Skript ist ein echo $listing_sql drin, aber es wird nicht angezeigt.

Wenn ich dasselbe Skript OHNE das XT-Drumherum laufen lasse, funktioniert es ja. Das echo wird dann angezeigt und wenn ich diese echo select kopiere und in phpmyadmin als sql-query ausprobiere, bekomme ich die korrekten Produkte für die Suchanfrage mit den entsprechenden Feldern fürs listing ausgegeben.

... Ja und dann muss ich mich noch um die Formulardaten kümmern ...

Ich will nur das Ganze im Shop erst mal zum Laufen bringen.

<?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_once ('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;




$Marke=$_POST["selKategorie"];
$Modell=$_POST["selItems"];



$select_str = "SELECT distinct
Unterabfrage.*,

p.products_status,
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 (
SELECT products_gewinde.products_id, p.products_status, pd.language_id
FROM products_gewinde, products_modelle_gewinde, products AS p , products_description AS pd
WHERE p.products_status = '1' AND pd.language_id = '2'

AND products_modelle_gewinde.Modell = '$Modell'
AND products_gewinde.AA >= products_modelle_gewinde.A
AND products_gewinde.BB >= products_modelle_gewinde.B
AND products_gewinde.CC >= products_modelle_gewinde.C
AND products_gewinde.DD <= products_modelle_gewinde.D
) as Unterabfrage
INNER JOIN products AS p
ON Unterabfrage.products_id=p.products_id
LEFT JOIN products_description AS pd ON (p.products_id = pd.products_id)";


$listing_sql = $select_str;
echo $listing_sql;



//glue together
$listing_sql = $select_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

Spekulation:

Das Modul require (DIR_WS_MODULES.FILENAME_PRODUCT_LISTING);

parst die übergebene SQL-Anweisung in gewissem Maße und setzt es neu zusammen. Deine SQL-Anweisung ist ungewöhnlich tief verschachtelt.

Gehen wir davon aus, daß die Lib. damit nicht klar kommt: Dann müsstest du die Lib. umschreiben.

Ein anderer Weg ist. Du übergibst deine SQL-Anweisung direkt an die DB (xtc_db_query) , liest anschließend in einer Schleife alle product_ids aus und speicherst diese in ein Array. Jetzt hast du jenen Zustand den ich in meinem ersten Beitrag postulierte.

Mit diesem product_id Array konstruierst du eine neue (simple) SQL-Anweisung die du der Lib übergibst.

Probier mal das.

mfg

Link to comment
Share on other sites

Vielen Dank, dass Du mir immer weiter hilfst!!!! - wo ich doch immer kurz vorm verzweifeln bin.

Es ist fast geschafft!

Ich bekomme jetzt die ausgewählten Produkte angezeigt seit ich das PHP-Skript im CM nun als Anhang eingefügt habe und nicht wie vorher in das Textarea-Feld. Vom Inhalt her habe ich nichts verändert, nur das echo der select-Abfrage rausgenommen.

Allerdings gibt es nun ein neues Phänomen auf der Seite. Wenn die Ergebnisliste angezeigt wird, überlagern sich die Templates. Ich muss wahrscheinlich den aufgerufenen Frame ändern.

Grüße.

Link to comment
Share on other sites

Leider komme ich schon wieder nicht weiter:

Die Ergebnisse der Suche werden angezeigt, aber es liegen die templates übereinander.

Der header wird 2 mal aufgerufen, der div navi auch 2 mal, der div copyright wird 3 mal aufgerufen!? Was ist denn das nun wieder?

www.wandhalterung.tv/content/Teststartseite.html

Ich rufe das Skript über die url auf: <form action="http://www.wandhalterung.tv/content/Ergebnisliste.html" method="post">

Ich habe es mit und ohne verschiedene targets probiert, aber das Doppelbild verschwindet nicht!?

Und dann noch ein Fehler: die Überschrift (die im CM eingetragen ist) wird nicht angezeigt.

Adventsgrüße.

Link to comment
Share on other sites

Archived

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

×
  • Create New...