Jump to content
xt:Commerce Community Forum

Artikelnummer größer 2147483647


tomquenten

Recommended Posts

Hallo,

ich habe seit einiger Zeit XT am laufen und teste es nun schon seit einigen Monaten ganz erfolgreich, da wir es unter anderem an unsere Warenwirtschaft angebunden haben.

Nun haben wir aber ein Problem mit der Länge der Artikelnummern. Diese ist in der Datenbank ja begrenzt auf (int(2147483647)), das haben wir schon geändert und stellt NICHT das Problem dar. Vielmehr macht uns bei diesen langen Artikelnummern das eigentlich System zu schaffen. Wir wissen möglicherweise auch schon woran es liegen könnte.

Im Admin Bereich erhalten wir sowie wir einen Artikel mit einer langen Artikelnummer (z.B. 3510110054) bearbeiten wollen folgende Fehlermeldung.

Warning: reset(): Passed variable is not an array or object in /srv/www/htdocs/web1/html/tlcc.shop/admin/includes/classes/object_info.php on line 22

Warning: Variable passed to each() is not an array or object in /srv/www/htdocs/web1/html/tlcc.shop/admin/includes/classes/object_info.php on line 23

Das liegt daran das die eigentlich Artikelnummer irgendwo mit (int) "gekürzt" wird. Nun haben wir uns schon auf die Suche gemacht, sind aber leider bisher nicht fündig geworden. Mit var_dump() wurde diese Vermutung auch bestätigt. Auch im Öffentlichen Bereich passiert dies. Klicke ich den Artikel mit der produktnummer 3510110054 an, gibt mir var_dump() die $products_id mit (int(2147483647)) aus.

Die Suche im Forum ergab, das wir in der Tabelle "products_model" dies ändern können, diese Tabelle gibt es aber bei uns nicht. Wir benutzen xt:Commerce v3.0.4 SP1.

Wäre sehr schön wenn uns jemand helfen kann, wo wir diesen Mißstand abändern können. Ich gehe mal davon aus, das seitens der Entwickler diese Beschränkung nicht gewollt ist.

Beste Grüsse

Link to comment
Share on other sites

Hallo!

Danke erst einmal an @buero-design! Genau das haben wir schon herausbekommen. Ich denke wir sind der Sache auch schon tiefer auf den Grund gekommen. Eventuell kannst auch da schon einen Vorschlag machen bzw. einen Tipp geben.

In der products_info.php wird die classe products.php aufgerufen. In genau dieser classe haben wir schon einiges ausprobiert. Jedoch hört nun auch unser technisches Verständnis auf. In dem Object $this steckt die $products_id bereits gekürzt drin. Nun wollten wir das ganze einfach rückwärts verfolgen, ABER wir kommen nicht dahinter wo das Object $this überhaupt herkommt, geschweige denn wo es seine Informationen erhält.

Es wäre sehr schön wenn uns hier irgendjemand noch einen weiteren Tipp geben kann.

Beste Grüsse

Link to comment
Share on other sites

Hallo,

mit $this greifst du in der product.php auf die eigene classe product!

und die classe wird in der application_top.php etwa zeile 400 erstellt:


require (DIR_WS_CLASSES.'product.php');
// new p URLS
if (isset ($_GET['info'])) {
$site = explode('_', $_GET['info']);
$pID = $site[0];
$actual_products_id = (int) str_replace('p', '', $pID);
$product = new product($actual_products_id);
} // also check for old 3.0.3 URLS
elseif (isset($_GET['products_id'])) {
$actual_products_id = (int) $_GET['products_id'];
$product = new product($actual_products_id);

}
if (!is_object($product)) {
$product = new product();
}
[/PHP]

und da ist das (int) drin wie ich sehe ;)

aber warum verwendet ihr den nicht das product_model als Artikelnummer? so ist es doch im Admin-Bereich vorgesehen!!!

Gruß

Steffen

Link to comment
Share on other sites

DANKE @techway!!!!

Das scheint es auf den ersten Blick tatsächlich zu sein! Erster kleiner Test ist erfolgreich!

elseif (isset($_GET['products_id'])) {
$actual_products_id = (int) $_GET['products_id'];
$product = new product($actual_products_id);[/PHP]

hier haben wir erst einmal (int) $_GET['products_id']; durch (float) $_GET['products_id']; ersetzt, mit var_dump kommt jetzt tatsächlich die volle Artikelnummer! Dadurch ist die Integrität der übergebenen Daten gewährleistet bei gleichzeitiger LANGER Artikelnummer.

Zu Deiner Frage. Wir haben bisher alles darauf abgestimmt immer auf die $products_id zuzugreifen, wie schon eingehend beschrieben haben wir uns einen Connector geschrieben, mit dem wir einfach per Mausklick die Daten in den Shop transferieren.....per ODBC Verbindung. Das jetzt alles wieder zu ändern währe ein heiden Aufwand. Ich denke mit (float) statt (int) kann man doch leben oder nicht?

[b]Vielen, vielen Dank an Dich! Du bist SPITZE![/b]

Beste Grüsse

Link to comment
Share on other sites

  • 2 weeks later...

Soooo, nachdem wir nun so ziemlich alles ausprobiert und getestet haben gibt es nun doch noch ein Problem. Da wir hier an dieser Stelle auch mal eine Liste posten wollen, wo die ganzen Veränderungen dokumentiert sind und diese auch vollständig sein sollte sind wir nun gehalten dieses eine Problem auch noch in den Griff zu bekommen.

Konkret geht es um folgendes....

- Artikel mit "kleiner Artikelnummer" kann ohne Problem in den Warenkorb gelegt werdem

- Artikel mit "großer Artikelnummer" (also größer 2147483647) kann in Verbindung mit einer Option auch in den Warenkorb gelegt werden

- Artikel mit "großer Artikelnummer" (also größer 2147483647) kann OHNE Option NICHT in den Warenkorb gelegt werden

Selbstverständlich haben wir hier auch schon experimentiert um die Ursache einzukreisen. Wir haben ein weiteren XT Shop aufgesetzt um zu testen ob es möglicherweise an unseren eigenen Modifikation liegt. Jedoch können wir genau dies ausschließen, auch in dem Original XT Shop (also frisch aufgesetzt) ist eine Zugabe eines Artikel mit einer "großen Artikelnummer" OHNE Option nicht möglich. Verschiedene var_dump Ausgaben haben uns hier leider auch nicht weitergebracht. Die Artikelnummer wird nirgends mehr (soweit wir das jetzt verfolgen konnten) "gekürzt". Daran kann es nach unserer Auffassung also nicht mehr liegen. Es muss was mit den Optionen zu tun haben. Wir haben uns dazu auch schon folgende Dateien angesehen....

- shopping_cart.php

- cart_actions.php

- order_details.php

- default.php

In all den Dateien können wir nichts finden, und auch die var_dump Ausgaben ließen keine Rückschlüsse zu WO die Ursache für das Problem liegt. Es wäre schön wenn man uns hier noch einen Hinweis geben kann, was genau passiert in dem PHP Code, wenn ich auf den Button "kaufen" clicke.

Unserer Meinung wird in der cart_actions.php folgender Code aufgerufen

		case 'add_product' :
if (isset ($_POST['products_id']) && is_numeric($_POST['products_id'])) {
if ($_POST['products_qty'] > MAX_PRODUCTS_QTY)
$_POST['products_qty'] = MAX_PRODUCTS_QTY;
$_SESSION['cart']->add_cart((float) $_POST['products_id'], $_SESSION['cart']->get_quantity(xtc_get_uprid($_POST['products_id'], $_POST['id'])) + xtc_remove_non_numeric($_POST['products_qty']), $_POST['id']);
//echo $_POST['products_id']."<br>";
//echo var_dump($_SESSION)."<br>";
}
xtc_redirect(xtc_href_link($goto, 'products_id='.(float) $_POST['products_id'].'&'.xtc_get_all_get_params($parameters)));
break;[/PHP]

Leider können wir in dem Code aber auch nichts finden was die Ursache darstellen könnte. Es wäre schön wenn uns hier jemand einen Tipp geben kann, manchmal sieht man ja den Wald vor lauter Bäumen nicht mehr....

Vielen Dank

Link to comment
Share on other sites

Wir sind noch ein Stück weiter gekommen. Dieser Code hier scheint die Ursache zu sein, bzw. der Verweis auf das Object contents. Artikel die in den Warenkorb gelegt werden verzweigen in die Ausgabe nein, artikel die nicht in den warenkorb gelegt werden können verzweigen in die Ausgabe ja.

Unsere Frage an alle.....

- wo finden wir das Object contents

- welche funktion hat das objeckt

	function in_cart($products_id) {
if (isset ($this->contents[$products_id])) {
echo "ja";
return true;
} else {
echo "nein";
return false;
}
}[/PHP]

Beste Grüsse

Link to comment
Share on other sites

hi,

contents ist ein array mit den produkten die im warenkorb drin sind!

mach doch am besten dies hier:


echo "<pre>";

print_r($_SESSION);

echo "</pre>";

d.h. es muss schon beim hinzufügen ein fehler vorkommen, hast du den case 'buy_now' : überprüft (in cart_actions.php)

Gruß

Link to comment
Share on other sites

so, also wir haben noch einiges in erfahrung bringen können. artikel mit einer product_id bis 2147483647 werden ohne probleme von xt angenommen. ab products_id 2147483648 gibt es sorgen. es MUSS also was mit der (int) Geschichte zu tun haben.

darüber hinaus haben wir mit

print_r($_SESSION);[/PHP]

noch ein paar zusätzliche informationen ergattern können. "normale artikel werdenja in den warenkorb gelegt. das ist in der array ausgabe dann auch sehr schön zu sehen. artikel mit einer products_id größer 2147483647 werden zwar in das array gelegt aber IMMER mit einem - davor.

[PHP] [contents] => Array
(
[30429] => Array
(
[qty] => 1
)

[-2147483648] => Array
(
[qty] => 1
)

[-2147483648] => Array
(
[qty] => 1
)

[2147483647] => Array
(
[qty] => 1
)

)[/PHP]

unserer meinung nach liegt der hase in diesem code begraben

[PHP]$_SESSION['cart']->add_cart((float) $_POST['products_id'], $_SESSION['cart']->get_quantity(xtc_get_uprid($_POST['products_id'], $_POST['id'])) + xtc_remove_non_numeric($_POST['products_qty']), $_POST['id']);[/PHP]

daher müssen wir noch einmal nachfragen....

- wo wird das object add_cart gebildet

- wo das object get_quantity und welche funktion hat es überhaupt (es muss, so wie wir das bis jetzt nachvollziehen können was mit dem "zerteilen eines strings zu tun haben z.b. 15482{1}1542 für artikel 15482 mit der option 1 und dem wert 1542)

uns wäre mit der information geholfen wo das object add_cart gebildet wird. das konnten wir bis jetzt nicht nachvollziehen.

@tutsn

Zu Deiner Frage. Wir haben bisher alles darauf abgestimmt immer auf die $products_id zuzugreifen, wie schon eingehend beschrieben haben wir uns einen Connector geschrieben, mit dem wir einfach per Mausklick die Daten in den Shop transferieren.....per ODBC Verbindung. Das jetzt alles wieder zu ändern währe ein heiden Aufwand.

Danke an alle die uns helfen wollen....

Link to comment
Share on other sites

ICH HABS!

Das Problem lilegt in der shopping_cart.php. Das Object contents verursacht das problem. artikel größer 2147483647 kann das Object bzw. Array nicht aufnehmen. Warum? Ich habe keine Ahnung, NOCH NICHT! Vieleicht gibt es ja jemanden der von Arrays noch mehr Ahnung bzw. Erfahrung hat wie ich. Ich würde mich freuen, denn das Problem WILL ich gelöst haben.

	function update_quantity($products_id, $quantity = '', $attributes = '') {
if (empty ($quantity))
return true; // nothing needs to be updated if theres no quantity, so we return true..
$this->contents[$products_id] = array ('qty' => $quantity);
// update database
if (isset ($_SESSION['customer_id']))
xtc_db_query("update ".TABLE_CUSTOMERS_BASKET." set customers_basket_quantity = '".$quantity."' where customers_id = '".$_SESSION['customer_id']."' and products_id = '".$products_id."'");

if (is_array($attributes)) {
reset($attributes);
while (list ($option, $value) = each($attributes)) {
$this->contents[$products_id]['attributes'][$option] = $value;
// update database
if (isset ($_SESSION['customer_id']))
xtc_db_query("update ".TABLE_CUSTOMERS_BASKET_ATTRIBUTES." set products_options_value_id = '".$value."' where customers_id = '".$_SESSION['customer_id']."' and products_id = '".$products_id."' and products_options_id = '".$option."'");
}
}
}[/PHP]

Der untere Teil der Funktion läuft ohne Probleme, also wenn ein Attribut gewählt wurde geht es. Interessant sein dürfte exakt dieser Code ...

[PHP]$this->contents[$products_id] = array ('qty' => $quantity);[/PHP]

Eine Ausgabe VOR dem o.g. Code der Variablen $products_id sowie $quantity enthält die richtigen Werte, das Object bzw Array $this->contents danach aber nicht! Kann mir das irgendjemand erklären? Kann man Arrays auch auf Werte bzw. Wertebereiche beschränken???????

Gruss

Link to comment
Share on other sites

ich bin mir nun nicht sicher, aber ich glaub schon dass es am array liegt,

array( [schlüssel =>] Wert

, ...

)

// Schlüssel kann ein Integer oder String sein

// Wert kann irgendetwas sein

der Schlüssel ist ja in deinem Fall $products_id und dieser darf eben entweder Integer oder String sein!

Link to comment
Share on other sites

Die Größe einer Integer ist systemabhängig, aber bei ca. 2 Milliarden sollte Schluss ein.

Ihr müsst entweder die products_id als String behandeln oder eben doch auf products_model umstellen und die products_id dabei belassen, wozu sie eigentlich da ist. In beiden Fällen habt ihr auf jeden Fall noch Arbeit vor euch. Die products_id als String zu behandeln dürfte jedenfalls etliche weitere Folgeprobleme mit sich bringen. Bevor ihr jetzt den halben Shopkern anpasst und das Datenmodell auf den Kopf stellt, überarbeitet doch lieber eure Exportroutine, da wisst ihr doch wenigstens genau wie sie funktioniert...

Link to comment
Share on other sites

DANKE EUCH BEIDEN!

Da waren ein paar Gedankenanstöße dabei....

Folgende Überlegung.....nachdem ich jetzt in php-resource gelesen habe, muss ich feststellen das @tutsn Recht hat! ABER ;) wenn ich einen Artikel mit Option in den Warenkorb lege dann funktioniert das ja ganz gut denn der string in diesem Falle ist, wenn man ihm mit var_dump aufruft, 3536784515{1}1542. Ergo müssen strings ja doch irgendwie aktzeptiert werden können.

Ich habe jetzt einfach folgendes hinzugefügt/geändert.....

			//wandelt den integer in einen string um
$products_id = strval($products_id);

$this->contents[$products_id] = array ('qty' => $quantity);
[/PHP]

....und, es läuft. Ist der erste Artikel zwar schon einer mit "großer Artikelnummer" dann nimmt er den zwar nicht aber danach funktioniert es. Selbst das Problem werde ich noch in den Griff bekommen....! :rolleyes:

[b]Schönes Wochenende!!![/b]

Liebe Grüsse

Link to comment
Share on other sites

muss ich feststellen das @tutsn Recht hat! ABER ;) wenn ich einen Artikel mit Option in den Warenkorb lege dann funktioniert das ja ganz gut denn der string in diesem Falle ist, wenn man ihm mit var_dump aufruft, 3536784515{1}1542. Ergo müssen strings ja doch irgendwie aktzeptiert werden können.

Klar wird in der Session und in der Datenbank der Warenkorb mit allen Varianten als String abgelegt, aber der wird auch wieder zerlegt und aus der products_id wird wieder eine INT.

....und, es läuft. Ist der erste Artikel zwar schon einer mit "großer Artikelnummer" dann nimmt er den zwar nicht aber danach funktioniert es. Selbst das Problem werde ich noch in den Griff bekommen....! :rolleyes:

Glaub mir, da werden noch weitere Probleme kommen. Die Bestellabwicklung, der Adminbereich etc... Schnell hast du mehr Zeit mit Anpassungen an XTC investiert, als eine Anpassung eurer Schnittstelle benötigt hätte, vermute ich jetzt mal aus eigener Erfahrung.

Link to comment
Share on other sites

Archived

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

×
  • Create New...