Displaying individual data from a count query(mySQL/php) - php

I have a database called 'Telcel' and a table called 'calls'
columns in my table are id,call_from,call_to,date_time,duration,network,cost,status
I have the following code:
$conn = mysqli_connect("localhost", "daven", "H3x^g0n", "Telcel");
$query = "SELECT id, COUNT(id), call_from,ROUND(SUM(cost), 2) FROM calls GROUP BY call_from ORDER BY COUNT(id) DESC;";
$result = mysqli_query($conn, $query);
while($row = mysqli_fetch_assoc($result))
{
echo '
<tr>
<td>'. $row['call_from'] .'</td>
<td>'. $row['COUNT(id)'] .'</td>
<td>'. $row['ROUND(SUM(cost), 2)'] .'</td>
</tr>
';
}
which returns for example:
Call From Calls Cost
Shannon 10 50.2
Tom 3 7.6
I'd like when a name is selected to display all the calls, duration for each call and cost of each call made by the selected caller on the next page,So if Tom is selected display all the relevant information for Tom only, and if Shannon is selected same thing etc. Thank you.

You can sent GET requrest with url like total.php?call_from=Tom
So, you need to generate a href link with call from name :
while($row = mysqli_fetch_assoc($result)) {
<td>'. $row['call_from'] .'</td>
...
}
And total.php use $_GET["call_from"] for receiving id from url to use in query :
$call_from = $_GET["call_from"];
$query = "SELECT * FROM calls WHERE call_from = ". $call_from;
... //Display the table
Hope this help :)

Related

How can I save time to run sql query?

I am a newbie and have very minimum experience to work with php and sql. I have tried the below code but it takes very large amount of time to run.
For each member of the students6 table, his/her Name and Registration number is collected from another table collegestudents and this process takes so much time that server gives
503 error
when students6 table contains huge amount of data. How can the code be changed
to accelerate the process?
$no1=0;
$zq1=mysqli_query($con, "select *
from students6
where CollegeCode='$college'
order by UniversityRollNo");
while($zq2=mysqli_fetch_array($zq1)) {
$xpa=mysqli_query($con, "select *
from collegestudents
where UniversityRollNo='$zq2[UniversityRollNo]'
and CollegeCode='$college'");//
$xp1a=mysqli_fetch_array($xpa);
$name=$xp1a['Name'];
$rgn=$xp1a['RegistrationNo'];
++$no1;
echo "<tr>
<td align='center' >$no1</td><td>$zq2[UniversityRollNo]</td>
<td>$name</td>
<td>$rgn</td>
<td>$zq2[SubjectPaper]</td>
<td align='center'>$zq2[Course]</td>
</tr>";
}
Do both queries in one JOINED query
$no1=0;
$stmt = $con->prepare("select *
from students6 s
JOIN collegestudents c ON c.UniversityRollNo = s.UniversityRollNo
where s.CollegeCode = ?
order by s.UniversityRollNo");
$stmt->bind_param('i',$CollegeCode); //<-- assumed that was holding the code????
$stmt->execute();
$results = $stmt->get_result();
while($zq2 = $results->fetch_assoc){
$name = $xp1a['Name'];
$rgn = $xp1a['RegistrationNo'];
++$no1;
echo "<tr>
<td align='center' >$no1</td><td>$zq2[UniversityRollNo]</td>
<td>$name</td>
<td>$rgn</td>
<td>$zq2[SubjectPaper]</td>
<td align='center'>$zq2[Course]</td>
</tr>";
}

sql query to fetch data column wise in php

i have created a table with the name of machine in database.
The columns are
edition, start and stop.
From my form, I am inserting multiple start and stop time for single edition.
like wise there are multiple edition.
How to display all data below edition and loop all the rows for single edition and if edition change then it display in another table.
I want to display reports and reports is refreshing after every 30 sec.
<?php
if (isset($_SESSION['city']))
{
$city = make_safe($_SESSION['city']);
}
$sql = "SELECT Distinct * FROM machine where city = '$city' AND DATE(created) = DATE(NOW())";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
?>
<tr>
<td class="scheduletime"><?php
echo $row["starttime"];
?></td>
<td class="actualtime"><?php
echo $row["stoptime"];
?></td>
<td class="actualtime"><?php
echo $row["Message"];
?></td>
</tr>
<?php
}
?>

PHP can't fetch last id inserted correctly

I have two possible solutions for my my probrem i want to echo last id inserted to know how many people fill the form, but it affects the data on the table below. Note: this doesn't affect the database itself, just the output from the browser.
connect.php
#$db = new mysqli('127.0.0.1', 'blop', 'blop', 'blop');
if ($db->connect_errno) {
die ('Sorry, we are having some problems.');
}
displaying the results:
function returnData() {
global $db;
echo ('<style> td {border: 1px solid #000; background:#ed8043;} th {border:1px solid #000; background:#fff</style>
<table style="width:100%; text-align:center;">
<tr>
<th>Line</th>
<th>id</th>
<th>Name</th>
<th>Email</th>
<th>Visited</th>
</tr>');
$result = $db->query("SELECT * FROM `people` ORDER BY `created` DESC");
$count = $result->num_rows;
echo 'Number of visits: ' .$count.'<br><br>';
/*$visits1 = $result->fetch_assoc();
echo $visits1['id']. '<br>';
$visits2 = $db->insert_id;
echo $visits2. '<br>';*/
$row_num = 1;
while ($row = $result->fetch_object()) {
echo ('
<tr>
<td>' .$row_num. '</td>
<td>' .$row->id. '</td>
<td>' .$row->first_name. '</td>
<td>' .$row->mail. '</td>
<td>' .$row->created.'</td>
</tr>'
);
$row_num++;
}
echo ('</table><br>');
$result->free();
}
The problem is that when i try like this: 1.
$result = $db->query("SELECT * FROM `people` ORDER BY `created` DESC");
$visits1 = $result->fetch_assoc();
echo $visits1['id']. '<br>';
i actualy have one more id than what appears on the table like the image below show:
As you can see i have "756" witch is fine, because it's the last id inserted but i don't want the respective row (with the id 756), it disapeared from the table below it. When i coment the code above it works fine the first row is the last id inserted.
I have an alternative code to resolve this, the problem is this doesn't work either: 2.
$result = $db->query("SELECT * FROM `people` ORDER BY `created` DESC");
$visits2 = $db->insert_id;
echo $visits2. '<br>';
This time the table it's correct, it shows all rows but the number of total id's it's 0.
That's what fetch_* methods are doing, and that's what you need so you can iterate over them. It's simple logic of programming loops. To execute a function n times, you put it in a loop, or call it manually n times. You call it manually one time, so you have already fetched the first item from this resultset. Putting it in a while() loop will fetch the remaining elements from the resultset.
To avoid this, you'd better switch to already fetched resultset and manipulate over it.
Right now, you are breaking the single responsibility principle, because returnData gets data, makes HTML and so on.
Make a function getData() with the query, and then use it with foreach to get all the resultset.
Use it only once to get the last Id (first).
function getData() {
global $db;
$result = $db->query("SELECT .......");
while ($row = $result->fetch_object()) {
$rows[] = $row;
}
return $rows;
}
Now in returnData() you can use
getData()[0]->id
To fetch the last id, as you can also iterate through the method without losing the resultset:
foreach (getData() as $data) {
echo $data->id;
}
You'd better make function for each thing you will need in this application. Fetching the last id, fetching the whole resultset, getting the rowcount, etc. It's rarely good practice to make it from a single query/method.
To be honest, there are a lot of issues to be fixed in your code, starting from global variables, ending to dropping the functional/procedural style in favor of OOP
Try to use:
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'blop'
AND TABLE_NAME = 'people';
In the first example, you should not do the second 'fetch_...' straight away. That's because you're discarding the first row, you've already fetched.
A quick (untested, sorry for typos) fix below:
...
$row = $result->fetch_object();
echo $row->id. '<br>';
$row_num = 1;
while ($row_num == 1 || $row = $result->fetch_object()) {
echo ('
<tr>
<td>' .$row_num. '</td>
<td>' .$row->id. '</td>
<td>' .$row->first_name. '</td>
<td>' .$row->mail. '</td>
<td>' .$row->created.'</td>
</tr>'
);
$row_num++;
}
...
From php documentation:
The mysqli_insert_id() function returns the ID generated by a query on a table with a column having the AUTO_INCREMENT attribute. If the last query wasn't an INSERT or UPDATE statement or if the modified table does not have a column with the AUTO_INCREMENT attribute, this function will return zero.
So SELECT queries do not return the last inserted id.
In general this query should work for the last row of a table ordered by a column:
select column_name from table_name order by column_name desc limit 1;
For id you can also use:
select LAST_INSERT_ID() from table;
which doesn't force you to make an INSERT or UPDATE query before this query.

php mysql query whitin While loop

I have a Mysql table which is use in php, first I use while loop to fetched the rows that as below
$q1 = "SELECT * FROM same_table WHERE `t_type`=1 AND `status`=0 AND `accept`='0'";
while($row1 = $q1->fetch_assoc()){
...table to output records
echo '<tr>
<td>$row1['col1']</td>
<td>$row1['col2']</td>
</tr>';
}
this will come out necessary records successfully.
secondly, there is another row with different purpose located under each of the above query row if the condition is true, with same table (within while loop),
while($row1 = $q1->fetch_assoc()){
echo '<tr>
<td>$row1['col1']</td>
<td>$row1['col2']</td>
</tr>';
$q2 = "SELECT * FROM same_table WHERE `t_type`=1 AND `status`=0 AND `bonus_accept`='0'";
$row2 = $q2->fetch_assoc();
if(($row2['col3'] == true){
echo '<tr>
<td>$row2['col1']</td>
<td>$row2['col2']</td>
</tr>';
}
}
so far the $q2 rows is show but always repeat the first record's data only even there is several row for $q1. if the data for $row2['col1'] is 100, the rest all show 100.
Please kindly help.

PHP Row and Column Count

I was wondering if you guys can help me, I am pulling Data from a mysql database and I am looking to have the content echo in rows, like a shopping cart. Below is the code I am using. The Code is working flawlessly, but I don't know how to add the Row Count to it and Column Count to it.
Working Code:
<?
$dmealh = mysql_query("select count(*) from jobs_cart where mid='$mid'");
$jmealh = mysql_fetch_array($dmealh);
if ($jmealh[0]) {
$dmealh = mysql_query("select * from jobs_cart where mid='$mid' order by date desc, time desc");
while ($jmealh = mysql_fetch_array($dmealh)) {
echo "$id - $jmealh[name] - $jmealh[meals]";
}
}
?>
This is what I want the Data to look like:
Row Count- Name - Meal Count
1 - Greg - 3
2 - Mike - 4
3 - Tomm - 1
8 Meals Total
Just use a basic counter to keep track of what row you are on and use another variable to add up the meal count as you loop through your results and then echo out the final count. Throw it all into a table and you're set.
<?php
$dmealh = mysql_query("select count(*) from jobs_cart where mid='$mid'");
$jmealh = mysql_fetch_array($dmealh);
if ($jmealh[0]) {
$dmealh = mysql_query("select * from jobs_cart where mid='$mid' order by date desc, time desc");
$total_meals = 0; // Keep track of the total number of meals. Start at zero.
$row = 1; // Keep track of current row. Start at one.
?>
<table>
<?php
while ($jmealh = mysql_fetch_array($dmealh)) {
?>
<tr>
<td><?php echo $row; ?></td>
<td><?php echo $jmealh['name']; ?></td>
<td><?php echo $jmealh['meals']; ?></td>
</tr>
<?php
$total_meals += $jmealh[meals]; // Add to total meals
$row++; // Increase row count
}
?>
<tr>
<td></td>
<td></td>
<td><?php echo $total_meals; ?> Meals Total</td>
</tr>
</table>
}
Don't use mysql_* functions...they're deprecated (note the red box near the top).
Where does $mid come from? Make sure to escape your database inputs to prevent SQL injection.
You're doing extra work by first querying to see if any rows are returned. Just do the SELECT query and while loop. If no rows are returned, the loop will not execute.
You should be using an HTML table to display this data. Use PHP variables to keep track of your sums.
A crude example:
$mid = mysqli_real_escape_string($mid);
$rows = $total = 0;
$result = mysqli_query("SELECT name, meals FROM jobs_cart WHERE mid = '$mid' ORDER BY date DESC, time DESC");
echo '<table>';
while ($row = mysqli_fetch_assoc($result)) {
$rows++;
$total += $row['meals'];
echo '<tr><td>'. $rows .'</td><td>'. $row['name'] .'</td><td>'. $row['meals'] .'</td></tr>';
}
echo '<tr><td> </td><td> </td><td>'. $total .'</td></tr></table>';

Categories