Help with pagination - sql-server

I have created pagination and it is currently working, but the only issue is if I have thousands and thousands of results... the display would be:
[1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18] and so on.
I just want the display the page to display to look similar to this:
previous [1][2][3][4][5]... next
previous ...[5][6][7][8][9][10]...next
Can anyone give advice or supply some example code that would give me a result like above? If anything is at all unclear please let me know!
Cheers,
Neil
The code that I am currently using is below:
<?php
/*data base connection */
include "datebase connection";
/* SQL query */
$tsql = (" SELECT TOP 100 tie_parent_id, CAST(geo_post AS varchar(6)) + '.' + CAST(geo_sample AS varchar(6)) AS Mile, gps_lat, gps_long, rotten, split, wheel_cut, broken, quality
FROM database
");
$stmt = sqlsrv_query($conn,$tsql, array(), array( "Scrollable" => 'static'));
if( $stmt === false)
{
echo "Error in query preparation/execution.\n";
die( print_r( sqlsrv_errors(), true));
}
/* DETERMINING THE NUMBER OF ROWS (AND PAGES) */
// Set the number of rows to be returned on a page.
$rowsPerPage = 10;
// Get the total number of rows returned by the query.
$rowsReturned = sqlsrv_num_rows($stmt);
if($rowsReturned === false)
die( print_r( sqlsrv_errors(), true));
elseif($rowsReturned == 0)
{
echo "No rows returned.";
exit();
}
else
{
/* Calculate number of pages. */
$numOfPages = ceil($rowsReturned/$rowsPerPage);
}
/* FUNCTION FOR PAGING */
function getPage($stmt, $pageNum, $rowsPerPage )
{
$offset = ($pageNum - 1) * $rowsPerPage;
$rows = array();
$i = 0;
while($row = sqlsrv_fetch_array($stmt,
SQLSRV_FETCH_NUMERIC,
SQLSRV_SCROLL_ABSOLUTE,
$offset + $i)
&& $i < $rowsPerPage)
{
array_push($rows, $row);
$i++;
}
$row = sqlsrv_fetch_array($stmt,SQLSRV_FETCH_NUMERIC,SQLSRV_SCROLL_ABSOLUTE, $offset -1);
return $rows;
}
// Display the selected page of data.
echo "<table width='800' border='0'>";
echo "<tr> <th>Tie ID</th> <th>Mile/Yard</th> <th>GPS Lat</th><th>GPS Long</th><th>Rotten</th><th>Split</th><th>WheelCut</th> <th>Broken</th><th>Quality</th> </tr>";
// keeps getting the next row until there are no more to get
$pageNum = isset($_GET['pageNum']) ? $_GET['pageNum'] : 1;
$page = getPage($stmt, $pageNum, $rowsPerPage);
$color1 = "#ffffff";
$color2 = "#edf5fa";
$row_count = "0";
while($row_count<10 ) {
$row=sqlsrv_fetch_array($stmt);
$tie_parent_id = $row["tie_parent_id"];
$geo_post = $row["Mile"];
$lat =$row["gps_lat"];
$long =$row["gps_long"];
$rotten =$row["rotten"];
$split =$row["split"];
$wheelcut =$row["wheel_cut"];
$broken =$row["broken"];
$quality =$row["quality"];
$row_color = ($row_count % 2) ? $color1 : $color2;
?>
<tr>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["tie_parent_id"]; ?></td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["Mile"];?> </td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["gps_lat"];?></td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["gps_long"];?></td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["rotten"];?></td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["split"];?></td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["wheel_cut"];?></td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["broken"];?></td>
<td bgcolor="<?php echo $row_color ?>">
<?php echo $row["quality"];?></td>
</td></tr>
<?php
$row_count++;
}
?>
<?php
/* PREVIOUS PAGE NAVIGATION TOP OF PAGE */
// Display Previous Page link if applicable.
if($pageNum > 1)
{
$prevPageLink = "?pageNum=".($pageNum - 1);
echo "<a href='$prevPageLink'>Previous Page</a>&nbsp";
}
/*DISPLAYING LINKS TO PAGES TOP OF PAGE*/
for($i = 1; $i<=$numOfPages; $i++)
{
$pageLink = "?pageNum=$i";
print("<a href=$pageLink>$i</a> ");
}
/* NEXT PAGE NAVIGATION TOP OF PAGE */
// Display Next Page link if applicable.
if($pageNum < $numOfPages)
{
$nextPageLink = "?pageNum=".($pageNum + 1);
echo " <a href='$nextPageLink'>Next Page</a>";
}
?>
</form>
<?php
/* Close the connection. */
sqlsrv_close( $conn);
?>

The change is actually not too crazy - you have most of it. Your algorithm needs to change just a little bit for the display of the pages - so instead of running your loop like you have:
/*DISPLAYING LINKS TO PAGES TOP OF PAGE*/
for($i = 1; $i<=$numOfPages; $i++)
{
$pageLink = "?pageNum=$i";
print("$i ");
}
You need to start at the current page number that you are on...
/*first check to make sure the number of pages don't exceed maximum*/
$totalPagesToLoop = $pageNum + $numOfPages;
if($totalPagesToLoop > ceiling(total number of pages required to show all the records ([number of total rows]/[number of rows to show per page])
{
$totalPagesToLoop = ceiling(total number of pages required to show all the records ([number of total rows]/[number of rows to show per page]);
}
/*DISPLAYING LINKS TO PAGES TOP OF PAGE*/
for($i = $pageNum; $i<=$totalPagesToLoop; $i++)
{
$pageLink = "?pageNum=$i";
print("$i ");
}
But - thats not all, you will now have to code the special 'previous' and 'next' buttons (you decide how many to increment when you click on that - google increments by 1, until it reaches 20, and then just shows 20 at a time, moving one by one. You'll have to test your variable to decide whether to show the 'previous' or 'next' button at all...

I managed to resolve the issue by using the below code:
for($i = $pageNum; $i<=$numOfPages&&$pagesadded<=9; $i++)
{
$pagesadded+=1;
$pageLink = "?pageNum=$i";
print("<a href=$pageLink>$i</a> ");
}
It displays 10 pages at a time.
Cheers,
Neil

Related

How to put a database into an array

I finally succeeded in making an image carousel by using php.
The code below works, but there are no images in it.
Now I am trying to make this array to get data from a Mysql database.
Could you show me an example of how do I do it?
<?php
//MySQL database connection
$mysqli = new mysqli('localhost', 'root', '', 'webshop');
$SQL = "SELECT image FROM productlist LIMIT 5";
$result = $mysqli->query($SQL);
$array = array(
0 => "picture1.jpg",
1 => "picture2.jpg",
2 => "picture3.jpg",
3 => "picture4.jpg",
4 => "picture5.jpg",
5 => "kalle6.jpg",
);
//Goes to previous page when clicking on prev
$index = $_GET['start'];
if ($index > 0) {
echo ' prev ';
} else {
echo ' prev ';
}
//Display 3 images
$show_img = 3;
$num_img = 0;
for($i = $_GET['start']; $i<count($array) && $num_img < $show_img; $i++) {
$num_img++;
echo "<img src=".$array[$i]."/>\n";
}
for($i=$num_img; $i<$show_img;$i++) {
echo "<img src=".(count($array) - 1)."/>\n";
}
//Goes to next page when clicking on next
if ($index < count($array) - 1) {
echo ' next ';
} else {
echo ' next ';
}
?>
You should have a look at this: http://php.net/manual/en/mysqli-result.fetch-array.php
/* numeric array */
/* $row is your $array */
$row = $result->fetch_array(MYSQLI_NUM);
echo "<pre>";
print_r($row);
echo "<pre>";
This should help you get the result you want

Wordpress: Conditionally show stripped tag or post title. "Array" gets printed

What I'm trying to achieve:
Show either the post tag (without the link) or the title.
If a tag exists, that gets printed if it doesn't, the title gets used.
Issue: I've used get_the_tags() as suggested in the Codex to get the tag without the link and that works, yet it gets the word "Array" printed as a preffix, too.
<?php
if( has_tag() )
{
echo $posttags = get_the_tags();
if ($posttags) {
foreach($posttags as $tag) {
echo $tag->name . ' ';
}
}
}
else { echo the_title(); };
?>
What am I missing?
You are echo ing $posttags which is an array. If you echo an array it will echo array as output
<?php
if( has_tag() )
{
This is printing Array as prefix ----> echo $posttags = get_the_tags();
if ($posttags) {
foreach($posttags as $tag) {
echo $tag->name . ' ';
}
}
}
else { echo the_title(); };
?>
Please remove that echo , so your new code will be
<?php
if( has_tag() )
{
$posttags = get_the_tags();
if ($posttags) {
foreach($posttags as $tag) {
echo $tag->name . ' ';
}
}
}
else { echo the_title(); };
?>
Hope this helps you

Expanding Rows for Unique Checkboxes

I was just recently given a project for my job to write a script that compares two mysql databases and print out information into an html table. Currently, I am trying to insert a checkbox by each individual's name and when selected, rows pertaining to that individual will expand underneath the person's name. I am combining javascript into my script to do this, although I really have no experience is it. The problem I am having is that when any checkbox is selected, all the rows for each individual is expanding instead of the rows pertaining only to the one individual selected.
Here is my code so far:
PHP Code:
<?php
$link = mysql_connect ($server = "harris.lib.fit.edu", $username = "", $password = "") or die(mysql_error());
$db = mysql_select_db ("library-test") or die(mysql_error());
$ids = mysql_query("SELECT * FROM `ifc_studylog`") or die(mysql_error()); //not single quotes (tilda apostrophy)
$x=0;
$n=0;
while($row = mysql_fetch_array( $ids ))
{
$tracksid1[$x] = $row['fitID'];
$checkin[$x] = $row['checkin'];
$checkout[$x] = $row['checkout'];
$n++;
$x++;
}
$names = mysql_query("SELECT * FROM `ifc_users`") or die(mysql_error()); //not single quotes (tilda apostrophy)
$x=0;
while($row = mysql_fetch_array( $names ))
{
$tracksnamefirst[$x] = $row['firstName'];
$tracksnamesecond[$x] = $row['lastname'];
$tracksid2[$x] = $row['fitID'];
$tracksuser[$x] = $row['tracks'];
$x++;
}
$x=0;
foreach($tracksid2 as $comparename)
{
$chk = strval($x);
?>
JS Code:
$(window).load(function() {
$('.varx').click(function() {
$('.text').toggle(this.checked);
});
});​
PHP Code:
<?php
echo '<td><input id = "<?=$chk?>" type="checkbox" class="varx" /></td>';
echo '<td align="center">'.$comparename.'</td>';
echo'<td align="center">'.$tracksnamefirst[$x].'</td>';
echo'<td align="center">'.$tracksnamesecond[$x].'</td>';
$z=0;
foreach($tracksid1 as $compareid)
{
$HH=0;
$MM =0;
$SS =0;
if($compareid == $comparename)// && $tracks==$tracksuser[$x])
{
$SS = sprintf("%02s",(($checkout[$z]-$checkin[$z])%60));
$MM = sprintf("%02s",(($checkout[$z]-$checkin[$z])/60 %60));
$HH = sprintf("%02s",(($checkout[$z]-$checkin[$z])/3600 %24));
// echo'<td align="center">'.$HH.':'.$MM.':'.$SS.'</td>';
echo '</tr>';
echo '<tr>';
echo "<td id='txt' class='text' align='center' colspan='2' style='display:none'></td>";
echo "<td id='txt' class='text' align='center' style='display:none'>".$checkin[$z]."</td>";
echo '</tr>';
}
echo '<tr>';
$z++;
echo '</tr>';
}
$x++;
}
}
?>
Any help is appreciated and apologies if I am too vague on the subject. The username and password have been left out for security reasons.

PHP After every NTH in DIV LOOP

Hi I want to add content after every 3rd div in the loop. Here is below code but I am not getting even render content "Hi this is the 3d div"
Its not detecting every 3rd div.
<?php
function q_list_item($q_item)
{
$count = 0;
$this->output('<DIV>');
$this->my_items;
$this->output('</DIV>');
$count++;
if($count % 3 == 0) {
echo 'Hi this is the 3rd div';
}
}
?>
----[Actual Function]-----------------------------------------------
<?php
function q_list_item($q_item)
{
$this->output('<DIV CLASS="qa-q-list-item'.rtrim(' '.#$q_item['classes']).'" '.#$q_item['tags'].'>');
$this->q_item_stats($q_item);
$this->q_item_main($q_item);
$this->q_item_clear();
$this->output('</DIV> <!-- END qa-q-list-item -->', '');
}
?>
You are resetting the $count to 0 at the top of this function, so it will always be 1 when you run the if statement at the end of the function.
This may help with your issue, although I can't tell if your code is in a class or not as it doesn't look like it is, but you are using $this-> in there. Essentially, move the instantiation of the counter outside of the function:
<?php
$q_list_count = 0;
function q_list_item($q_item)
{
$q_list_count++;
$this->output('<DIV>');
$this->my_items;
$this->output('</DIV>');
if($q_list_count % 3 == 0) {
echo 'Hi this is the 3rd div';
}
}
?>
<?php
$count = 0;
function q_list_item($q_item)
{
$this->output('<DIV>');
$this->my_items;
$this->output('</DIV>');
$count++;
if($count % 3 == 0) {
echo 'Hi this is the 3rd div';
}
}
?>
initialize the $count outside the loop, otherwise count will always be 1 when it reaches the if statement

codeigniter join problem

i have 2 tabels in my database "forum_traad" and "forum_kommentare" but they have the same row "indhold" so when i try to join forum_traad and forum_kommentare and i wanna echo the "indhold" row from "forum_traad" it echo the "indhold" from "forum_kommentare", what can i do?
my view:
<div id="forum">
<?php
if($query)
{
?>
<div class="forum_headline">Forum kategori - Forum tråde - <?php echo $query->overskrift; ?></div><!-- forum_headline -->
<div class="forum_profil_img"></div><!-- forum_profil_img -->
<div class="forum_post_content">
<span style="font-size:15px;"><?php echo anchor('profil/'.$query->brugernavn, $query->brugernavn); ?></span>
<span style="font-size:11px; margin-left:3px; color:#686868;"><i> Siger</i></span><br>
<?php echo $query->indhold;
echo "<br>ID: ".$query->id;
?>
</div><!-- forum_post_content -->
<?php
} else {
echo "Der blev ikke fundet nogen post";
}
?>
</div><!-- forum -->
My model
function posts($id)
{
$this->db->select('*');
$this->db->from('forum_traad');
$this->db->join('forum_kommentare', 'forum_kommentare.fk_forum_traad', 'forum_traad.id');
$this->db->where('forum_traad.id', $id);
$query = $this->db->get();
if($query->num_rows > 0)
{
return $query->row();
} else {
return false;
}
}
You can give them a different name:
$this->db->select('forum_traad.indhold as traad_indhold,
forum_kommentare.indhold as kommentare_indhold');
If you need the functionality of * you can in addition select:
$this->db->select('forum_traad.indhold as traad_indhold,
forum_kommentare.indhold as kommentare_indhold,
forum_traad.*,
forum_kommentare.*');

Resources