Jump to content

Why The WHILE Loop Fails On Paginated Pages ?


2020

Recommended Posts

Good Evening Php Programmers,

I am trying to build a pagination script with mysqli using procedural style programming.

Am a beginner. Not into oop yet or pdo. Bear that in mind if you show code samples. Else, i won't understand your snippets.

Anyway, here's how my script works ...
When you click SUBMIT button, initially the rows_count() uses following query to get the matching rows number:

$query_2 = "SELECT * FROM users WHERE first_name = ? AND marital_status = ? LIMIT $offset,$last_row_on_page";


Then it forwards you to the fetch_rows() that fetches the rows and displays them in a pagination style.

When you click any page numbers on the pagination section, like page 2, then the fetch_rows() is supposed to fetch the relevant rows again for page 2. Note, rows_count() doesn't play here as I deem not necessary to re-count all matched rows.
Rows fetching is done with this query:

$query_2 = "SELECT * FROM users WHERE first_name = ? AND marital_status = ? LIMIT $offset,$last_row_on_page";

It displays the matching rows using this WHILE loop:

while($row = mysqli_fetch_array($result_2,MYSQLI_ASSOC))

BIG ISSUE:

The fetch_rows() or $query_2 fails to fetch any matching rows beyond page 1 no matter what page you click. Be it page 2, 3, 4, etc.
However, it does manage to fetch all matching rows for page 1. Just not beyond page 1. That is the main problem. Struggling for about 4 nights now. Can't get over this hurdle!

Code is set to display 1 row per page for testing purpose.
Since there are 5 matching rows in my mysql db, rows are supposed to be spread across many pages via pagination.

You can easily see which lines I am having trouble with if you notice the CAPITALISED comments in my code.

//Do following if "Search" button clicked.
    if($_SERVER['REQUEST_METHOD'] === 'POST')
    {echo __LINE__; echo "<br>";//DELETE
        //Do following if "Search" button clicked.
        if(isset($_POST['search']))
        {echo __LINE__; echo "<br>";//DELETE
            rows_count(); //This function will forward script flow to fetch_rows() before halting the script.
            die();
        }
    }
    echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS FAILS TO ECHO. IT IS LINE: 24.
    //Do following if "Search" button not clicked but pagination numbered links are clicked. Eg Page 1, 2, 3, etc..
    fetch_rows(); //On PAGINATION PAGE 2, THIS FUNCTION IS NOT GETTING TRIGGERED! WHY ?
    echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS GETS ECHOED. IT IS LINE: 205.

 

If you really want to help then best fire-up your Xampp/Wampp and feed my code and test it.

Here is the full code for your convenience. You won't understand the code without the context. Hence the full code ...

DEVMODE CONTEXT:

<?php
error_reporting(E_ALL);
?>
	<!DOCTYPE HTML">
<html>
	<head>
<meta name="viewport" content="width-device=width, initial-scale=1">
</head>
<body>
	<?php
session_start();
	if(!isset($_GET['query_type']) && empty($_GET['query_type']))
{
    die("Invalid Query!");
}
else
{
    $_SESSION['query_type'] = $_GET['query_type']; echo __LINE__; echo "<br>";//DELETE
}
echo __LINE__; echo "<br>";//DELETE
	if(!isset($_GET['form_type']) && empty($_GET['form_type']))
{
    die("Invalid Form!");
}
else
{
    $_SESSION['form_type'] = $_GET['form_type']; echo __LINE__; echo "<br>";//DELETE
    
    if(!function_exists($_SESSION['form_type']))
    {
        die("Invalid Form!");
    }
    else
    {echo __LINE__; echo "<br>";//DELETE
        if(!session_id() || !isset($_SESSION['form_step']) || $_SESSION['form_step'] != 'end')
        {
            $_SESSION['form_step'] = 'start'; echo __LINE__; echo "<br>";//DELETE
            $_SESSION['form_type']();
        }
    }
}
        
//FUNCTIONS START FROM HERE
function search()
{echo __LINE__; echo "<br>";//DELETE
    function rows_count()
    {
        //Connect to Database. (DB_SERVER, BD_USERNAME, DB_PASSWORD, DB_NAME).
        $conn = mysqli_connect("localhost","root","","powerpage");
        $conn->set_charset('utf8mb4'); //Always set Charset.
        
        if($conn === false)
        {
            die("ERROR: Connection Error!. " . mysqli_connect_error());
        }
        
        $query_1 = "SELECT COUNT(id) FROM users WHERE first_name = ? AND marital_status = ?";
        $stmt_1 = mysqli_stmt_init($conn);
        if(mysqli_stmt_prepare($stmt_1,$query_1))
        {
            mysqli_stmt_bind_param($stmt_1,"ss",$_POST["first_name"],$_POST["marital_status"]);
            mysqli_stmt_execute($stmt_1);
            $result_1 = mysqli_stmt_bind_result($stmt_1,$row_count);
            mysqli_stmt_fetch($stmt_1);
            $_SESSION['row_count'] = $row_count;
            echo __LINE__; echo "<br>";//DELETE
            $_SESSION['form_step'] = 'end';
            fetch_rows();
        }
    }
	    function fetch_rows()
    {    echo __LINE__; echo "<br>";//DELETE
        $form_step = $_GET['form_step'];
        
        $page_number = $_GET['page'];
        $result_per_page = $_GET['page_limit'];
        $offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
        $last_row_on_page = ($page_number * $result_per_page); //Max Result (Row Number that 'Ends' on page).
        $previous_page = $page_number-1;
        $next_page = $page_number+1;
        
        echo "Row Start: $offset";echo "<br>";
        echo "Row End: $last_row_on_page";echo "<br>";
        
        //Connect to Database. (DB_SERVER, BD_USERNAME, DB_PASSWORD, DB_NAME).
        $conn = mysqli_connect("localhost","root","","powerpage");
        $conn->set_charset('utf8mb4'); //Always set Charset.
	        if($conn === false)
        {
            die("ERROR: Connection Error!. " . mysqli_connect_error());
        }
	        $query_2 = "SELECT * FROM users WHERE first_name = ? AND marital_status = ? LIMIT $offset,$last_row_on_page";
        $stmt_2 = mysqli_stmt_init($conn);
        if(mysqli_stmt_prepare($stmt_2,$query_2))
        {echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS GETS ECHOED. IT IS LINE: 103.
            mysqli_stmt_bind_param($stmt_2,"ss",$_POST["first_name"],$_POST["marital_status"]);
            mysqli_stmt_execute($stmt_2);
            $result_2 = mysqli_stmt_get_result($stmt_2);
            if(!$result_2)
            {
                //Close Connection.
                mysqli_close($conn);
                die("<pre>2c. Statement Fetching failed!</pre>");
            }
            else
            {echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS GETS ECHOED. IT IS LINE: 114.
                //Grab total number of pages to paginate.
                $row_count = $_SESSION['row_count'];
                //$total_pages = ceil($result_1/$result_per_page);
                $total_pages = ceil($row_count/$result_per_page);
                
                echo "TOTAL PAGES: $total_pages<br><br>";
                
                while($row = mysqli_fetch_array($result_2,MYSQLI_ASSOC))//On PAGE 2, PHP IGNORING THIS AND BYPASSING THIS WHOLE WHILE LOOP ON PAGE 2. IT IS LINE: 122.
                {echo __LINE__; echo "<br>";//On PAGE 2, THIS FAILS TO ECHO. IT IS LINE: 123. PHP IGNORING IT BYPASSING IT ON PAGE 2.
                    //Retrieve Values.
                    $id = $row["id"];
                    $first_name = $row["first_name"];
                    $middle_name = $row["middle_name"];
                    $surname = $row["surname"];
                    $gender = $row["gender"];
                    $marital_status = $row["marital_status"];
                    $working_status = $row["working_status"];
                    
                    echo "Id: $id<br>";
                    echo "First Name: $first_name<br>";
                    echo "Middle Name: $middle_name<br>";
                    echo "Surname: $surname<br>";
                    echo "Gender: $gender<br>";
                    echo "Marital Status: $marital_status<br>";
                    echo "Working Status: $working_status<br>";
                    echo "<br>";
                    echo "<br>";
                    
                    $i = 1;
                    while($i<=$total_pages)
                    {
                        if($i<$total_pages)
                        {
                            echo "<a href='http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=1&page=<?php echo $i;?>'><?php echo " $i ";?></a><?php
                        }
                        elseif($i==$page_number)
                        {
                            echo "<a href='http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=1&page=<?php echo $i;?>'><?php echo "<b> $i </b>";?></a><?php
                        }
                        
                        $i++;
                    }
                    if($page_number>$total_pages)
                    {
                        echo "<a href='http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=1&page=<?php echo $previous_page;?>'><?php echo "<b> Previous </b>";?></a><?php
                    }
                }
            }
        }
        $_SESSION['form_step'] = 'end';
    }
    ?>
    
    <form action="<?php echo $_SERVER['PHP_SELF'];?>?form_type=<?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=1&page=1" method='post' enctype='plain/text'>
    <?php
	    //Added '*' (asterisk) to indicate the 'Text Field' is a 'required' one.
    echo "<label for=\"first_name\">First Name *:</label>
    <input type=\"text\" name=\"first_name\" placeholder=\"First Name\" value = \"\">";?>
    <br>
    <?php
    echo "<label for=\"marital_status\">Marital Status *:</label>";
    echo "<select name=\"marital_status\">";
    echo "<option value=\"single\">Single</option>";
    echo "<option value=\"married\">Married</option>";
    echo "</select>";
    echo "<br>";
    ?>
    <input type="submit" name="search" value="Search">
    <?php
    //$current_function = __FUNCTION__;
    //echo $current_function;
    
    //Do following if "Search" button clicked.
    if($_SERVER['REQUEST_METHOD'] === 'POST')
    {echo __LINE__; echo "<br>";//DELETE
        //Do following if "Search" button clicked.
        if(isset($_POST['search']))
        {echo __LINE__; echo "<br>";//DELETE
            rows_count(); //This function will forward script flow to fetch_rows() before halting the script.
            die();
        }
    }
    echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS FAILS TO ECHO. IT IS LINE: 24.
    //Do following if "Search" button not clicked but pagination numbered links are clicked. Eg Page 1, 2, 3, etc..
    fetch_rows(); //On PAGINATION PAGE 2, THIS FUNCTION IS NOT GETTING TRIGGERED! WHY ?
    echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS GETS ECHOED. IT IS LINE: 205.
}
?>

What is wrong ? Why is fetch_rows() or $query_2 failing to fetch the matching rows for pages beyond page 1 ?

ECHOES
Before clicking the SUBMIT button, I get echoed these line numbers as expected:

22
24
32
39
42
50

After clicking the SUBMIT button I get these echoed as expected:

193
71
78
Row Start: 0
Row End: 1
103
114
TOTAL PAGES: 5
123

After clicking the link for 'page 2' on pagination section, I get echoed the same line numbers I get echoed before clicking the SUBMIT button as if everything is starting all over with a new query (when not). That is not supposed to happen.

I reckon line 200 is not taking action:

fetch_rows(); //On PAGINATION PAGE 2, THIS FUNCTION IS NOT GETTING TRIGGERED! WHY ? IT IS LINE: 200. MAIN ISSUE HERE, I SUSPECT.


NOTE: I am a beginner still on OOP and mysqli. Not on pdo either. So, kindly show samples to that level, if you must.

Edited by 2020
Link to comment
Share on other sites

the pagination after page 1 is not working because you are not propagating the get parameters that your code expects, nor are you validating those inputs, so your code is not telling you what is wrong (you are probably getting php errors though.) you must validate all inputs to a page before using them and any 'required' inputs should cause some type of user error message to be displayed if they are not present.

when you get to the point of producing pagination links, you should include any existing get parameters by starting with a copy of the $_GET array, modify the page element in that array, then use http_build_query() to produce the query string part of the url. you should also be passing any search term/filters as get parameters.

Link to comment
Share on other sites

27 minutes ago, mac_gyver said:

the pagination after page 1 is not working because you are not propagating the get parameters that your code expects, nor are you validating those inputs, so your code is not telling you what is wrong (you are probably getting php errors though.) you must validate all inputs to a page before using them and any 'required' inputs should cause some type of user error message to be displayed if they are not present.

when you get to the point of producing pagination links, you should include any existing get parameters by starting with a copy of the $_GET array, modify the page element in that array, then use http_build_query() to produce the query string part of the url. you should also be passing any search term/filters as get parameters.

Mac,

I do provide parameters via $_GET and $_SESSION. Like this:

$_SESSION['form_step'] = 'end';
$page_number = $_GET['page'];
$result_per_page = $_GET['page_limit'];
$offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
$last_row_on_page = ($page_number * $result_per_page); //Max Result (Row Number that 'Ends' on page).

Only these above are required for the mysql queries.

Here is an example of a paginated link:

<a href='http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $i;?>'><?php echo " $i ";?></a>

 

Look at all these $_GETs:

	<?php session_start(); if(!isset($_GET['query_type']) && empty($_GET['query_type'])) {     die("Invalid Query!"); } else {     $_SESSION['query_type'] = $_GET['query_type']; echo __LINE__; echo "<br>";//DELETE } echo __LINE__; echo "<br>";//DELETE if(!isset($_GET['form_type']) && empty($_GET['form_type'])) {     die("Invalid Form!"); } else {     $_SESSION['form_type'] = $_GET['form_type']; echo __LINE__; echo "<br>";//DELETE          if(!function_exists($_SESSION['form_type']))     {         die("Invalid Form!");     }     else     {echo __LINE__; echo "<br>";//DELETE         if(!session_id() || !isset($_SESSION['form_step']) || $_SESSION['form_step'] != 'end')         {             $_SESSION['form_step'] = 'start'; echo __LINE__; echo "<br>";//DELETE             $_SESSION['form_type']();         }     } }
	

 

Which param am I missing ?

I will look into the http_build_query(). I once looked into it but have forgotten what it is.

As for my unorthodox links on the pagination section, they are rough for now.

Edited by 2020
Link to comment
Share on other sites

On 6/28/2020 at 6:12 AM, mac_gyver said:

how about the display_errors setting?

any of php's error related settings should be in the php.ini on your system, so that they can be changed at a single point and don't clutter up your code.

Mac,

 

Don't know much about .ini file stuff. Still a beginner.

Anyway, I googled and found this:

https://www.tutorialspoint.com/how-to-display-errors-in-php-file

And so, I added:

	<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
?>
	

 

I get no errors. Also, if you check my url and params I grab from the url via $_GEt and $_SESSIONs, you will see I have not missed anything out.

Link to comment
Share on other sites

Mac,

I just realized that, $_SESSION['row_count'] = 5, when I click the SEARCH button. 5 matching rows found.

Then when I click PAGE 2 on pagination, the $_SESSION['row_count'] = 0, why is that ? It should stay 5. i am not overwriting the variable value either.

This is the reason why, when I click PAGE 2 or PAGE 3 on the PAGINATION section, I see zero results or rows shown. No rows get shown beyond page 1.

If I can findout why the '$_SESSION['row_count'] = 5' auto becomes $_SESSION['row_count'] = 0, then mystery solved.

Look, after clicking the SEARCH button, this part of code yields $_SESSION['row_count'] = 5. So far so good.

	$query_1 = "SELECT COUNT(id) FROM users WHERE first_name = ? AND marital_status = ?";
        $stmt_1 = mysqli_stmt_init($conn);
        if(mysqli_stmt_prepare($stmt_1,$query_1))
        {
            mysqli_stmt_bind_param($stmt_1,"ss",$_POST["first_name"],$_POST["marital_status"]);
            mysqli_stmt_execute($stmt_1);
            $result_1 = mysqli_stmt_bind_result($stmt_1,$row_count);
            mysqli_stmt_fetch($stmt_1);
            $_SESSION['row_count'] = $row_count;
	

I get shown matching rows on PAGE 1. Since I set it to display 1 row per page, I am shown 1 matching row. So far, so good.

Now, when I click PAGE 2 on the PAGINATION section, I expect to see the 2nd matching row, but "$_SESSION['row_count'] = 5" switches to "$_SESSION['row_count'] = 0" and so no matching rows get shown. Why the switching of values from '5' to '0' when I click PAGE 2 ?

This illegal switching ruins this following query that runs when I click PAGE 2 or any PAGE (eg PAGE 3) beyond PAGE 1:

	$row_count = $_SESSION['row_count'];
 //$total_pages = ceil($result_1/$result_per_page);
$total_pages = ceil($row_count/$result_per_page);
	

 

Context:

	$query_2 = "SELECT id,first_name,middle_name,surname,gender,marital_status,working_status FROM users WHERE first_name = ? AND marital_status = ? LIMIT $offset,$last_row_on_page";
        echo "$query_2<br>";
        $stmt_2 = mysqli_stmt_init($conn);
        if(mysqli_stmt_prepare($stmt_2,$query_2))
        {echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS GETS ECHOED. IT IS LINE: 111.
            mysqli_stmt_bind_param($stmt_2,"ss",$_POST["first_name"],$_POST["marital_status"]);
            mysqli_stmt_execute($stmt_2);
            $result_2 = mysqli_stmt_get_result($stmt_2);
            echo __LINE__; echo "<br>";//On PAGINATION PAGE 2, THIS GETS ECHOED. IT IS LINE: 114.
            //Grab total number of pages to paginate.
            $row_count = $_SESSION['row_count'];
            //$total_pages = ceil($result_1/$result_per_page);
            $total_pages = ceil($row_count/$result_per_page);
	

 

Do check my original post's code to see if you can figure-out why the "$_SESSION['row_count']" switches from "5" to "0".

 

Thanks

Link to comment
Share on other sites

	$query_2 = "SELECT id,first_name,middle_name,surname,gender,marital_status,working_status FROM users WHERE first_name = ? AND marital_status = ? ORDER by id LIMIT $offset,$last_row_on_page";
	

 

Mac,

I am told the above query is faulty. I should have an $offset and a $number that tells how many rows should be displayed on the page, be it PAGE 1, PAGE 2 or PAGE 100. Remember, we are talking about PAGINATION here.

 

Let us say, I want 10 results per pagination page. So, what should I switch my followings to now (I confused) ?

	$page_number = $_GET['page'];
        $result_per_page = $_GET['page_limit'];
        $offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
        $last_row_on_page = ($page_number * $result_per_page); //Max Result (Row Number that 'Ends' on page).
        $previous_page = $page_number-1;
        $next_page = $page_number+1;
	        echo "Row Start: $offset";echo "<br>";
        echo "Row End: $last_row_on_page";echo "<br>";
	

 

Edited by 2020
Link to comment
Share on other sites

i just realized why you are not getting any helpful php errors at the point of the problem. it's because you are using the ridiculous mysqli extension. the following is using a reference to the variables and if they don't exist, there's no php undefined variable/index error when the variables are evaluated.

5 hours ago, 2020 said:

 mysqli_stmt_bind_param($stmt_2,"ss",$_POST["first_name"],$_POST["marital_status"]);

so, i'll repeat this -

On 6/27/2020 at 5:02 PM, mac_gyver said:

you must validate all inputs to a page before using them and any 'required' inputs should cause some type of user error message to be displayed if they are not present.

your search form should use method='get' and if your code was validating the inputs before using them, you would know why your code is not working, 

Link to comment
Share on other sites

if you layout the code on your page in the following general order, it will be much easier to design, write, test, and debug your code/query(ies) -

  1. initialization - define, require, create, ... things your page needs, such as the session_start() statement, a database connection, configuration values, ...
  2. post method form processing code - a post method form should be used for things that create/update data on the server or perform an action such as sending an email.
  3. get method business logic - get/create data needed to display the dynamic content on the web page.
  4. html document/template - using simple php code or an actual template system, produce the actual html document, using the data produced from the above sections of code.

you would have validation logic in both items #2 and #3.

next, you don't need to understand OOP in order to use existing OOP classes. if you switch to the much simpler and more consistent PDO database extension, over half of the database related statements will go away.

Link to comment
Share on other sites

@Macguyver,

 

I have created membership (login/register, logout, account homepage, pagination, etc.) pages before with helps of course.

The membership script had about 10 different pages.

My new project is that, the membership script should be all one page. So, login, logout, register, search 9pagination) all in one page. What I just gave in this thread is the pagination part of the page that i am stuck on. The reg & login parts already work.

I did not bother mentioning them parts in this thread to keep the code to the point where I am having issue.

So, there you go. Now you know the full picture.

 

Anyway, I was suggested to add the session start at the top of the page right under the error reporting code and i did but no luck. I even switched the form method from post to get, like you suggested, but no luck.

As for writing errors in a different file or whatever you are advising, I have never done it and so don't know how to proceed, unless ofcourse you can point me in the right direction with a code snippet or a link to a url.

 

I have searched all over google for a tutorial with keywords like these but no luck for over a wk now:

pagination tutorial AND mysqli AND prepared statements AND php

 

Most tutorials are in oop or pdo or mysql extension. Or, they show tutorials on how to build pagination that displays whole table records (all rows). They don't show tutorials (mysqli, prepared statement) how to show records based on keyword search. That is why I am doing things all by myself reading manual and getting ideas from tutorials here and there that are based on oop or pdo or mysql extension or based on "show all table records".

That issue of $_SESSION['row_count'] = 5 switching to $_SESSION['row_count'] = 0 on every page load (same page, remember!), still remains. Remember, this membership script is a one page script.

If I can get over this hurdle of why the God Forsaken $_SESSION['row_count'] = 5 switches to $_SESSION['row_count'] = 0 on every same page load, then this 2-3 months project is complete!

Link to comment
Share on other sites

you still have not done the most important thing that has been suggested, repeatedly. validating all inputs that your page expects and setting up/displaying user error messages for each validation error. this will get your code to either work or it will tell you why it isn't working.

On 6/27/2020 at 5:19 PM, 2020 said:

Only these above are required for the mysql queries.

no. your queries also expect $_POST["first_name"] and $_POST["marital_status"] as inputs,

all this extra code using session variables, repeated database connections, function definitions around parts of your main code, function definitions inside of other function definitions, ... is unnecessary clutter. i recommend that you start over, adding and testing one feature at a time. 1. produce a get method search form, that's 'sticky' (repopulate the field values with any existing submitted values), that sets up/displays user error messages for each required input that doesn't exist. 2. once you get that to work, add the two queries and the logic needed for pagination, that use those required inputs.

another recommend to add to the list is to use an array to hold user/validation error messages, using the input/field name as the array index. this array is also an error flag. if the array is empty, there are no errors and you can use the input data. if the array is not empty, there are errors. you can test/display the content of this array at the appropriate point in the html document.

Link to comment
Share on other sites

On 7/6/2020 at 1:26 AM, mac_gyver said:

you still have not done the most important thing that has been suggested, repeatedly. validating all inputs that your page expects and setting up/displaying user error messages for each validation error. this will get your code to either work or it will tell you why it isn't working.

no. your queries also expect $_POST["first_name"] and $_POST["marital_status"] as inputs,

all this extra code using session variables, repeated database connections, function definitions around parts of your main code, function definitions inside of other function definitions, ... is unnecessary clutter. i recommend that you start over, adding and testing one feature at a time. 1. produce a get method search form, that's 'sticky' (repopulate the field values with any existing submitted values), that sets up/displays user error messages for each required input that doesn't exist. 2. once you get that to work, add the two queries and the logic needed for pagination, that use those required inputs.

another recommend to add to the list is to use an array to hold user/validation error messages, using the input/field name as the array index. this array is also an error flag. if the array is empty, there are no errors and you can use the input data. if the array is not empty, there are errors. you can test/display the content of this array at the appropriate point in the html document.

I wanted to solve the current big issue FIRST by preventing $_SESSION['row_count'] = 5 auto switching to $_SESSION['row_count'] = 0 when I click over to page 2,3,4,5 on pagination.

After that, do as you advised. Why later ? Because, it will take time to do all that you suggest since I am new in php. Have to learn a lot to do all that. For example, the error array thing, I could never really get my head round that one even though I have seen others coding it that way. How-about you show me an example how to do it ?

As for validating inputs, you suspect my url params and/or $_POSTs contains a string instead of an INT and so best validate the $_GETs & $_POSTs. Yes, I can add filters later-on but the inputs I can assure you is not faulty. Let's rid the cancer first then put make-up on later.

Atleast tell me this. When I do a search for a keyword and 5 matching rows are found and $_SESSION['row_count'] = 5 and page 1 manages to show matching row. Then, when I clickover to PAGE 2/3/4/5 then why does $_SESSION['row_count'] = 5 auto switch to $_SESSION['row_count'] = 0.

Due to this auto switching, my script assumes there are 0 row matches for pages 2/3/4/5 and so displays no result. Even though there are matching rows to be displayed on pages 2/3/4 & 5. Tell me atleast that, if you managed to figure-out what is causing the switch.
If I can stop this auto switching of values then my PAGINATION is complete, even without all those VALIDATORs you suggested. But, for my security purpose, I will add those VALIDATORS as you suggested and so don't think I am ignoring your advice. It's just I need to fix the cancer first. Else, I can't concentrate on all those other side stuffs which are not really creating any problem for my current issue of this dratted $SESSION value auto switching.

How do you prevent the auto switching ?

Edited by 2020
Link to comment
Share on other sites

10 minutes ago, 2020 said:

NOTE: $_SESSION['form_type'] = search.
And so, this following line triggers the search():


$_SESSION['form_type']();

 

What the heck is that? No. No no no. There's absolutely no reason to be doing that.

Link to comment
Share on other sites

Mac,

You told me to switch form method to GET from POST. I did.
When i submit form, I am forwarded to:

http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW_1.php?first_name=first_name4&marital_status=single&search=Search
 

I do not want the user's inputs in the url as params. Imagine the form asked 20 questions, if all user inputs get chucked in the url as params then the url would become way over 255. url will be truncated or whatever. I see future issues arising here.

I understand why you suggested the $_GET because my pagination links had params in the url:

	$i = 1;
            while($i<=$total_pages)
            {
                if($i<$total_pages)
                {
                    echo "<a href='http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW_1.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $i;?>'><?php echo " $i ";?></a><?php
                }
                elseif($i==$page_number)
                {
                    echo "<a href='http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW_1.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $i;?>'><?php echo "<b> $i </b>";?></a><?php
                }
                
                $i++;
            }
            if($page_number>$total_pages)
            {
                echo "<a href='http://localhost/power.page/pagination_test_simple_WORKING_ON_NOW_1.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $previous_page;?>'><?php echo "<b> Previous </b>";?></a><?php
            }
	

 

Stuck now. Don't know how to proceed from here. I have no choice but to switch back to form method $_POST.

Link to comment
Share on other sites

Mac,

 

Since I am switching form method back to POST, then I have to switch these $_GETs to $_POSTs. Right ?

	if($_SESSION['form_step'] == 'start');
{
    if(!isset($_GET['form_type']) && empty($_GET['form_type']))
    {
        die("Invalid Form!");
    }
    else
    {
        $_SESSION['form_type'] = $_GET['form_type'];
        
        if(!isset($_GET['query_type']) && empty($_GET['query_type']))
        {
            die("Invalid Query!");
        }
        else
        {
            $_SESSION['query_type'] = $_GET['query_type'];
            
            if(!function_exists($_SESSION['form_type']))
            {
                die("Invalid Form!");
            }
            else
            {
                $_SESSION['form_type']();
            }
        }
    }
	

Link to comment
Share on other sites

Mac,

 

On the other hand, I am not switching these to $_POST from $_GETs:

	Folks,
	My form method is not GET but POST.
Concentrate on my code on my op.
It is this:
[code]
	Since I am switching form method back to POST, then I have to switch these $_GETs to $_POSTs. Right ?
	[code]
	if($_SESSION['form_step'] == 'start');
{
    if(!isset($_GET['form_type']) && empty($_GET['form_type']))
    {
        die("Invalid Form!");
    }
    else
    {
        $_SESSION['form_type'] = $_GET['form_type'];
        
        if(!isset($_GET['query_type']) && empty($_GET['query_type']))
        {
            die("Invalid Query!");
        }
        else
        {
            $_SESSION['query_type'] = $_GET['query_type'];
            
            if(!function_exists($_SESSION['form_type']))
            {
                die("Invalid Form!");
            }
            else
            {
                $_SESSION['form_type']();
            }
        }
    }
	

Simply because these params in the url were not user inputs. These params are just part of pagination params. Should I leave them as they are ? Macguyver ? They are easily being $_GET without any hiccups.

Edited by 2020
Link to comment
Share on other sites

@macguyver,

On my 7th version, it is now working.
So it means, the $_POSTs were getting deleted and not passed from page 1 to page 2, 3 etc on paginated pages. After dumping the $
_POST values to $_SESSION values they (user inputs) are now getting forwarded from page to page (after also I deleted on form type line "enctype=text/plain" part) and to their SQL queries and so now page 2 also showing matching row data.

So now what even stackoverflow.com guys failed to spot was spotted by someone somewhere elses! I give them 2 places programmers honour badges!
2 wks of frustration has now come to an end! :)

	$offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
$last_row_on_page = ($page_number * $result_per_page); //Max Result (Row Number that 'Ends' on page).
	
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
session_start();
	//I WAS TOLD $_POST VALUES ARE LIKELY TO BE EMPTY ON PAGINATION PAGE 1,2,3,4,5. WAS ADVISED TO ADD THIS FOLLOWING CODE TO CHECK.
echo "<pre>SESSION:\n".print_r($_SESSION, 1)."</pre>";
echo "<pre>POST:\n".print_r($_POST, 1)."</pre>";
?>
	<!DOCTYPE HTML">
<html>
	<head>
<meta name="viewport" content="width-device=width, initial-scale=1">
</head>
<body>
	<?php
	if(!isset($_GET['query_type']) && empty($_GET['query_type']))//'query_type' tells the script whether it is an INSERT or SELECT or UPDATE sql query. From this the script determines which type of form to display and what prepared statements lines to use.
{
    die("Invalid Query!");
}
else
{
    $_SESSION['query_type'] = $_GET['query_type'];
    echo __LINE__; echo "<br>";//DELETE
}
echo __LINE__; echo "<br>";//DELETE
	if(!isset($_GET['form_type']) && empty($_GET['form_type']))//'form_type' tells the script which form to display. (Login, Reg, Submit Personal Details, Submit Link).
{
    die("Invalid Form!");
}
else
{
    $_SESSION['form_type'] = $_GET['form_type'];
    echo __LINE__; echo "<br>";//DELETE
    
    if(!function_exists($_SESSION['form_type']))
    {
        die("Invalid Form!");
    }
    else
    {echo __LINE__; echo "<br>";//DELETE
        if(!isset($_SESSION['form_step']))// || $_SESSION['form_step'] != 'end')
        {
            $_SESSION['form_step'] = 'start'; echo $_SESSION['form_step'];
            echo __LINE__; echo "<br>";//DELETE
            $_SESSION['form_type']();
        }
        else
        {
            $_SESSION['form_step'] = $_GET['form_step'];
            echo __LINE__; echo "<br>"; echo $_SESSION['form_step'];//DELETE
            $_SESSION['form_type']();
        }
    }
}
	function search()
{
    echo __LINE__; echo "<br>";//DELETE
    //Do following if "Search" button clicked.
    if($_SERVER['REQUEST_METHOD'] === 'POST') //Doing following means "Search" button clicked AND pagination numbered links are NOT clicked. Eg page 2, 3, etc.
    {echo __LINE__; echo "<br>";//DELETE
        //Do following if "Search" button clicked.
        if(isset($_POST['search']))
        {echo __LINE__; echo "<br>";//DELETE
            $_SESSION["first_name"] = $_POST["first_name"];//ADDED THIS NEW LINE.
            $_SESSION["marital_status"] = $_POST["marital_status"];//ADDED THIS NEW LINE.
            
            rows_count();
            fetch_rows();
            echo __LINE__; echo "<br>";
            die;
        }
    }
    else //Doing following means "Search" button not clicked but pagination numbered links are clicked. Eg page 2, 3, etc.
    {
        echo __LINE__; echo "<br>";//DELETE
        //Do following if "Search" button not clicked but pagination numbered links are clicked. Eg Page 2, 3, etc..
        //rows_count(); //SHOULD I RUN THIS FUNCTION AGAIN FROM PAGE 2,3,4, ETC OR NOT ?
        fetch_rows();
        echo __LINE__; echo "<br>";//DELETE
    }
}
	
function rows_count()
{
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $conn = mysqli_connect("localhost","root","","powerpage");
    $conn->set_charset('utf8mb4'); //Always set Charset.
    
    if($conn === false)
    {
        die("ERROR: Connection Error!. " . mysqli_connect_error());
    }
	    $query_1 = "SELECT COUNT(id) FROM users WHERE first_name = ? AND marital_status = ?";
    //$_SESSION["first_name"] = $_POST["first_name"];//ADDED THIS NEW LINE.
    //$_SESSION["marital_status"] = $_POST["marital_status"];//ADDED THIS NEW LINE.
    $stmt_1 = mysqli_stmt_init($conn);
    if(mysqli_stmt_prepare($stmt_1,$query_1))
    {
        //mysqli_stmt_bind_param($stmt_1,"ss",$_POST["first_name"],$_POST["marital_status"]);//SUBSTITUTED THIS LINE FOR THE LINE BELOW.
        mysqli_stmt_bind_param($stmt_1,"ss",$_SESSION["first_name"],$_SESSION["marital_status"]);//SUBSTITUTED TO THIS LINE FROM THE LINE ABOVE.
        mysqli_stmt_execute($stmt_1);
        $result_1 = mysqli_stmt_bind_result($stmt_1,$row_count);
        mysqli_stmt_fetch($stmt_1);
        $_SESSION['row_count'] = $row_count;
        echo __LINE__; echo "<br>";//DELETE
        $_SESSION['form_step'] = 'end';
        //fetch_rows();
    }
    //Close Statement.
    mysqli_stmt_close($stmt_1);
    //Close Connection.
    mysqli_close($conn);
}
	function fetch_rows()
{   echo __LINE__; echo "<br>";//DELETE
    $form_step = $_GET['form_step'];
    
    $page_number = $_GET['page'];
    $result_per_page = $_GET['page_limit'];
    $offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
    $last_row_on_page = ($page_number * $result_per_page); //Max Result (Row Number that 'Ends' on page).
    $previous_page = $page_number-1;
    $next_page = $page_number+1;
    
    echo "Row Start: $offset";echo "<br>";
    echo "Row End: $last_row_on_page";echo "<br>";
    
    //Connect to Database. (DB_SERVER, BD_USERNAME, DB_PASSWORD, DB_NAME).
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $conn = mysqli_connect("localhost","root","","powerpage");
    $conn->set_charset('utf8mb4'); //Always set Charset.
	    if($conn === false)
    {
        die("ERROR: Connection Error!. " . mysqli_connect_error());
    }
	    $query_2 = "SELECT * FROM users WHERE first_name = ? AND marital_status = ? ORDER BY id LIMIT $offset,$last_row_on_page";
    $stmt_2 = mysqli_stmt_init($conn);
    if(mysqli_stmt_prepare($stmt_2,$query_2))
    {echo __LINE__; echo "<br>";
        //mysqli_stmt_bind_param($stmt_2,"ss",$_POST["first_name"],$_POST["marital_status"]);//SUBSTITUTED THIS LINE FOR THE LINE BELOW.
        mysqli_stmt_bind_param($stmt_2,"ss",$_SESSION["first_name"],$_SESSION["marital_status"]);//SUBSTITUTED TO THIS LINE FROM THE LINE ABOVE.
        mysqli_stmt_execute($stmt_2);
        $result_2 = mysqli_stmt_get_result($stmt_2);
        echo __LINE__; echo "<br>";
        //Grab total number of pages to paginate.
        $row_count = $_SESSION['row_count'];
        //$total_pages = ceil($result_1/$result_per_page);
        $total_pages = ceil($row_count/$result_per_page);
        
        echo "TOTAL PAGES: $total_pages<br><br>";
        
        while($row = mysqli_fetch_array($result_2,MYSQLI_ASSOC))
        {echo __LINE__; echo "<br>";
            //Retrieve Values.
            $id = $row["id"];
            $first_name = $row["first_name"];
            $middle_name = $row["middle_name"];
            $surname = $row["surname"];
            $gender = $row["gender"];
            $marital_status = $row["marital_status"];
            $working_status = $row["working_status"];
            
            echo "Id: $id<br>";
            echo "First Name: $first_name<br>";
            echo "Middle Name: $middle_name<br>";
            echo "Surname: $surname<br>";
            echo "Gender: $gender<br>";
            echo "Marital Status: $marital_status<br>";
            echo "Working Status: $working_status<br>";
            echo "<br>";
            echo "<br>";
        }   
        $i = 1;
        while($i<=$total_pages)
        {
            if($i<$total_pages)
            {
                echo "<a href='http://localhost/power.page/stack.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $i;?>'><?php echo " $i ";?></a><?php
            }
            elseif($i==$page_number)
            {
                echo "<a href='http://localhost/power.page/stack.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $i;?>'><?php echo "<b> $i </b>";?></a><?php
            }
            
            $i++;
        }
        if($page_number>$total_pages)
        {
            echo "<a href='http://localhost/power.page/stack.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $previous_page;?>'><?php echo "<b> Previous </b>";?></a><?php
        }
    }
    //Close Statement.
    mysqli_stmt_close($stmt_2);
    //Close Connection.
    mysqli_close($conn);
    
    $_SESSION['form_step'] = 'end';
}
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>?form_type=<?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=1" method='POST'>
<?php
//Added '*' (asterisk) to indicate the 'Text Field' is a 'required' one.
echo "<label for=\"first_name\">First Name *:</label>
<input type=\"text\" name=\"first_name\" placeholder=\"First Name\" value = \"\">";?>
<br>
<?php
echo "<label for=\"marital_status\">Marital Status *:</label>";
echo "<select name=\"marital_status\">";
echo "<option value=\"single\">Single</option>";
echo "<option value=\"married\">Married</option>";
echo "</select>";
echo "<br>";
?>
<input type="submit" name="search" value="Search">
</form>
$page_number = $_GET['page'];
    $result_per_page = $_GET['page_limit'];
    $offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
    $last_row_on_page = ($page_number * $result_per_page); //Max Result (Row Number that 'Ends' on page).
$last_row_on_page = ($page_number * $result_per_page); //Max Result (Row Number that 'Ends' on page).

Anyway, one issue. I have 6 total rows out of them 5 match my keyword search. I put 2 rows to be displayed per page. That means all 5 matches should be spread across 3 pages. But they get spread across 2 where PAGE 1 displays 2 rows and PAGE 2 display 3 rows. Note, max only 2 rows were supposed to display!

I am told, that the last line is wrong:

	$offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
$last_row_on_page = ($page_number * $result_per_page); //(Row Number that 'Ends' on page).
	

I am told that the variable, other than the $offset, must not hold the last row's id (last row that should be displayed on the page, eg PAGE 2) but how many rows I want displayed on the page. Is that so ? I need you to confirm.
Should I change this:

$offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
$last_row_on_page = ($page_number * $result_per_page); //(Row Number that 'Ends' on page).
$query_2 = "SELECT * FROM users WHERE first_name = ? AND marital_status = ? ORDER BY id LIMIT $offset,$last_row_on_page";

To this instead ? Yes or no ?

$offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
$max_rows_on_page = 2;
$query_2 = "SELECT * FROM users WHERE first_name = ? AND marital_status = ? ORDER BY id LIMIT $offset,$max_rows_on_page ";

7th Version:

	<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
session_start();
	//I WAS TOLD $_POST VALUES ARE LIKELY TO BE EMPTY ON PAGINATION PAGE 1,2,3,4,5. WAS ADVISED TO ADD THIS FOLLOWING CODE TO CHECK.
echo "<pre>SESSION:\n".print_r($_SESSION, 1)."</pre>";
echo "<pre>POST:\n".print_r($_POST, 1)."</pre>";
?>
	<!DOCTYPE HTML">
<html>
	<head>
<meta name="viewport" content="width-device=width, initial-scale=1">
</head>
<body>
	<?php
	if(!isset($_GET['query_type']) && empty($_GET['query_type']))//'query_type' tells the script whether it is an INSERT or SELECT or UPDATE sql query. From this the script determines which type of form to display and what prepared statements lines to use.
{
    die("Invalid Query!");
}
else
{
    $_SESSION['query_type'] = $_GET['query_type'];
    echo __LINE__; echo "<br>";//DELETE
}
echo __LINE__; echo "<br>";//DELETE
	if(!isset($_GET['form_type']) && empty($_GET['form_type']))//'form_type' tells the script which form to display. (Login, Reg, Submit Personal Details, Submit Link).
{
    die("Invalid Form!");
}
else
{
    $_SESSION['form_type'] = $_GET['form_type'];
    echo __LINE__; echo "<br>";//DELETE
    
    if(!function_exists($_SESSION['form_type']))
    {
        die("Invalid Form!");
    }
    else
    {echo __LINE__; echo "<br>";//DELETE
        if(!isset($_SESSION['form_step']))// || $_SESSION['form_step'] != 'end')
        {
            $_SESSION['form_step'] = 'start'; echo $_SESSION['form_step'];
            echo __LINE__; echo "<br>";//DELETE
            $_SESSION['form_type']();
        }
        else
        {
            $_SESSION['form_step'] = $_GET['form_step'];
            echo __LINE__; echo "<br>"; echo $_SESSION['form_step'];//DELETE
            $_SESSION['form_type']();
        }
    }
}
	function search()
{
    echo __LINE__; echo "<br>";//DELETE
    //Do following if "Search" button clicked.
    if($_SERVER['REQUEST_METHOD'] === 'POST') //Doing following means "Search" button clicked AND pagination numbered links are NOT clicked. Eg page 2, 3, etc.
    {echo __LINE__; echo "<br>";//DELETE
        //Do following if "Search" button clicked.
        if(isset($_POST['search']))
        {echo __LINE__; echo "<br>";//DELETE
            $_SESSION["first_name"] = $_POST["first_name"];//ADDED THIS NEW LINE.
            $_SESSION["marital_status"] = $_POST["marital_status"];//ADDED THIS NEW LINE.
            
            rows_count();
            fetch_rows();
            echo __LINE__; echo "<br>";
            die;
        }
    }
    else //Doing following means "Search" button not clicked but pagination numbered links are clicked. Eg page 2, 3, etc.
    {
        echo __LINE__; echo "<br>";//DELETE
        //Do following if "Search" button not clicked but pagination numbered links are clicked. Eg Page 2, 3, etc..
        //rows_count(); //SHOULD I RUN THIS FUNCTION AGAIN FROM PAGE 2,3,4, ETC OR NOT ?
        fetch_rows();
        echo __LINE__; echo "<br>";//DELETE
    }
}
	
function rows_count()
{
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $conn = mysqli_connect("localhost","root","","powerpage");
    $conn->set_charset('utf8mb4'); //Always set Charset.
    
    if($conn === false)
    {
        die("ERROR: Connection Error!. " . mysqli_connect_error());
    }
	    $query_1 = "SELECT COUNT(id) FROM users WHERE first_name = ? AND marital_status = ?";
    //$_SESSION["first_name"] = $_POST["first_name"];//ADDED THIS NEW LINE.
    //$_SESSION["marital_status"] = $_POST["marital_status"];//ADDED THIS NEW LINE.
    $stmt_1 = mysqli_stmt_init($conn);
    if(mysqli_stmt_prepare($stmt_1,$query_1))
    {
        //mysqli_stmt_bind_param($stmt_1,"ss",$_POST["first_name"],$_POST["marital_status"]);//SUBSTITUTED THIS LINE FOR THE LINE BELOW.
        mysqli_stmt_bind_param($stmt_1,"ss",$_SESSION["first_name"],$_SESSION["marital_status"]);//SUBSTITUTED TO THIS LINE FROM THE LINE ABOVE.
        mysqli_stmt_execute($stmt_1);
        $result_1 = mysqli_stmt_bind_result($stmt_1,$row_count);
        mysqli_stmt_fetch($stmt_1);
        $_SESSION['row_count'] = $row_count;
        echo __LINE__; echo "<br>";//DELETE
        $_SESSION['form_step'] = 'end';
        //fetch_rows();
    }
    //Close Statement.
    mysqli_stmt_close($stmt_1);
    //Close Connection.
    mysqli_close($conn);
}
	function fetch_rows()
{   echo __LINE__; echo "<br>";//DELETE
    $form_step = $_GET['form_step'];
    
    $page_number = $_GET['page'];
    $result_per_page = $_GET['page_limit'];
    $offset = (($page_number * $result_per_page) - $result_per_page); //Offset (Row Number that 'Starts' on page).
    $max_on_page = ($page_number * $result_per_page); //(Row Number that 'Ends' on page).
    $previous_page = $page_number-1;
    $next_page = $page_number+1;
    
    echo "Row Start: $offset";echo "<br>";
    echo "Row End: $last_row_on_page";echo "<br>";
    
    //Connect to Database. (DB_SERVER, BD_USERNAME, DB_PASSWORD, DB_NAME).
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $conn = mysqli_connect("localhost","root","","powerpage");
    $conn->set_charset('utf8mb4'); //Always set Charset.
	    if($conn === false)
    {
        die("ERROR: Connection Error!. " . mysqli_connect_error());
    }
	    //$query_2 = "SELECT * FROM users WHERE first_name = ? AND marital_status = ? ORDER BY id LIMIT $offset,$last_row_on_page";
    $stmt_2 = mysqli_stmt_init($conn);
    if(mysqli_stmt_prepare($stmt_2,$query_2))
    {echo __LINE__; echo "<br>";
        //mysqli_stmt_bind_param($stmt_2,"ss",$_POST["first_name"],$_POST["marital_status"]);//SUBSTITUTED THIS LINE FOR THE LINE BELOW.
        mysqli_stmt_bind_param($stmt_2,"ss",$_SESSION["first_name"],$_SESSION["marital_status"]);//SUBSTITUTED TO THIS LINE FROM THE LINE ABOVE.
        mysqli_stmt_execute($stmt_2);
        $result_2 = mysqli_stmt_get_result($stmt_2);
        echo __LINE__; echo "<br>";
        //Grab total number of pages to paginate.
        $row_count = $_SESSION['row_count'];
        //$total_pages = ceil($result_1/$result_per_page);
        $total_pages = ceil($row_count/$result_per_page);
        
        echo "TOTAL PAGES: $total_pages<br><br>";
        
        while($row = mysqli_fetch_array($result_2,MYSQLI_ASSOC))
        {echo __LINE__; echo "<br>";
            //Retrieve Values.
            $id = $row["id"];
            $first_name = $row["first_name"];
            $middle_name = $row["middle_name"];
            $surname = $row["surname"];
            $gender = $row["gender"];
            $marital_status = $row["marital_status"];
            $working_status = $row["working_status"];
            
            echo "Id: $id<br>";
            echo "First Name: $first_name<br>";
            echo "Middle Name: $middle_name<br>";
            echo "Surname: $surname<br>";
            echo "Gender: $gender<br>";
            echo "Marital Status: $marital_status<br>";
            echo "Working Status: $working_status<br>";
            echo "<br>";
            echo "<br>";
        }   
        $i = 1;
        while($i<=$total_pages)
        {
            if($i<$total_pages)
            {
                echo "<a href='http://localhost/power.page/stack.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $i;?>'><?php echo " $i ";?></a><?php
            }
            elseif($i==$page_number)
            {
                echo "<a href='http://localhost/power.page/stack.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $i;?>'><?php echo "<b> $i </b>";?></a><?php
            }
            
            $i++;
        }
        if($page_number>$total_pages)
        {
            echo "<a href='http://localhost/power.page/stack.php?form_type=";?><?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=<?php echo $previous_page;?>'><?php echo "<b> Previous </b>";?></a><?php
        }
    }
    //Close Statement.
    mysqli_stmt_close($stmt_2);
    //Close Connection.
    mysqli_close($conn);
    
    $_SESSION['form_step'] = 'end';
}
?>
<form action="<?php echo $_SERVER['PHP_SELF'];?>?form_type=<?php echo $_SESSION['form_type'];?>&query_type=<?php echo $_SESSION['query_type'];?>&form_step=end&page_limit=2&page=1" method='POST'>
<?php
	//Added '*' (asterisk) to indicate the 'Text Field' is a 'required' one.
echo "<label for=\"first_name\">First Name *:</label>
<input type=\"text\" name=\"first_name\" placeholder=\"First Name\" value = \"\">";?>
<br>
<?php
echo "<label for=\"marital_status\">Marital Status *:</label>";
echo "<select name=\"marital_status\">";
echo "<option value=\"single\">Single</option>";
echo "<option value=\"married\">Married</option>";
echo "</select>";
echo "<br>";
?>
<input type="submit" name="search" value="Search">
</form>
	

Edited by 2020
Link to comment
Share on other sites

On 7/7/2020 at 9:44 PM, requinix said:

What the heck is that? No. No no no. There's absolutely no reason to be doing that.

Hello Requinix,

One day, if I remember you, I will explain why I did it. Ok ?

I know you want things done in simplified mode but I have my reasons for doing it this way. Ok ?

Link to comment
Share on other sites

On 7/7/2020 at 9:44 AM, requinix said:

What the heck is that? No. No no no. There's absolutely no reason to be doing that.

the main reason requinix stated that is because you are not validating input data before using it (which i have mentioned doing multiple times in this thread.) someone can cause your code to execute any php function, like phpinfo(), by simply setting $_GET['form_type'] to phpinfo when they request your page. do you really want someone to be able to see the phpinfo output from your site or execute any php function? your code needs to have direct, positive control over what gets executed on any page request.

  • Like 1
Link to comment
Share on other sites

18 hours ago, mac_gyver said:

the main reason requinix stated that is because you are not validating input data before using it (which i have mentioned doing multiple times in this thread.) someone can cause your code to execute any php function, like phpinfo(), by simply setting $_GET['form_type'] to phpinfo when they request your page. do you really want someone to be able to see the phpinfo output from your site or execute any php function? your code needs to have direct, positive control over what gets executed on any page request.

I did say I will do the validations at the end once the current issue is resolved. It now is and so I will get to the validation. And if I get stuck on it then I will pester you. ;)

As for the error messages in an array. Like I said before, I can't get my head round it and so do you mind showing a very simple example ? I will try picking up from that. Remember, I am not even an intermediate yet. And so, everything I get from you people is a learning for me.

 

Thanks

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.