Jump to content
xt:Commerce Community Forum

Banner Manager


gege

Recommended Posts

Hallo, liebe Leute,

bin so in den letzten Z?gen local und im Admin mal auf den Bannermanager (Vers. banner_manager.php,v 1.4 2004) gegangen und bekomme folgende Fehlermeldung:

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-20, 20' at line 1

select banners_id, banners_title, banners_image, banners_group, status, expires_date, expires_impressions, date_status_change, date_scheduled, date_added from banners order by banners_title, banners_group limit -20, 20

Da in der Datei selbst der Code mit dem select so nicht drinsteht (wie bei osc), wei? ich nicht, wo ich den Fehler anfangen soll, zu suchen.

Hab an dieser Datei bisher nichts gemacht....

Bin da f?r nen Tipp dankbar.

Link to comment
Share on other sites

Hab jetzt die Stelle gefunden, die diesen Fehler anscheinend hervorruft:

<?php

$banners_query_raw = "select banners_id, banners_title, banners_image, banners_group, status, expires_date, expires_impressions, date_status_change, date_scheduled, date_added from " . TABLE_BANNERS . " order by banners_title, banners_group";

$banners_split = new splitPageResults($_GET['page'], MAX_DISPLAY_SEARCH_RESULTS, $banners_query_raw, $banners_query_numrows);

$banners_query = xtc_db_query($banners_query_raw);

while ($banners = xtc_db_fetch_array($banners_query)) {

$info_query = xtc_db_query("select sum(banners_shown) as banners_shown, sum(banners_clicked) as banners_clicked from " . TABLE_BANNERS_HISTORY . " where banners_id = '" . $banners['banners_id'] . "'");

$info = xtc_db_fetch_array($info_query);

Aber was daran falsch sein k?nnte, wei? ich wirklich nicht, da ich nicht selbst coden kann....

Link to comment
Share on other sites

Kann das sein, dass diese function in admin/split_page_results.php

Schuld ist?

class splitPageResults {

function splitPageResults(&$current_page_number, $max_rows_per_page, &$sql_query, &$query_num_rows) {

if (empty($current_page_number)) $current_page_number = 1;

$pos_to = strlen($sql_query);

$pos_from = strpos($sql_query, ' from', 0);

$pos_group_by = strpos($sql_query, ' group by', $pos_from);

if (($pos_group_by < $pos_to) && ($pos_group_by != false)) $pos_to = $pos_group_by;

$pos_having = strpos($sql_query, ' having', $pos_from);

if (($pos_having < $pos_to) && ($pos_having != false)) $pos_to = $pos_having;

$pos_order_by = strpos($sql_query, ' order by', $pos_from);

if (($pos_order_by < $pos_to) && ($pos_order_by != false)) $pos_to = $pos_order_by;

$reviews_count_query = xtc_db_query("select count(*) as total " . substr($sql_query, $pos_from, ($pos_to - $pos_from)));

$reviews_count = xtc_db_fetch_array($reviews_count_query);

$query_num_rows = $reviews_count['total'];

$num_pages = ceil($query_num_rows / $max_rows_per_page);

if ($current_page_number > $num_pages) {

$current_page_number = $num_pages;

}

$offset = ($max_rows_per_page * ($current_page_number - 1));

$sql_query .= " limit " . $offset . ", " . $max_rows_per_page;

}

Link to comment
Share on other sites

Hallo, danke f?r den tipp,

hab die ?nderung gem Thread Thread

?ffne die Datei admin/includes/classes/split_page_results.php

In der ersten Funktion, im Konstruktor wird in ca. Zeile 43 das limit bestimmt.

$sql_query .= " limit " . $offset . ", " . $max_rows_per_page;

F?ge vor diese Zeile ein:

if($offset<0) $offset=0;

$sql_query .= " limit " . $offset . ", " . $max_rows_per_page;

Leider ?ndert sich bei mir nichts, ich hab die mysql-Version 4.1.8

Und NUUUUUU?????

Link to comment
Share on other sites

Im Moment scheint mir, k?nnte das Problem nur mit der Installation einer Mysql-Version 4.0.x behoben werden, da mein Provider eine Vers. 4.0.15 hat, sodass, wenn ichs richtig verstanden habe, erstmal keine Probleme auftreten w?rden.

Nur.....

was ist denn zu tun, wenn er aufr?stet?

Link to comment
Share on other sites

Nun, an MySQL, egal welche Version, liegt es _sicher_ nicht. Ein negativer 'limit' Wert ist nicht ok, und da kann MySQL nichts f?r, der wird tats?chlich von der Methode 'splitPageResults' der gleichnamigen Klasse in '/admin/includes/classes/split_page_results.php' zur?ckgegeben.

Der gepostete Workaraound:

if ($offset < 0) $offset=0;
funktioniert. Der Hund liegt allerdings schon vorher bergraben: $current_page_number wird vom aufrufenden Script (z.B. manufacturers.php) via $_GET['page'] ?bergeben. Bei einer leeren Liste und nur einer Seite ist $_GET['page'] leer, und damit auch $current_page_number. Unten wird dann $max_rows_page mit ($current_page_number -1) multipliziert. $current_page_number ist 'leer', also wird $max_rows_page mit (-1) multipliziert, was -20 und damit den negativen limit-Wert ergibt, den die Methode zur?ckliefert. Die Bedingung
if (empty($current_page_number)) $current_page_number = 1;

sollte dem eigentlich abhelfen, tut es aber nicht. Es k?nnte an der Referenzierung (&)liegen, aber nach nur einem Blick auf den Code kann ich das noch nicht mit Sicherheit sagen. Das ist in jedem Fall ein Bug, hat nichts mit SQL, der Serverkonfiguration oder ?hnlichem zu tun und w?re somit ein Fall f?r die Entwickler.

Der oben vorgestellte Workaround funktioniert, ist aber eben nur ein Workaround und keine saubere Sache.

Link to comment
Share on other sites

Ok, es ist ein Fehler in der Logik:

Wenn keine Seitennummer ?bergeben wird, wird $current_page_number auf 1 gesetzt. Es gibt also _immer_ eine Seite 1.

Weiter unten wird gepr?ft, ob $current_page_number gr??er ist, als $num_pages. $num_pages wird durch die Division von $query_num_rows durch $max_rows_per_page ermittelt. AHA.

Also, wenn die Tabelle (z.B. manufacturers) leer ist, hat $query_num_rows den Wert 0. somit ist $num_pages auch null.

$current_page_number ist also auf jeden Fall 1, w?hrend $num_pages auch 0 sein kann. ind dem Falls wird $current_page_number nun wieder auf 0 gesetzt, und es ergibt sich der Falsche Wert aus der folgenden $offset-Berechnung.

Die logische L?sung ist, nach

$num_pages = ceil($query_num_rows / $max_rows_per_page);
folgende Zeile hinzuzuf?gen:
if ($num_pages <= 0) $num_pages = 1;

Das ist auch nicht sch?ner oder eleganter als die oben vorgestellte L?sung mit der $offset-Korrektur, folgt aber der Logik, nachdem die Seitennummer nicht kleiner als 1 sein kann, was die Entwickler sich wohl so gedacht hatten.

lg

Link to comment
Share on other sites

  • 3 weeks later...

Archived

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

×
  • Create New...