Jump to content

Function Help!


mtnmchgrl

Recommended Posts

Can someone PLEASE help me understand this code. And before you ask YES it WAS a homework assignment that I spent hours++/days++ on, got help from my teacher, classmates, etc. but no one can figure out what I am doing wrong and why it is not working. I have already turned it in for a grade, so I'm not trying to cheat, I just want to understand what I am doing and why it is not working. I will post what i have so far.

 

The requirements for this are that I am to combine a simple select query within MySQL and use functions to break down the requirements which are:

  1. determineNumberOfPages

  2. previousButton

  3. nextButton

  4. makeNumberOfPages

 

We have a small database of birds in MySQL. The select query is to show all 31 records with 10 per page. We were to write functions that will determine the number of pages and make them (in this case it should be 4) and to have previous and next buttons as links that you can flip back and forth between. I have the required functions in a separate function file.

 

I have spent hours reading our text book, comparing code, Googling etc. and I would greatly appreciate any insight as to why this is not working.

 

Here is the first file (birdsPagination.php) code:

<?php

 

include('includes/birdsHeader.inc.html');

require_once('includes/mysqli_connect.php');

include('dbFunctions.inc.php');

 

//Connect to the db

$dbc = openDB();

//$currentPage = 'dbFunctions.inc.php';

 

 

// this variable will set the number of records to show per page:

$display = 10;

 

//DETERMINE HOW MANY PAGES THERE ARE

$pages = determineNumberOfPages ($dbc, $display);

echo "pages: $pages<br />";

 

 

// Determine where in the database to start returning results...

if (isset($_GET['s']) && is_numeric($_GET['s'])) {

$start = $_GET['s'];

} else {

$start = 0;

}

 

// Make the query:

$q = "SELECT nameGeneral, nameSpecific, populationTrend FROM birds ORDER BY nameGeneral LIMIT $start, $display;";

$r = @mysqli_query ($dbc, $q);

 

// Table header:

echo '<table border="1" align="center" cellspacing="0" cellpadding="5" width="75%">

<tr><td align="left"><b>General</b></td><td align="left"><b>Specific</b></td><td align="left"><b>Population Trend</b></td></tr>';

 

// Fetch and print all the records....

 

$bg = '#eeeeee'; // Set the initial background color.

 

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {

 

$bg = ($bg=='#eeeeee' ? '#ffffff' : '#eeeeee'); // Switch the background color.

 

//rid ugly empty table cell display

if ($row['populationTrend'] == "") {

$row['populationTrend'] = " ";

}

 

echo '<tr bgcolor="' . $bg . '">

<td align="left">' . $row['nameGeneral'] . '</td>

<td align="left">' . $row['nameSpecific'] . '</td>

<td align="left">' . $row['populationTrend'] . '</td>

</tr>

';

 

} // End of WHILE loop.

 

echo '</table>';

mysqli_free_result ($r);

mysqli_close($dbc);

 

echo $pages;

 

// Make the links to other pages, if necessary.

if ($pages > 1) {

echo "start: $start display: $display<br />";

 

// Add some spacing and start a paragraph:

echo '<br /><p>';

 

// Determine what page the script is on:

$current_page = ($start/$display) + 1;

echo $current_page . "<br>";

 

//Call Previous Button Function

$prev = previousButton ($current_page, $display, $pages);

 

//Call the function to create the number of pages

$makePage = makeNumberOfPages ($current_page, $thisPage, $pages);

 

//Call  Next Button Function

$next = nextButton ($current_page, $display, $pages);

 

echo '</p>'; // Close the paragraph.

 

 

include ('includes/birdsFooter.inc.html');

 

} // End of links section.

 

 

?>

 

Here is the function file code:

<?php

 

//Function to Open MySQL & Db

function openDB() {

DEFINE('DB_USER', 'root');

DEFINE('DB_PASSWORD', '');

DEFINE('DB_HOST', 'localhost');

DEFINE('DB_NAME', 'birds_db');

$dbc = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) OR exit  ('Could not connect to MySQL: ' . mysqli_connect_error());

return $dbc;

} //end of function

 

//Determine how many pages there are...

function determineNumberOfPages($dbc, $display) {

if (isset($_GET['p']) &&

is_numeric($_GET['p'])) { // Already been determined.

$pages = $_GET['p'];

} else { // Need to determine.

 

// Count the number of records:

$q = "SELECT COUNT(birdID) FROM birds";

$r = @mysqli_query ($dbc, $q);

$row = @mysqli_fetch_array ($r, MYSQLI_NUM);

$records = $row[0];

 

// Calculate the number of pages...

if ($records > $display) { // More than 1 page.

$pages = ceil ($records/$display);

} else {

$pages = 1;

}

}

return $pages;

} //end of function

 

//Function to make each query result listing have a page number:

function makeNumberOfPages ($current_page, $thisPage, $pages) {

 

// Make all the numbered pages:

for ($i = 1; $i <= $pages; $i++) {

if ($i != $current_page) {

echo '<a href="birdsPagination.php?s=' . (($display * ($i - 1))) . '&p=' . $pages . '">' . $i . '</a> ';

} else {

echo $i . ' ';

}

} // End of FOR loop.

 

} //end of function

 

 

//Function for the Previous Button (to go back); If it's not the first page, make a Previous button:

 

function previousButton ($current_page, $display, $pages) {

if ($pages >1) {

echo '<br /> <p>';

$current_page=($start/$display) +1;

if ($current_page != 1) {

echo '<a href="birdsPagination.php?s=' . ($start - $display) . '&p=' . $pages . '">Previous</a>';

}

}

} //end of function

 

//Function for the next button, if multiple pages exist; If it's not the last page, make a Next button:

 

function nextButton ($current_page, $display, $pages) {

if ($current_page != $pages) {

echo '<a href="birdsPagination.php?s=' . ($start + $display) . '&p=' . $pages . '">Next</a>';

}

} //end of function

 

 

?>

Link to comment
Share on other sites

I see at least one siginificant problem. You should really use CODE tags when posting.

 

You are passing 'p' on the query string to determine the current page to display. But, in your logic for determineNumberOfPages() if $_GET['p'] is defined you are returning that value as the number of pages. The number of pages has no bearing on the current page.

 

function determineNumberOfPages($dbc, $display) {   
      if (isset($_GET['p']) && 
      is_numeric($_GET['p'])) { // Already been determined.
      $pages = $_GET['p'];
      } else { // Need to determine.

Link to comment
Share on other sites

any clues from you about what exactly isn't working or do we have to guess?

 

I'm sorry, I thought i had stated properly in the question... :(

My Previous, Next buttons are not working, nor are the functions which should display the total number of pages from the query results (should be 1,2,3,4, previous and next buttons all of which are hyperlinks). Does that help?

Link to comment
Share on other sites

I added code tags........

 

Pagination File:

<?php

include('includes/birdsHeader.inc.html');
require_once('includes/mysqli_connect.php');
include('dbFunctions.inc.php');

//Connect to the db
$dbc = openDB();
//$currentPage = 'dbFunctions.inc.php';


// this variable will set the number of records to show per page:
$display = 10;

//DETERMINE HOW MANY PAGES THERE ARE
$pages = determineNumberOfPages ($dbc, $display);
echo "pages: $pages<br />";


// Determine where in the database to start returning results...
	if (isset($_GET['s']) && is_numeric($_GET['s'])) {
	$start = $_GET['s'];
	} else {
	$start = 0;
	}

// Make the query:
$q = "SELECT nameGeneral, nameSpecific, populationTrend FROM birds ORDER BY nameGeneral LIMIT $start, $display;";
$r = @mysqli_query ($dbc, $q);

// Table header:
echo '<table border="1" align="center" cellspacing="0" cellpadding="5" width="75%">
<tr><td align="left"><b>General</b></td><td align="left"><b>Specific</b></td><td align="left"><b>Population Trend</b></td></tr>';

// Fetch and print all the records....

$bg = '#eeeeee'; // Set the initial background color.

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {

$bg = ($bg=='#eeeeee' ? '#ffffff' : '#eeeeee'); // Switch the background color.

//rid ugly empty table cell display
if ($row['populationTrend'] == "") {
	$row['populationTrend'] = " ";
}

echo '<tr bgcolor="' . $bg . '">
	<td align="left">' . $row['nameGeneral'] . '</td>
	<td align="left">' . $row['nameSpecific'] . '</td>
	<td align="left">' . $row['populationTrend'] . '</td>
</tr>
';

	} // End of WHILE loop.

echo '</table>';
mysqli_free_result ($r);
mysqli_close($dbc);

echo $pages; 

// Make the links to other pages, if necessary.
if ($pages > 1) {
echo "start: $start display: $display<br />";

// Add some spacing and start a paragraph:
echo '<br /><p>';

// Determine what page the script is on:	
$current_page = ($start/$display) + 1;
echo $current_page . "<br>";

//Call Previous Button Function	
$prev = previousButton ($current_page, $display, $pages);

//Call the function to create the number of pages
$makePage = makeNumberOfPages ($current_page, $thisPage, $pages);

//Call  Next Button Function	
$next = nextButton ($current_page, $display, $pages);

echo '</p>'; // Close the paragraph.


include ('includes/birdsFooter.inc.html');	

} // End of links section.


?>

 

 

Functions File:

<?php

//Function to Open MySQL & Db
function openDB() {
	DEFINE('DB_USER', 'root');
	DEFINE('DB_PASSWORD', '');
	DEFINE('DB_HOST', 'localhost');
	DEFINE('DB_NAME', 'birds_db');
	$dbc = @mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) OR exit  ('Could not connect to MySQL: ' . mysqli_connect_error());
	return $dbc;
	}	//end of function

//Determine how many pages there are...
function determineNumberOfPages($dbc, $display) {	
	if (isset($_GET['p']) && 
	is_numeric($_GET['p'])) { // Already been determined.
	$pages = $_GET['p'];
	} else { // Need to determine.

	// Count the number of records:
$q = "SELECT COUNT(birdID) FROM birds";
$r = @mysqli_query ($dbc, $q);
$row = @mysqli_fetch_array ($r, MYSQLI_NUM);
$records = $row[0];

// Calculate the number of pages...
if ($records > $display) { // More than 1 page.
	$pages = ceil ($records/$display);
} else {
	$pages = 1;
}	
}
return $pages;
}	//end of function

//Function to make each query result listing have a page number:	
function makeNumberOfPages ($current_page, $thisPage, $pages) {

	// Make all the numbered pages:
for ($i = 1; $i <= $pages; $i++) {
	if ($i != $current_page) {
		echo '<a href="birdsPagination.php?s=' . (($display * ($i - 1))) . '&p=' . $pages . '">' . $i . '</a> ';
	} else {
		echo $i . ' ';
	}
} // End of FOR loop.

}	//end of function


//Function for the Previous Button (to go back); If it's not the first page, make a Previous button:

function previousButton ($current_page, $display, $pages) {
	if ($pages >1) {
	echo '<br /> <p>';
	$current_page=($start/$display) +1;
	if ($current_page != 1) {
		echo '<a href="birdsPagination.php?s=' . ($start - $display) . '&p=' . $pages . '">Previous</a>';
	}
	}
	}	//end of function

//Function for the next button, if multiple pages exist; If it's not the last page, make a Next button:

function nextButton ($current_page, $display, $pages) {
	if ($current_page != $pages) {
		echo '<a href="birdsPagination.php?s=' . ($start + $display) . '&p=' . $pages . '">Next</a>';
	}
	}	//end of function


?>

 

 

Link to comment
Share on other sites

one thing

$prev = previousButton ($current_page, $display, $pages);

   //Call the function to create the number of pages
   $makePage = makeNumberOfPages ($current_page, $thisPage, $pages);

   //Call  Next Button Function   
   $next = nextButton ($current_page, $display, $pages);

 

those functions don't return anything, so there is no need to assign them to anything

 

but from skimming over the code, I don't see anything horrible going on. What is happening when you run this script? some insight on what is happening, and what you hope to happen will help figure out what is wrong

 

 

Link to comment
Share on other sites

one thing

$prev = previousButton ($current_page, $display, $pages);

   //Call the function to create the number of pages
   $makePage = makeNumberOfPages ($current_page, $thisPage, $pages);

   //Call  Next Button Function   
   $next = nextButton ($current_page, $display, $pages);

 

those functions don't return anything, so there is no need to assign them to anything

 

but from skimming over the code, I don't see anything horrible going on. What is happening when you run this script? some insight on what is happening, and what you hope to happen will help figure out what is wrong

 

When I run the script, only 20 birds show up. The 31 birds SHOULD be on 4 total pages, in alphabetical order based on the query. Page 1, will have 10. Page 2 will have 10. Page 3, will have 10 and page 4 should have 1. I am only seeing 20 of the 31 birds. The "previous" link (which should take you from page 4 to page 3, 3 to 2 and so on and so forth) doesn't show up AT ALL. The next button, shows up but it will only let me go from page 1 to page 2. Then it stops. When I click on the page 3 link it seems to go back to the results from page 1. The page 4 link seems to do nothing.

 

When you say:

those functions don't return anything, so there is no need to assign them to anything

I'm confused by this. The main part of this assignment is making the previous, next and page number links into separate functions so they need to probably return something in order for them to work and for me to complete what my teacher was looking for.

 

Sorry if I am asking dumb question(s).  :shrug:

 

Link to comment
Share on other sites

I see at least one siginificant problem. You should really use CODE tags when posting.

 

You are passing 'p' on the query string to determine the current page to display. But, in your logic for determineNumberOfPages() if $_GET['p'] is defined you are returning that value as the number of pages. The number of pages has no bearing on the current page.

 

function determineNumberOfPages($dbc, $display) {   
      if (isset($_GET['p']) && 
      is_numeric($_GET['p'])) { // Already been determined.
      $pages = $_GET['p'];
      } else { // Need to determine.

 

I'm very sorry but I am totally lost in what you are saying here......i think this code is to get how many pages based on the number of records. If there are only enough records for 1 page then it would just show up as one page but if its more, then 2, 3, 4, etc. would show up.

 

If it helps, I"m going to upload a screen shot of what this looks like when it runs....you can kind of get the idea of what i am trying to achieve on the end result.

 

263v86d.jpg

Link to comment
Share on other sites

Can anyone help? I decided to start all the way over and take out ALL functions and do the code EXACTLY as it is in the book and lo and behold there are STILL problems with the pages as links so i don't think its the functions that are the problems........... see below:

	<?php

include('includes/birdsHeader.inc.html');
require_once('includes/mysqli_connect.php');

// this variable will set the number of records to show per page:
$display = 10;

	//determine pg #
	if (isset($_GET['p']) && is_numeric($_GET['p'])) { 
	$pages = $_GET['p'];
	} else {

 	// Count the number of records:
$q = "SELECT COUNT(birdID) FROM birds";
$r = @mysqli_query ($dbc, $q);
$row = @mysqli_fetch_array ($r, MYSQLI_NUM);
$records = $row[0];

		// Calculate the number of pages...
if ($records > $display) { 
	$pages = ceil ($records/$display);	
} else {	//IF the query run is 10 records or less.......
	$pages = 1;	//then the only page listed will be page 1
}	
}


// Determine where in the database to start returning results...
	if (isset($_GET['s']) && is_numeric($_GET['s'])) {
	$start = $_GET['s'];
	} else {
	$start = 0;
	}

// Make the query with the LIMIT clause:
$q = "SELECT nameGeneral, nameSpecific, populationTrend FROM birds ORDER BY nameGeneral LIMIT $start, $display";
$r = @mysqli_query ($dbc, $q);

// HTML FOR THE TABLE HEADER/COLUMN NAMES/ALT COLOR:
echo '<table border="3" align="center" cellspacing="5" cellpadding="5" width="50%">
<tr><td align="left"><b>General Name</b></td><td align="left"><b>Specific Name</b></td><td align="left"><b>Population Trend</b></td></tr>';

// Fetch and print all the records...

$bg = '#eeeeee'; // Set the initial background color.

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {

$bg = ($bg=='#eeeeee' ? '#ffffff' : '#eeeeee'); // Switch the background color.


echo '<tr bgcolor="' . $bg . '">
	<td align="left">' . $row['nameGeneral'] . '</td>
	<td align="left">' . $row['nameSpecific'] . '</td>
	<td align="left">' . $row['populationTrend'] . '</td>
</tr>	';

	} // End of WHILE loop.

echo '</table>';
mysqli_free_result ($r);
mysqli_close($dbc);

//THIS IS THE END OF THE HTML TABLE SET UP

   		//Links to other pages if necc
	if ($pages > 1) {	
	echo '<br /><p>';
	$current_page=($start/$display) +1;	

	//previous
	if ($current_page != 1) {	
		echo '<a href="birdsPagination.php?s=' . ($start - $display) . '&p=' . $pages . '">Previous</a>';	
	}

	// Make all the numbered pages:
	for ($i = 1; $i <= $pages; $i++) {
	if ($i != $current_page) {
		echo '<a href="birdsPagination.php?s=' . (($display * ($i - 1))) . '&p=' . $pages . '">' . $i . '</a> ';
	} else {
		echo $i . ' ';
	}
} // End of FOR loop.

	//NEXT
		if ($current_page != $pages) {
		echo '<a href="birdsPagination.php?s=' . ($start + $display) . '&p=' . $pages . '">Next</a>';
	}


echo '</p>';

} 	//end of links

include ('includes/birdsFooter.inc.html');	

?>

Link to comment
Share on other sites

To add to this ongoing saga, I am also supposed to have the columns be sortable by ascending or descending order by clicking on them. I only have them in ascending sort order by a switch statement. Any idea how to make them sortable by descending as well?

<?php

include('includes/birdsHeader.inc.html');
require_once('includes/mysqli_connect.php');

// this variable will set the number of records to show per page:
$display = 10;

	//determine pg #
	if (isset($_GET['p']) && is_numeric($_GET['p'])) { 
	$pages = $_GET['p'];
	} else {

 	// Count the number of records:
$q = "SELECT COUNT(birdID) FROM birds";
$r = @mysqli_query ($dbc, $q);
$row = @mysqli_fetch_array ($r, MYSQLI_NUM);
$records = $row[0];

		// Calculate the number of pages...
if ($records > $display) { 
	$pages = ceil ($records/$display);	
} else {	//IF the query run is 10 records or less.......
	$pages = 1;	//then the only page listed will be page 1
}	
}


// Determine where in the database to start returning results...
	if (isset($_GET['s']) && is_numeric($_GET['s'])) {
	$start = $_GET['s'];
	} else {
	$start = 0;
	}

	//DETERMINE THE SORT
	$sort = (isset($_GET['sort'])) ? $_GET ['sort'] : 'ng';

	//DETERMINE THE SORT ORDER
	switch ($sort) {
		case 'ng':
		$order_by = 'nameGeneral ASC';
		break;
		case 'ns':
		$order_by = 'nameSpecific ASC';
		break;
		case 'pt':
		$order_by = 'populationTrend ASC';
		break;
	}



// Make the query with the LIMIT clause:
$q = "SELECT nameGeneral, nameSpecific, populationTrend, birdID FROM birds ORDER BY $order_by LIMIT $start, $display";
$r = @mysqli_query ($dbc, $q);

// HTML FOR THE TABLE HEADER/COLUMN NAMES/ALT COLOR:
echo '<table border="3" align="center" cellspacing="5" cellpadding="5" width="50%">
<tr><td align="left"><b><a href="TestNoFuncAddSort.php?sort=ng">General Name</a></b></td><td align="left"><b><a href="TestNoFuncAddSort.php?sort=ns">Specific Name</a></b></td><td align="left"><b><a href="TestNoFuncAddSort.php?sort=pt">Population Trend</a></b></td></tr>';

// Fetch and print all the records...

$bg = '#eeeeee'; // Set the initial background color.

while ($row = mysqli_fetch_array($r, MYSQLI_ASSOC)) {

$bg = ($bg=='#eeeeee' ? '#ffffff' : '#eeeeee'); // Switch the background color.


echo '<tr bgcolor="' . $bg . '">
	<td align="left">' . $row['nameGeneral'] . '</td>
	<td align="left">' . $row['nameSpecific'] . '</td>
	<td align="left">' . $row['populationTrend'] . '</td>
</tr>	';

	} // End of WHILE loop.

echo '</table>';
mysqli_free_result ($r);
mysqli_close($dbc);

//THIS IS THE END OF THE HTML TABLE SET UP

   		//Links to other pages if necc
	if ($pages > 1) {	
	echo '<br /><p>';
	$current_page=($start/$display) +1;	

	//previous
	if ($current_page != 1) {	
		echo '<a href="birdsPagination.php?s=' . ($start - $display) . '&p=' . $pages . '&sort' . $sort .  '">Previous</a>';	
	}

	// Make all the numbered pages:
	for ($i = 1; $i <= $pages; $i++) {
	if ($i != $current_page) {
		echo '<a href="birdsPagination.php?s=' . (($display * ($i - 1))) . '&p=' . $pages . '&sort=' . $sort . '">' . $i . '</a> ';
	} else {
		echo $i . ' ';
	}
} // End of FOR loop.

	//NEXT
		if ($current_page != $pages) {
		echo '<a href="birdsPagination.php?s=' . ($start + $display) . '&p=' . $pages . '&sort=' . $sort .  '">Next</a>';
	}


echo '</p>';

} 	//end of links

include ('includes/birdsFooter.inc.html');	

?>

 

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.