Paging, Limit Paging number php - php

How can I limit the paging number in php?
i mean like this, example:
1 2 3 4 5
if number 3 clicked like this:
1 .. .. 4 5
or like this:
1 2 3 .. 5
or
.. 2 3 4 ..
so if too many paging numbers do not show all numbers
this my code:
$default_index = 0;
$default_batas = 2;
if(isset($_GET['batas']))
{
$default_batas = $_GET['batas'];
}
if(isset($_GET['halaman']))
{
$default_index = ($_GET['halaman']-1) * $default_batas;
}
$ambil_data = mysql_query("SELECT * FROM mytable ORDER BY id ASC Limit ".$default_index.", ".$default_batas);
$total_baris = mysql_num_rows(
mysql_query("SELECT * FROM mytable")
);
$nomor_paging = 1;
$html_paging = "<div>";
while($total_baris - $default_batas > 0)
{
$html_paging .= "<center><div><a href='?halaman=".$nomor_paging."&batas=".$default_batas."'>".$nomor_paging."</a></div>";
$nomor_paging++;
$total_baris -= $default_batas;
}
if($total_baris > 0)
{
$html_paging .= "<div><a href='?halaman=".$nomor_paging."&batas=".$default_batas."'>".$nomor_paging."</a></div></center>";
}
$html_paging .= "</div><br/>";
this the output code :
<?php echo $output_html?>
<?php echo $html_paging?>

Related

How to access equal number of rows in each category in mysql, php

I want to access rows from a table with matching values, In my table, I have 3 columns each column may contain 1 or 0 like below
column1 column2 column3
1 0 0
0 1 0
0 0 1
1 1 0
0 0 1
0 1 0
. . .
. . .
This is what I tried
$query = "SELECT column1, column2, column3 FROM tableName LIMIT 10";
$Res = $connection->query($query);
if($Res->rowCount() > 0) {
while($rows = $Res->fetch(PDO::FETCH_ASSOC)) {
if($rows['column1'] == 1) {
//body
}
if($rows['column2'] == 1) {
//body
}
if($rows['column3'] == 1) {
//body
}
}
}
but here I am not getting each column with 10 rows.
You have given limit 10 so it will fetch 10 rows only from table without looking if there are 0's or 1's in that column ,so to overcome this one way is to remove limit 10 instead used count to keep count of 1's and only print 10 rows. Like below :
$query = "SELECT column1, column2, column3 FROM tableName ";
$Res = $connection->query($query);
//counter for getting rows having 1's
c=0;
c1=0;
c2=0;
if($Res->rowCount() > 0) {
while($rows = $Res->fetch(PDO::FETCH_ASSOC)) {
if($rows['column1'] == 1) {
//checking if counter is < = to 10
if(c<=10){
//do something
c++;
}
}
if($rows['column2'] == 1) {
if(c1<=10){
//do something
c1++;
}
}
if($rows['column3'] == 1) {
if(c2<=10){
//do something
c2++;
}
}
}
}

How to limit foreach for multiple table as a one

I have the issue with LIMIT with foreach using PHP.
Basics: I have 50 different tables and in every table I have 2 rows.
When I try to add LIMIT 1 to $$modules_for_all, then I see 50 rows, but I want to see only 1. If I add LIMIT 2, then I see 100 rows.
How I can connect all these tables as a one LIMIT 1 to get 1 row in foreach?
<?php
for ($i = 1; $i <= 50; $i++) {
// $array_table_name contains names with tables
$table_names = $array_table_name[$i];
$modules_for_all = 'g_module_for_all_'.$i;
$$modules_for_all = $db->QueryFetchArrayAll("SELECT * FROM $table_names WHERE user='1' LIMIT 1");
}
for ($i = 1; $i <= 50; $i++) {
$modules_for_from = ${"g_module_for_all_$i"};
foreach ($modules_for_from as $m_foreach_as) {
echo $m_foreach_as['id'];
}
}
Example tables:
table_1
id date_added
1 2018-12-01 00:00:00
2 2018-12-02 00:00:00
table_2
id date_added
1 2018-12-03 00:00:00
2 2018-12-04 00:00:00
table_3
id date_added
1 2018-12-05 00:00:00
2 2018-12-06 00:00:00
Example foreach:
<?php
$array_table_name_1 = 'table_1';
$array_table_name_2 = 'table_2';
$array_table_name_3 = 'table_3';
$for_table_1 = $db->QueryFetchArrayAll("SELECT * FROM $array_table_name_1 WHERE id='1' LIMIT 1 ORDER BY date_added");
$for_table_2 = $db->QueryFetchArrayAll("SELECT * FROM $array_table_name_2 WHERE id='1' LIMIT 1 ORDER BY date_added");
$for_table_3 = $db->QueryFetchArrayAll("SELECT * FROM $array_table_name_3 WHERE id='1' LIMIT 1 ORDER BY date_added");
foreach ($for_table_1 as $m_foreach_as) {
echo $m_foreach_as['id'];
}
foreach ($for_table_2 as $m_foreach_as) {
echo $m_foreach_as['id'];
}
foreach ($for_table_3 as $m_foreach_as) {
echo $m_foreach_as['id'];
}
// Now result is '111' but I want only '1' (realted to make LIMIT 1 to all foreach)
The only way to connect the tables is by using a UNION. So you will need to build one large UNION query and then perform the select after the loop:
$tables = array();
for ($i = 1; $i <= 50; $i++) {
// $array_table_name contains names with tables
$table_names = $array_table_name[$i];
$tables[] = "(SELECT * FROM $table_names WHERE user='1')";
}
$query = implode(" UNION ", $tables) . " ORDER BY date_added LIMIT 1";
$result = $db->QueryFetchArrayAll($query);
foreach ($result as $row) {
echo $row;
}
You are gonna have to use UNION ALL for summing this rows together before ordering and limiting the results.
But keep in mind that a query like this will only work if all the tables in your array have the same structure. If they do not, then you will have to be specific in the query to make them have the same fields.
$array_table_name = [
'table_1',
'table_2',
'table_3',
];
$search_id = 1;
$selectsArray = [];
foreach ($array_table_name as $table_name) {
$selectsArray[] = "SELECT * FROM $table_name WHERE id='$search_id'\n";
}
As you see, I am using foreach() and not for() so you won't update the for by decreasing/increasing the number of tables in the array. So to finally have:
$selectsUnion = implode("UNION ALL\n", $selectsArray) . "ORDER BY date_added \nLIMIT 1";
You can see the code tested and query mounted here: https://3v4l.org/HXH2K
I solved my problem using this: foreach ($modules_for_from as $m_foreach_as) if ($tmp++ < 1) {

Select Query in Group of 10

I followed one link here, and modified my code accordingly. What I am trying to do achieve is for example a table name media_ids contains 45 rows(which is dyanamic), I want to divide the no of rows in a group of 10 rows minimum (in my case four groups of 10 rows and 1 group of 5) and execute code of each group per hour.
For example from select record from id 1 to 10 then second hour from 11 to 20 and so on unless fetches the last record and start again from id 1.
I added a tracker, which check whats the current limit and proceed.But its giving me the required result what I am trying to achieve.
<?php
require('inc/dbConnect.php');
$lastPointerq = "select tracker from media_tracker";
$lastPointerResult = mysqli_query($con, $lastPointerq);
$lastPointerRes = mysqli_fetch_row($lastPointerResult);
$lastPointer = $lastPointerRes[0];
$lastPointer10=$lastPointer+10;
$currentMediaQuery = "select * from media_ids where id > ".$lastPointer." limit ".$lastPointer.",".$lastPointer10."";
$mediaQuery = mysqli_query($con, $currentMediaQuery);
if (mysqli_num_rows($mediaQuery) > 0) {
while ($row = mysqli_fetch_assoc($mediaQuery)) {
// do stuff…
echo $id=$row['id']."<br>";
}
}
else
{echo "0";}
if ($lastPointer + 10 > 40) {
$lastPointer = 1;
} else {
$lastPointer += 10;
}
mysqli_query($con, "update media_tracker set tracker = $lastPointer");
?>
I am assuming you are calling this script every hour via ajax/Js...
In your code if you delete some data from another script you may find your first row id i.e 100 !
require('inc/dbConnect.php');
$limit = 10 ;
$lastPointerq = "select tracker from media_tracker";
$lastPointerResult = mysqli_query($con, $lastPointerq);
$lastPointerRes = mysqli_fetch_row($lastPointerResult);
$lastPointer = $lastPointerRes[0];
$lastPointerRes = mysqli_fetch_assoc($lastPointerResult);
$lastPointer = empty($lastPointerRes['tracker']) ? 0 : $lastPointerRes['tracker'] ;
$lastPointer10=$lastPointer* $limit;
$currentMediaQuery = "select * from media_ids limit ".$limit." OFFSET ".$lastPointer10."";
$mediaQuery = mysqli_query($con, $currentMediaQuery);
if (mysqli_num_rows($mediaQuery) > 0) {
while ($row = mysqli_fetch_assoc($mediaQuery)) {
// do stuff…
echo $id=$row['id']."<br>";
}
}
else
{echo "0";}
//do a total row count query here and set as value of $total rather than 40
$total =40 ;
$flag = ceil($total/$limit);
if ($lastPointer == $flag) {
$lastPointer = 0;
} else {
$lastPointer ++;
}
mysqli_query($con, "update media_tracker set tracker = $lastPointer");

SELECT ordered by something, but the id with the same order value too

i'm not that good with php, but I did the code below and hope for some little help:
<?php
$next = '';
$result = mysql_query("SELECT ID FROM table WHERE x_column < '$x_column_variable' AND Column = '$column_variable' ORDER BY x_column DESC LIMIT 1");
while($row=mysql_fetch_array($result)) {
$next_id = $row['ID'];
if ($next_id != '') {
$next = '<img src="img/next.jpg"/>';
}
}
?>
The code works but when i have multiple ids with the same x_column value, it gives me only the first one and jump to the next x_column value.
Ex: if i have
12 78 2 2 1
i get only
78 12 2 1

PHP sorting array output

UPDATE 2 (Players Handicap Index Calculation)
$sql3 = "SELECT roundID FROM rounds WHERE userID='$userID'";
$result3 = mysql_query($sql3) or die(mysql_error());
$total_rounds = mysql_num_rows($result3);
//CALCULATE USER HANDICAP INDEX IF TOTAL_ROUNDS > 4
if($total_rounds > 4){
if($total_rounds<7) { $score_count = 1; }
elseif($total_rounds<9) { $score_count = 2; }
elseif($total_rounds<11) { $score_count = 3; }
elseif($total_rounds<13) { $score_count = 4; }
elseif($total_rounds<15) { $score_count = 5; }
elseif($total_rounds<17) { $score_count = 6; }
elseif($total_rounds<18) { $score_count = 7; }
elseif($total_rounds<19) { $score_count = 8; }
elseif($total_rounds<20) { $score_count = 9; }
else { $score_count = 10; }
$sql2 = "SELECT differential FROM rounds WHERE userID='$userID' ORDER BY date DESC LIMIT 20";
$result2 = mysql_query($sql2) or die(mysql_error());
$diff_results = array();
while($row = mysql_fetch_assoc($result2)){
$diff_results[] = $row['differential'];
}
sort($diff_results);
$diff_results = array_slice($diff_results, 0, $score_count);
$handicapIndex = array_sum($diff_results) / $score_count * 0.96;
$handicapIndex = (floor($handicapIndex * 10)) / 10;
Hopefully this will give you all and idea of how I calculate a players handicap index. Now I would like to show the player (user) the rounds (date ordered) that are used to calculate his index.
Always appreciative!
UPDATE (structure of rounds table)
roundID - auto incrementing primary key
userID - INT
courseID - INT
tee - VARCHAR
differential - FLOAT
date - DATE
I am struggling to even get started with this feature I am trying to implement. Any help would be much appreciated.
I have a set of mysql db results I would like to sort by field differential. I pull them out of the db like this:
$sql4 = "SELECT * FROM rounds WHERE userID='$userID' ORDER BY date DESC LIMIT 20";
$result4 = mysql_query($sql4) or die(mysql_error());
$total_rounds = mysql_num_rows($result4);
As you can see above I counted the rows returned to run through this if-elseif-else statement to figure out how many scores I need to highlight with different css:
if($total_rounds<7) { $score_count = 1; }
elseif($total_rounds<9) { $score_count = 2; }
elseif($total_rounds<11) { $score_count = 3; }
elseif($total_rounds<13) { $score_count = 4; }
elseif($total_rounds<15) { $score_count = 5; }
elseif($total_rounds<17) { $score_count = 6; }
elseif($total_rounds<18) { $score_count = 7; }
elseif($total_rounds<19) { $score_count = 8; }
elseif($total_rounds<20) { $score_count = 9; }
else { $score_count = 10; }
For example, if $total_rounds = 16 my $score_count would be 6.
Now I need to take this data set of 16 rows and spit it out with php so I maintain my ORDER BY date while applying a different css format to the 6 figured in the above if-elseif-else statement. The $score_count is figured because I need to highlight (aka apply different css) to the 6 lowest scores of the 16 row data set WHILE maintaining my date order.
The desired output would look like this (with the * denoting the separate css format *).
01-08-2013 - 16
01-07-2012 - 1 *
01-06-2013 - 15
01-05-2012 - 2 *
01-04-2013 - 14
01-03-2012 - 3 *
01-02-2013 - 13
01-01-2012 - 4 *
12-31-2012 - 12
12-30-2012 - 5 *
12-29-2012 - 11
12-28-2012 - 6 *
12-27-2012 - 10
12-26-2012 - 9
12-25-2012 - 8
12-24-2012 - 7
Please let me know if you have questions.
Thanks
There are couple of steps that you will have to follow.
1) Sort the results with score(differential) and get the ids of the six records having lowest score.
$sql4 = "SELECT * FROM rounds WHERE userID='$userID' ORDER BY differential LIMIT 20";
$result4 = mysql_query($sql4) or die(mysql_error());
$total_rounds = mysql_num_rows($result4);
if($total_rounds<7) { $score_count = 1; }
elseif($total_rounds<9) { $score_count = 2; }
elseif($total_rounds<11) { $score_count = 3; }
elseif($total_rounds<13) { $score_count = 4; }
elseif($total_rounds<15) { $score_count = 5; }
elseif($total_rounds<17) { $score_count = 6; }
elseif($total_rounds<18) { $score_count = 7; }
elseif($total_rounds<19) { $score_count = 8; }
elseif($total_rounds<20) { $score_count = 9; }
else { $score_count = 10; }
$idsArray = array();
for($i=0; $i<$score_count; $i++){
$dets = mysql_fetch_array($result4);
$idsArray[] = $dets['roundID'];
}
2) Loop over records and match the id in array that you have made by first step. If id matches apply CSS otherwise not.
$sql4 = "SELECT * FROM rounds WHERE userID='$userID' ORDER BY date DESC LIMIT 20";
$result4 = mysql_query($sql4) or die(mysql_error());
while($dets = mysql_fetch_array($result4)){
if(in_array($dets['roundID'], $idsArray)){
//apply CSS
//display details here
}
else{
//display details here
}
}
Note: You should stop using mysql_* now. Its highly recommended by experts to use mysqli_* instead
I will take your example of $total_rounds = 16 my $score_count would be 6.
$total_rounds = 16;
$score_count = 6 // comes from the if-else loop you already have
// now we loop over the result
// the css is applied to every odd result, until $score_count is not 0
$counter = 0;
while( ( $data = mysql_fetch_assoc( $result4 ) ) !== false ) {
if( ( $counter % 2 ) && $score_count ) {
echo $data['date']; // apply your css here
} else {
echo $data['date'];
}
$counter++;
$score_count--;
}
Hope this helps.

Categories