Думаю, у вас мало проблем, но я пытаюсь решить их для вас. Во-первых, как сказано выше, вы используете код, который он уязвим для SQL-инъекции. Позаботьтесь об этом - вы можете использовать PDO, что так же просто, как расширение MySQL, и избавит вас от многих проблем (например, инъекции).
Но в код, позволяет пройти через него:
- Вы должны спросить DB, чтобы получить количество строк, а не с помощью функции MySQL, это гораздо более эффективно, так что используйте
SELECT count(*) FROM mytable
.
- Для
$pages
использования потолке(), как вы хотите, чтобы все строки должны быть напечатаны, если у вас есть $max
5 и иметь 11 строк, вокруг будет сделать $pages
2, где вы на самом деле хотите 3 (последняя страница содержит только, что последний 11-й ряд)
- в LIMIT вы хотите
LIMIT row_count OFFSET offset
. Вы можете рассчитать смещение от номера страницы, так: $max = row_count
, но $offset = ($max * $page) - $max
. В вашем коде, если $get
находится непосредственно на странице, это означает, что вы получите $ get'th строку (не уверен, хотя то, что происходит в вашем JS СледующаяСтраница. Голые в виду, что не все используют JavaScript.)
I подготовили простой пример здесь, который использует PDO, может быть, это дает вам представление о том, насколько просто он использует PDO.
выбирающих строки показывает пример того, как поставить параметры в SQL, это было бы совершенно безопасно в этом случае состоянии, 'SELECT * FROM pseudorows LIMIT '.$start.','.$max
от Я хотел сделать пример того, как легко (и затем безопасно):
// DB config
$DB_NAME = 'test';
$DB_USER = 'test';
$DB_PASSWD = 'test';
// make connection
try {
$DB_CONN = new PDO("mysql:host=localhost;dbname=".$DB_NAME, $DB_USER, $DB_PASSWD);
$DB_CONN->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die($e);
}
// lets say user param 'p' is page, we cast it int, just to be safe
$page = (int) (isset($_GET['p'])?$_GET['p']:1);
// max rows in page
$max = 20;
// first select count of all rows in the table
$stmt = $DB_CONN->prepare('SELECT count(*) FROM pseudorows');
$stmt->execute();
if($value = $stmt->fetch()) {
// now we know how many pages we must print in pagination
// it's $value/$max = pages
$pages = ceil($value[0]/$max);
// now let's print this page results, we are on $page page
// we start from position max_rows_in_page * page_we_are_in - max_rows_in_page
// (as first page is 1 not 0, and rows in DB start from 0 when LIMITing)
$start = ($page * $max) - $max;
$stmt = $DB_CONN->prepare('SELECT * FROM pseudorows LIMIT :start,:max');
$stmt->bindParam(':start',$start,PDO::PARAM_INT);
$stmt->bindParam(':max', $max,PDO::PARAM_INT);
$stmt->execute();
// simply just print rows
echo '<table>';
while($row = $stmt->fetch()) {
echo '<tr><td>#'.$row['id'].'</td><td>'.$row['title'].'</td></tr>';
}
echo '</table>';
// let's show pagination
for($i=1;$i<=$pages;$i++) {
echo '[ <a href="?p='.$i.'">'.$i.'</a> ]';
}
}
** Ваш код уязвим для SQL-инъекции. ** Вы * действительно * должны использовать подготовленные инструкции, в которые вы передаете переменные в качестве параметров, которые не оцениваются для SQL. Если вы не знаете, о чем я говорю, или как это исправить, прочитайте рассказ о [Bobby Tables] (http://bobby-tables.com). – eggyal
Кроме того, прекратите писать новый код с древним расширением MySQL: он больше не поддерживается, и сообщество начало процесс [устаревания] (http://news.php.net/php.internals/53799). Вместо этого вы должны использовать либо улучшенное расширение [MySQLi] (http://php.net/mysqli), либо уровень абстракции [PDO] (http://php.net/pdo). – eggyal
Непонятно, в чем вопрос. –