2015-04-16 2 views
-1

Я работаю над разбиением на страницы, используя pdo, но я не могу пройти мимо этой части. я посмотрел другие сообщения и учебные пособия, но я ударил стену, может ли кто-нибудь помочь? ** Редактировать полный код добавлен, было добавлены обновления, но все еще есть ошибкиPDO Pagination Error

<?php 
try{ 
    $handler = new PDO('mysql:host=127.0.0.1;dbname=clients','root',''); 
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e){ 
    echo $e->getMessage(); 
    die(); 
} 


?> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" href="mystyle.css"> 
</head> 


<body bgcolor="#F5F1DE"> 

<div class="center"> 
    <br> 
    <br> 
    <br> 
    <br> 
     <br> 
    <h2> Business Listings</h2> 


<table border="1" style="width:50%"> 
    <tr> 
<?php 
$per_page = 10; 
$NoofRecords = $handler->query('SELECT COUNT(CompID) FROM Listings;'); 
$pages = ceil($NoofRecords/$per_page); 

if(!isset($_GET['page'])){ 
    header(":location: Listings.php?page=1"); 
} 
else{ 
    $page =$_GET['page']; 
} 

$start = (($page - 1)*$per_page); 
echo "SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT     $start,$per_page;"; 
$query = $handler->query("SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;"); 
while($r = $query->fetch()) { 
    echo '<td>', $r['Name'], '</td>','<td>', $r['Email'], '</td>','<td>',   $r['Phone'], '</td>', 
'<td>','<a href="' . $r['Name'] . '.php">Company page</a>', '</td>'; 
echo '</tr>'; 
} 

for($number=1;$number<=$pages;$number++) 
{ 
    echo '<a href="?page'.$number.'">.$number. </a>'; 
} 
echo"<BR>Current Page: $page" 
?> 

</table> 
    </Div> 
</div> 


</div> 
</body> 
</html> 
+0

Какие проблемы вы с этой частью? –

+0

на строке 34 его не нравится синтаксис для ceil также в строке 43, он жалуется на undefined varrible adn, тогда это «Fatal error: Uncaught exception» PDOException »с сообщением« SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1327 Undeclared переменная: $ start 'in C: \ wamp \ www \ Myserver \ Listings.php в строке 45 (!) PDOException: SQLSTATE [42000]: Синтаксическая ошибка или нарушение доступа: 1327 Необъявленная переменная: $ start in C: \ wamp \ www \ Myserver \ Listings.php в строке 45 " – user3676186

+0

положите блок catch try вокруг вашего кода pdo. var_dump исключение, и вы увидите, что происходит не так. – akr

ответ

0

Предел идет последним в вашем запрос.

SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page ; 

https://dev.mysql.com/doc/refman/5.0/en/select.html

Вы также должны использовать двойные кавычки, как кристалл указывал на PHP для обработки переменных. Вы должны использовать подготовленные инструкции, хотя это доступно для инъекций, How can I prevent SQL injection in PHP?.

Обновлено, без подготовленных заявлений, которые вы все равно должны использовать ..

<?php 
try{ 
    $handler = new PDO('mysql:host=127.0.0.1;dbname=clients','root',''); 
    $handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e){ 
    echo $e->getMessage(); 
    die(); 
} 
$per_page = 10; 
$NoofRecords = $handler->query('SELECT COUNT(CompID) as counted FROM Listings;'); 
$fetchdata = $NoofRecords->fetch(); 
$recordcount = $fetchdata['counted']; 
$pages = ceil($recordcount/$per_page); 
if(empty($_GET['page'])){ 
    //this is a waste if this page is listings.php, just set $page to 1; 
    header("Location: Listings.php?page=1"); 
} else{ 
    $page = $_GET['page']; 
} 
$start = (($page - 1)*$per_page); 
echo "SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;"; 
$query = $handler->query("SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;"); 
while($r = $query->fetch()) { 
    $table_contents = '<tr><td>' . $r['Name'] . '</td><td>' . $r['Email'] . '</td><td>'. $r['Phone'] . '</td><td><a href="' . $r['Name'] . '.php">Company page</a></td></tr>'; 
} 
?> 
<html> 
<head> 
<link rel="stylesheet" type="text/css" href="mystyle.css"> 
</head> 
<body bgcolor="#F5F1DE"> 
<div class="center"> 
    <br> 
    <br> 
    <br> 
    <br> 
    <br> 
    <h2> Business Listings</h2> 
    <table border="1" style="width:50%"> 
     <?php echo $table_contents; ?> 
    </table> 
    <?php 
    for($number=1;$number<=$pages;$number++) { 
     echo '<a href="?page'.$number.'">'.$number. '</a>'; 
    } 
    echo "<BR>Current Page: $page"; ?> 

</div> 
</div><!-- I dont know what these 2 divs are for... --> 
</div> 
</body> 
</html> 
+0

Спасибо, что это сработало, но там как ошибка, скрытая в фоновом режиме за содержимым страницы – user3676186

+0

Что ошибка? Убедитесь, что вы удалили 'echo 'SELECT * FROM listings WHERE Accept = 1 ORDER BY Premium LIMIT $ start, $ per_page;"; '. Вывод контента - хороший способ диагностики и устранения ошибок в будущем. – chris85

+0

Он возвратил ошибку «Объект класса PDOStatement не может быть преобразован в int в C: \ wamp \ www \ Myserver \ Listings.php в строке 11" – user3676186

1

Используйте двойные кавычки " вместо одинарных кавычек ' при использовании переменных в строке:

"SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page;" 
+0

Это не сработало, такая же ошибка. – user3676186

+0

Исправлена ​​инструкция SQL. Надеюсь, это поможет! –

+0

Измененный запрос все еще получает erros, «Объект класса PDOStatement не может быть преобразован в строку int 34» и Undefined variable line 43 – user3676186

0

изменить ваш запрос линии к этому: синтаксис запроса был не прав.

$query = $handler->query("SELECT * FROM listings WHERE Accept=1 ORDER BY Premium LIMIT $start,$per_page"); 
0

Помимо SQL проблем, упомянутых в других ответах (LIMIT в конце концов, двойные кавычки, так что вы можете использовать переменные в строке), вы уже ранее проблемы:

$pages = ceil(($NoofRecords,0)/$per_page); 
       ^^^^^^^^^^^^^^^^ What is supposed to happen here? 

Элемент ,0 делает все заявление недействительным.

Вам просто нужно:

$pages = ceil($NoofRecords/$per_page);