2016-03-04 2 views
0

я загружаю элементы с Ajax, и я использую смещенномLIMIT с использованием ошибки смещения

JS:

var offset = 0; 

$(".load-more").click(function() { 
    offset+=5; 
    $(this).addClass("spin"); 
    $.ajax({ 
     url: '/api/fetchitems.php?offset='+offset+'&sort='+sort, 
     success: function(data){ 
     $(".load-more").before(data); 
     } 
    }); 
}); 

PHP/SQL:

$offset = intval($_GET["offset"]); 

$stmt = $db->prepare(
"SELECT s.id,s.date,s.title,s.views,s.image,s.hidpi,s.width,s.description,u.display_name,u.avatar, s.hotness 
    FROM showcase AS s 
    INNER JOIN users AS u ON s.user_id = u.id 
    UNION ALL 
    SELECT q.id,q.date,q.title,q.views,0,0,0,q.text,u.display_name,u.avatar, q.hotness 
    FROM questions AS q 
    INNER JOIN users AS u ON q.user_id = u.id 
    ORDER BY hotness DESC 
    LIMIT :skip, 5 
    "); 
$stmt->bindParam(":skip",$offset); 
$stmt->execute(); 
$items = $stmt->fetchAll(); 
$stmt = null; 

Я получаю эту ошибку при исполнении:

Fatal error: Uncaught exception 'PDOException' with message '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 ''5', 5' at line 9' in **** Stack trace: #0 **** PDOStatement->execute() #1 {main} thrown in

Когда я запускаю SQL в phpMyAdmin, он отлично работает.

+0

Вы можете попробовать '$ stmt-> bindParam (": пропустить", intval ($ офсет))'? –

+1

проверить этот URL-адрес http://stackoverflow.com/questions/15853266/pdo-bindparam-not-allowing-statement-to-return-results надеюсь, что он поможет вам – jilesh

+0

поставить запрос «SELECT s.id .. в переменную $ query и echo $ query; exit; Затем в случае успеха функция ajax предупреждает об этом или связывает ее в div. копирует этот запрос и выполняет в mysql, чтобы узнать, что не так в этом запросе. Это поможет вам исправить вашу ошибку без каких-либо help – rahul

ответ

4

Ваш :skip получает завернуты в кавычки, как будто это строка (так как значение по умолчанию PDO::PARAM_STR), что неправильно, теперь вы получите:

LIMIT '5',5; 

Согласно documentation, вы можете изменить тип в целое :

$stmt->bindParam(":skip",$offset, PDO::PARAM_INT); 

Причина, по которой это работает в вашем PhpMyAdmin, заключается в том, что вы не добавляете одинарные кавычки.

+1

в соответствии с документами 'PDO :: PARAM_STR' по умолчанию –

+0

Спасибо. Добавил это к моему ответу. – Martijn

+0

Почему downvote? – Martijn

0
$stmt = $db->prepare(
"SELECT s.id,s.date,s.title,s.views,s.image,s.hidpi,s.width,s.description,u.display_name,u.avatar, s.hotness 
    FROM showcase AS s 
    INNER JOIN users AS u ON s.user_id = u.id 
    UNION ALL 
    SELECT q.id,q.date,q.title,q.views,0,0,0,q.text,u.display_name,u.avatar, q.hotness 
    FROM questions AS q 
    INNER JOIN users AS u ON q.user_id = u.id 
    ORDER BY hotness DESC 
    LIMIT :skip, 5 
    "); 

$stmt->bindParam(':skip', $offset, PDO::PARAM_INT); 

Вы хотите сделать таким образом

+0

Привет, потому что вы новичок, я не собираюсь ниспровергать, но: Этот ответ не добавлен значение. Лучше объяснить, почему: «Я хочу сделать это таким образом», чтобы люди могли исправить подобную ситуацию. Кроме того, есть еще один ответ, который уже объясняет проблему, ваш ответ не дает больше информации или альтернативное решение – Martijn

Смежные вопросы