Zurück   xt:Commerce Webshop Shop Support > xt:Commerce Shopsoftware Community Area > PHP & MysQL Forum

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 01.12.2008, 12:20
Benutzer
 
Registriert seit: 21.11.2008
Beiträge: 56
Standard Suchergebnis - welches php-Skript aufrufen

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
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #2 (permalink)  
Alt 01.12.2008, 14:00
Erfahrener Benutzer
 
Registriert seit: 08.03.2005
Ort: Mußtopp
Beiträge: 638
Standard

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
PHP-Code:
if (isset ($_GET['keywords']) && empty ($_GET['keywords'])) { 
bis Zeile 232
PHP-Code:
        //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.

PHP-Code:
    $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) "
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
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #3 (permalink)  
Alt 01.12.2008, 16:20
Benutzer
 
Registriert seit: 21.11.2008
Beiträge: 56
Standard

Tausend Dank für die umfassende Antwort!!!! Dann werde ich mich jetzt an die Arbeit machen.
MfG aus Berlin
Ines Hoppe
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #4 (permalink)  
Alt 04.12.2008, 20:55
Benutzer
 
Registriert seit: 21.11.2008
Beiträge: 56
Standard Nochmals zum Thema Ausgabe Suchergebnisse

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-Code:
<?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');
?>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #5 (permalink)  
Alt 04.12.2008, 22:46
Erfahrener Benutzer
 
Registriert seit: 08.03.2005
Ort: Mußtopp
Beiträge: 638
Standard

Schwer nachzuvollziehen. Könnte mit Stringbegrenzern zu tun haben. Eins fiel mir auf. Benutze in der SQL-Abfrage mal einfache Anführungszeichen.

Ersetze
\"$Modell\"

Gegen
'$Modell'

mfg
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #6 (permalink)  
Alt 05.12.2008, 10:17
Benutzer
 
Registriert seit: 21.11.2008
Beiträge: 56
Standard

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.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #7 (permalink)  
Alt 05.12.2008, 10:42
Erfahrener Benutzer
 
Registriert seit: 08.03.2005
Ort: Mußtopp
Beiträge: 638
Standard

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
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #8 (permalink)  
Alt 05.12.2008, 12:33
Benutzer
 
Registriert seit: 21.11.2008
Beiträge: 56
Standard

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-Code:
<?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');
?>
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #9 (permalink)  
Alt 05.12.2008, 15:00
Erfahrener Benutzer
 
Registriert seit: 08.03.2005
Ort: Mußtopp
Beiträge: 638
Standard

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
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
  #10 (permalink)  
Alt 05.12.2008, 22:40
Benutzer
 
Registriert seit: 21.11.2008
Beiträge: 56
Standard

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.

Geändert von ihoppe (06.12.2008 um 09:53 Uhr)
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!Wong this Post!
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
aufrufen, phpskript, suchergebnis

Themen-Optionen
Ansicht

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 aus
Pingbacks are aus
Refbacks are aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Installationsprobleme Apache/winxp wini2 Installation und Konfiguration 18 28.10.2008 12:57


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.

Copyright © 2011 xt:Commerce GmbH / xt:Commerce International Ltd. - All Rights Reserved

xt:Commerce is a SafeCharge brand