SQL грешка

teroristd

Registered
Здравейте, продължават проблемите с качването на сайта на хостинга. Текущият е свързан със страницирането ми. Грешката която ми дава е следната.

Код:
SQLSTATE[42000]: Syntax error or access violation: 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 '-6, 6' at line 1

Грешката идва там където подавам параметрите на страницирането.

PHP:
$this->_view->_image = $this->_paginationModel->pagination($this->_url, 'admin', 'offer', 6, '/SelectAdmin/run/1?select=order_date', null, null, 'order_date');
$this->_view->_pagination = $this->_pagination->navigation(2, '', $this->_url, 'admin', 'offer', 6, '/SelectAdmin/run/1?select=order_date', null, null, 'order_date');
 
По горния въпрос до някъде се оправих, обаче се появи още един проблем. Липсват параметрите от url-a в $_GET. Например имам /SelectAdmin/run/1?select=order_price_high и всичко след 1 го няма в $_GET. Някакви идеи на какво може да се дължи това?
 
Разясни малко кое от адреса какво е и как го взимаш. GET['select'] имаш ли?
 
И това го оправих. Беше от .htacces-a където го гласихме в началото. Сега се мъча с трети проблем по веригата на страницирането. Нещо не иска да премине на следваща страница. Може всичко да е свързано с първоначалната грешка в темата. Принципно за да проработи искаше параметъра per_page да го подам с минус -6. Не мога да разбера защо и дали това не чупи други неща. Също така заявките ми бяха от типа SELECT * FROM $table ORDER BY price DESC LIMIT $_limit, $_perPage и трябваше този $_perPage да го премахна за да работи.
 
Ами офсета ти според по-горната грешка в SQL е -6. Не трябва да е -6. Не знам как си го докарал да стане минус там.
 
Еми офсета трябва да е на 0, да можеш да изваждаш записите от ID 1.

PHP:
$perPage = 15;
$currentPage = 1;
$offset = ($currentPage * $perPage) - $perPage;

// SELECT ... FROM table ORDER BY ... LIMIT $offset, $perPage


П.П. Сега като разгледах, май бъркаш двете стойности на LIMIT клаузата. Когато имаш две стойности там, първата ти е офсета - т.е. от къде да започнат записите да се вадят, а втората ти е реално лимита, което трябва да ти е по колко записа да се извеждат.

Т.е. в твоя случай.

[sql]
LIMIT $perPage OFFSET $limit
-- е равно на
LIMIT $limit, $perPage
[/sql]
 
Ако те разбирам правилно трябва да добавя още един параметър към функцията който да е за offset?

Ето как е в момента.

PHP:
public function pagination($page, $database, $table, $per_page, $link, $category, $sub_category, $selectOrder)
    {
        $_page = $this->getPage($page, $link);

        $_total_records = $this->totalRecords($database, $table, $category, $sub_category, $selectOrder);

        $_per_page = $this->perPage($per_page);

        if ($_page > $_total_records)
        {
            $_page = $_total_records;
        }

        $_limit = ($_page - 1) * $_per_page;

        if ($category == null && $sub_category == null && $selectOrder == 'order_date')
        {
            $_sql = $this->_database->prepare("SELECT * FROM $table LIMIT $_limit, $_per_page")->execute()->fetchAllAssoc();
        }
        elseif ($category == null && $sub_category == null && $selectOrder == 'order_price_low')
        {
            $_sql = $this->_database->prepare("SELECT * FROM $table ORDER BY price ASC LIMIT $_limit, $_per_page")->execute()->fetchAllAssoc();
        }
}
 
teroristd каза:
Ако те разбирам правилно трябва да добавя още един параметър към функцията който да е за offset?

Ето как е в момента.

PHP:
public function pagination($page, $database, $table, $per_page, $link, $category, $sub_category, $selectOrder)
    {
        $_page = $this->getPage($page, $link);

        $_total_records = $this->totalRecords($database, $table, $category, $sub_category, $selectOrder);

        $_per_page = $this->perPage($per_page);

        if ($_page > $_total_records)
        {
            $_page = $_total_records;
        }

        $_limit = ($_page - 1) * $_per_page;

        if ($category == null && $sub_category == null && $selectOrder == 'order_date')
        {
            $_sql = $this->_database->prepare("SELECT * FROM $table LIMIT $_limit, $_per_page")->execute()->fetchAllAssoc();
        }
        elseif ($category == null && $sub_category == null && $selectOrder == 'order_price_low')
        {
            $_sql = $this->_database->prepare("SELECT * FROM $table ORDER BY price ASC LIMIT $_limit, $_per_page")->execute()->fetchAllAssoc();
        }
}

Не, $limit ти е офсета, просто е объркващо написано, защото там където е няма общо с лимит. Принципно трябва да работи, но без да се дебъгне няма как.

Не съм сигурен, че $_page трябва да ти взима $_total_records променливата. Ами ако имаш 90 записа, които трябва да се разпределят на 9 страници по 10. Нещо ми куца тази логика.
Дебъгни малко променливи вътре да видиш кое как се преобразува и какво точно се случва, защото УЖ кода е добре, освен частта с $_page = $_total_records.
 
Ее, терористе, тука ще се караме вече. От кога се занимаваш с програмиране, а не си дебъгвал код?

Дебъгваш код, когато нещо не работи като хората и искаш да установиш от къде идва проблема. Понеже PHP е малко сложен в това отношение, най-лесния вариант е да ползваш var_dump на определени места в кода, да установиш кое каква стойност приема, за да си сигурен, че работи, както трябва да работи.
Това е най-лесния вариант. Иначе се правят unit tests, които в момента са прекалено голяма лъжица за твоята уста и няма смисъл да се обяснявам за тях.

Просто, в случая, ако не си сигурен, че получаваш правилни стойности(за пример, някой променливи преминават през разни методи и т.н. и де факто не знаеш те какво връщат), просто ги бутни в един var_dump да видиш на гледно какво аджеба се получава там и защо примерно от 6 е станало -6.
 
Дава ми правилните стойности. Не е станало на -6 и не знам защо пише така в грешката.
 
Благодаря ти Revelation. Отново ме насочи към същината на проблема и в крайна сметка го оправих.
 
Радвам се, че съм успял да помогна. От къде идваше проблема, де факто?
 

Горе