Search code examples
phpsqlpdopaginationlimit

php Limit query pdo with button next


whats the wrong in my code .. i try to click next button to display the next record in database .. but when i clicked nothing happen.

this is my function to fetch record

public function getBooks()
{
     $limit = 1;
     $start=0;

    //SELECT loginUser.username, Library.nameOfBook FROM loginUser JOIN userBook JOIN Library ON userBook.user_id = loginUser.id AND userBook.book_id = Library.id WHERE loginUser.username="loay";
    $query = "SELECT Library.nameOfBook FROM loginUser JOIN userBook JOIN Library ON userBook.user_id = loginUser.id AND userBook.book_id = Library.id WHERE loginUser.username=:username LIMIT $start, $limit";
    $statment = $this->db->prepare($query);
    $statment->execute([
        ':username' => $this->username
        //,':start' => $start, ':limit' => $limit
    ]);
    $result = $statment->fetchAll();

   echo "<table border='1'>
    <tr>
    <th>Books</th>
    </tr>";
    foreach($result as $row){
        echo "<tr>";
        echo "<td>" . $row['nameOfBook'] . "</td>";
        echo "</tr>";
    }
    echo "</table>";

}

And this is my code in index.php

  $object->getBooks();

  if( isset($_POST['next'])){
    $start +=1;
}

and this is my form code

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  Name: <input type="text" name="user" value="<?php echo $user;?>">
  <span class="error">* <?php echo $nameErr;?></span>
  <br><br>
  password: <input type="password" name="pass" value="<?php echo $password;?>" >
  <span class="error">* <?php echo $passwordErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Login">
  <br><br>

 
  <button type="button" name="button" onclick="window.location.href='/ooRigester.php'">SignUp</button>
  <br><br>
  <input type='submit' name='next' value='next' method="post"><br>
</form>

this code after form

<?php
include_once('User.php');

if(isset($_POST['submit'])){

$username = $_POST["user"];
$password = $_POST["pass"];

$object = new User();
$object->username= $username;
$object->Password=$password;
if( $object->isAuthenticated() ){

  echo "User Verified . <br><br>";
  $object->getBooks();

  if( isset($_POST['next'])){
    $start +=1;
    $object->getBooks($start); 
}

}

else{

  echo "Wrong User Name Or Password . <br>";
}}


?>

and this before form

<!DOCTYPE HTML>
<html>
<head>
<style>
.error {color: #FF0000;}
</style>
<title>Login Form</title>
</head>
<body>
<?php
/*$str = "Hello";
echo password_hash($str,1);*/
// define variables and set to empty values
$nameErr = "";
$passwordErr = "";
$user = "";
$password = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["user"])) {
    $nameErr = "Name is required";
  } else {
    $user = test_input($_POST["user"]);
    // check if name only contains letters and whitespace
    if (!preg_match("/^[a-zA-Z ]*$/",$user)) {
      $nameErr = "Only letters and white space allowed";
    }
  }
  if (empty($_POST["pass"])) {
    $passwordErr = "Password is required";
  } else {
    $password = test_input($_POST["pass"]);
  }
  
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>


Solution

  • In Index.php - you're not setting $start value properly. The below code sets $start value from $_POST['start'] which if non-existent $start defaults to 0.

    And you're also not accepting form submission properly. I modified the code to accept both submit types (next and login) by doing isset() checks on their $_POST variables.

    Use:

    <?php
    include_once('User.php');
    
    if(isset($_POST['submit']) OR isset($_POST['next'])){
        $username = $_POST["user"];
        $password = $_POST["pass"];
    
        $object = new User();
        $object->username= $username;
        $object->Password=$password;
        if( $object->isAuthenticated() ){
    
          echo "User Verified . <br><br>";
    
          $start = 0;
          if(isset($_POST['start'])){
             $start = $_POST['start'];
          }
    
          $object->getBooks($start);
    
        }
    }
    else{
      echo "Wrong User Name Or Password . <br>";
    }
    
    
    ?>
    

    In your form code, you have to add a hidden input which holds the offset value of the next database record.

    Use this code:

    <form method="post" action="">
      Name: <input type="text" name="user" value="<?php echo $user;?>">
      <span class="error">* <?php echo $nameErr;?></span>
      <br><br>
      password: <input type="password" name="pass" value="<?php echo $password;?>" >
      <span class="error">* <?php echo $passwordErr;?></span>
      <br><br>
      <input type="submit" name="submit" value="Login">
      <br><br>
    
      <input type="hidden" value="<?php echo (intval(isset($_POST['start'])?$_POST['start']:0)+1);?>" name="start"/>
      <button type="button" name="button" onclick="window.location.href='/ooRigester.php'">SignUp</button>
      <br><br>
      <input type='submit' name='next' value='next' method="post"><br>
    </form>
    

    Your class method getBooks() has to have $start parameter so it knows which record is next to be shown.

    Try:

    public function getBooks($start = 0)
    {
         $limit = 1;
    
        //SELECT loginUser.username, Library.nameOfBook FROM loginUser JOIN userBook JOIN Library ON userBook.user_id = loginUser.id AND userBook.book_id = Library.id WHERE loginUser.username="loay";
        $query = "SELECT Library.nameOfBook FROM loginUser JOIN userBook JOIN Library ON userBook.user_id = loginUser.id AND userBook.book_id = Library.id WHERE loginUser.username=:username LIMIT $start, $limit";
        $statment = $this->db->prepare($query);
        $statment->execute([
            ':username' => $this->username
            //,':start' => $start, ':limit' => $limit
        ]);
        $result = $statment->fetchAll();
    
       echo "<table border='1'>
        <tr>
        <th>Books</th>
        </tr>";
        foreach($result as $row){
            echo "<tr>";
            echo "<td>" . $row['nameOfBook'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
    }