Split query in several positions - php

I have a website where I need to split a result query that gives me all my groups because I want to handle all the groups individualy.
This is my code ( result 6 is the query i make to obtain all the group names). But the problem is that all the result appear in the same position -> [0] zero.
This is an image of the problem
<?php while ($row = mysqli_fetch_array($result6)){ ?>
<tr>
<?php if(strlen($row['groupname'])>0){ ?>
<?php $groups = $row['groupname'];
$dividedGroups= (explode(",",$groups));
print_r($dividedGroups)
?>
</br>
<?php } ?>
</tr>
<?php } ?>

I guess more data is needed, but as far as I can tell you are ending with an array of arrays.
After this line:
$dividedGroups= (explode(",",$groups));
Try to add this two lines in order to transform it to a simple array:
$dividedGroups= array_map("array_shift",$dividedGroups);
$dividedGroups= array_map("array_values",$dividedGroups);

You don't need to split by comma as each row represent a group:
<?php
while ($row = mysqli_fetch_array($result6)) {
if(strlen($row['groupname'])>0) {
?>
<tr>
<td>
<?php echo $row['groupname']; ?>
</td>
</tr>
<?php
}
}
?>
Or, if the row is not a group you can group it by groupname before displaying:
$results = [];
while ($row = mysqli_fetch_array($result6)) {
$results[$row['groupname']] = isset($results[$row['groupname']])
? array_merge($results[$row['groupname']], [$row])
: [$row];
}
print_r($results);

Related

PHP How do you separate your results to echo in two divs of the one page?

I know how to produce results one after another but how do you separate them? So in my sql I'm selecting * from table and limiting it to 4
$sql = "SELECT * FROM table limit 4";
$result = $conn->query($sql);
while($row = $result->fetch_assoc())
{$rows['id']=$row;};
$price = $row['price'];
I dont seem to get any result, any suggestions, sorry guys beginner
...<?php echo $id ?></font></span>
<h4><?php echo $price ?></h4></div>
<div class="planFeatures"><ul>
<li><h1><?php echo $id=2 ?></h1></li>//how do I echo the next id?
<li><?php echo $price2 ?></li> //also the next price which id now is also 2
//and so on......
How do I display the next increments results in a different area of the same page, within another div?
I do get results if I sql and re-select all over again (and say id=2) but I'm sure there is a better way of doing it because I've already got my 4 results with my limit.
It seems you are not saving the results from the query result properly. Each iteration of the loop overwrites the same bucket in the $rows array. Instead, you need to add elements to the $rows array; this will produce an indexed array. Then you can iterate over it and generate the HTML content.
<?php
// Perform query.
$sql = "SELECT * FROM table limit 4";
$result = $conn->query($sql);
// Fetch results
while (true) {
$row = $result->fetch_assoc();
if (!$row) {
break;
}
$rows[] = $row;
}
// Generate HTML content using $rows array.
?>
<table>
<thead>
<tr>
<th>ID</th>
<th>Price</th>
</tr>
</thead>
<tbody>
<?php foreach ($rows as $row):?>
<tr>
<td>ID: <?php print $row['id'];?></td>
<td>Price: <?php print $row['price'];?></td>
</tr>
<?php endforeach;?>
</tbody>
</table>
I took some liberty in the above example and generated a simple HTML table. Of course you can modify this to generate whatever you want.
I hope I've interpreted your question accurately, apologies if not!

Creating a table with PHP foreach function

I'm in a class called database programming. We got a data set and and put it into our servers. Now I have to use a jquery plugin to help visualize that data. I am using Graph Us plugin and trying to use the "Fill In" option.
My professor helped me create this function:
<?php
include 'connect.php';
$country_query = "SELECT DISTINCT Country FROM FemaleMaleRatioNew";
$result = mysqli_query($sql_link, $country_query);
$new_row = array();
while ($row = mysqli_fetch_assoc($result)) {
$country = $row['Country'];
$query = sprintf("SELECT Year, Value FROM FemaleMaleRatioNew WHERE Country = '%s'", $country);
$country_result = mysqli_query($sql_link, $query);
while ($country_row = mysqli_fetch_assoc($country_result) ) {
$new_row[$country][] = array('year' => $country_row['Year'],
'value'=> $country_row['Value']
);
}
}
//print_r($new_row);
?>
the print_r($new_row); is only there to make sure it works and it does, it prints out the array when activated.
He then guided me to create the table like this:
<body>
<table id="demo">
<?php foreach($new_row as $row):?>
<tr>
<td><?=$row['year'];?></td>
<td><?=$row['country'];?></td>
</tr>
<?php endforeach;?>
</table>
<script type="text/javascript">
$(document).ready(function() {
// Here we're "graphing up" only the cells with the "data" class
$('#demo td').graphup({
// Define any options here
colorMap: 'heatmap',
painter: 'fill',
// ...
});
});
</script>
</body>
What else do I need to do to get the table to work? I can't seem to figure it out. All it does is come out blank.
I'm sorry if this question isn't worded correctly or if I have not been clear on anything please let me know.
You have multiple rows for each country in your $new_row variable. You have to iterate over countries first and then over the individual rows of data:
<?php foreach($new_row as $country => $rows): ?>
<?php foreach($rows as $row): ?>
<tr>
<td><?=$country;?></td>
<td><?=$row['Year'];?></td>
<td><?=$row['Value'];?></td>
</tr>
<?php endforeach;?>
<?php endforeach;?>
Also please note that you need colon ':' not semicolon ';' after the foreach statement. This syntax (which is less known) is described here: http://php.net/manual/en/control-structures.alternative-syntax.php
If you want to display some sort of aggregate (for example sum) per country and you want to calculate it in PHP (as opposed to MySQL) you can do it like this:
<?php foreach($new_row as $country => $rows):
$sum = 0;
foreach($rows as $row):
$sum += $row['Value'];
endforeach;
?>
<tr>
<td><?=$country;?></td>
<td><?=$sum;?></td>
</tr>
<?php endforeach;?>
You should be using a single JOINed query to do this stuff, but you may not have gotten that in class yet. Since it's homework, I won't give you the flat-out answer, but here's the pseudo-code:
$countries = SELECT DISTINCT Country FROM YourTable;
while($country_row = fetch_row($countries)) {
echo $country_row['Country'];
echo <table>;
$status = SELECT Year, Value FROM YourTable WHERE Country=$country_row['Country'];
while($stats_row = fetch_row($status) {
echo <tr><td>$stats_row['Year']</td><td>$stats_row['Value']}</td>
}
echo </table>
}

PHP Loop, Add a comma after every loop except the last

I've got a query that loops through some product names and puts them down on the page. As part of the loop, it adds a comma to the end, so it looks like this:
Products: Shirts, Pants, Ties, Jackets,
Notice that I'm getting a comma after the last product. Also, they are all links, so I can't use some strreplace fx or similar:
Here's my code:
<?php
$product_query = mysql_query("select * from products_table);
$row_product_query = mysql_fetch_assoc($product_query);
$totalRows_product_query = mysql_num_rows($product_query);
?>
<strong>Products: </strong>
<?php if ($totalRows_product_query > 0) { ?>
<?php do { ?>
<span><?php echo $row_product_query['products_name']; ?></span>
<strong>, </strong>
<?php } while ($row_product_query = mysql_fetch_assoc($product_query)); ?>
<?php } ?><br />
What do I need to do to make that last comma not appear?
Thanks in advance as always.
using the php implode function
<?php
$str = "";
$product_query = mysql_query("select * from products_table");
$row_product_query = mysql_fetch_assoc($product_query);
$totalRows_product_query = mysql_num_rows($product_query);
$cnt = 0;
?>
<strong>Products: </strong>
<?php if ($totalRows_product_query > 0) { ?>
<?php do {
$arr[$cnt] = '<span>'.$row_product_query['products_name'].'</span>';
$cnt++;
<?php } while ($row_product_query = mysql_fetch_assoc($product_query)); ?>
<?php }
echo implode("<strong>,</strong>",$arr);
?><br />
Fix how they are being stored/entered into the database?
otherwise,
<?php echo str_replace(",", "", $row_product_query['products_name']); ?>
should work
As #tucker said, you could use the implode function. Implode Function. You would use it with an array like so
$a_string = implode(",",$the_result_array);
This would give you your desired results.

How do I set column names in dynamic tables?

I am retrieving a result from the database where the column names are script_id, script_name etc, now what I am doing is after fetching the results from the table say I fetched 2 columns, example script_id and script_name so am saving the names separated with a comma and using a loop, but what if I am not aware how many parameters the user has selected, and how many will it return? for example what am doing
<table>
<tr>
<?php
$columns = explode(',', $fetch_column_list);
foreach($columns as $throw_names) {
echo '<td>'.$throw_names.'</td>';
}
?>
</tr>
//And here I loop the results
</table>
But what If am having a form with different parameters to select
So here I cannot have a pre-defined list of my defined column names as user may or may not have seleted the column
So how I can generate the table dynamically with MY DEFINED COLUMN HEADERS on the front-end
You don't need to know how many columns you've got.
Instead of numbers you have to use field names
<?
$trans = array (
'script_name' => 'Fancy script name field header',
'script_value' => 'Fancy script value field header',
}
$data = $db->getAll("SELECT * FROM table");
$keys = array_keys($data[0]);
?>
<table>
<tr>
<? foreach ($keys as $k): ?>
<td><?=$trans[$k]?></td>
<? endforeach ?>
</tr>
<? foreach ($data as $row): ?>
<tr>
<? foreach ($row as $one): ?>
<td><?=$one?></td>
<? endforeach ?>
</tr>
<? endforeach ?>
</table>
How do you fetch your data?
If you use a function like mysqli_fetch_assoc, you may use
$row = mysqli_fetch_assoc( ... );
$columns = array_keys($row)

msql fetch array no longer listing all results

I have a code that I have used over and over again before and now it's messing up. All I want to do is list information from the database into the table on the page, but now it will only show one result, instead of all the results it has found.
<table>
<tr><td style="background-color:#009745; color:#FFFFFF"><center><strong>Address Book</strong></center></td></tr>
<tr>
<?php
$getids = mysql_query("SELECT id, first_name, last_name FROM accounts WHERE s1='$id' ORDER BY id DESC", $db);
if (mysql_num_rows($getids) > 0) {
while ($gids = mysql_fetch_array($getids)) {
$ab_id = $gids['id'];
$ab_fn = $gids['first_name'];
$ab_ln = $gids['last_name'];
}
?>
<td><?= $ab_id ?> - <?= $ab_fn . " " . $ab_ln ?></td>
<?php
} else {
?>
<td><center>No Contacts</center></td>
<?php
}
?>
</tr>
</table>
please help me with this.
Thank You for your help :)
I love this site!! I can always get answers when I need them.
I saw two thing wrong
you are using mysql_fetch_array and later you are using string indexes to print the result
print the things in loop it is overriding values and just storing last row
if (mysql_num_rows($getids) > 0) {
while ($gids = mysql_fetch_assoc($getids)) {
$ab_id = $gids['id'];
$ab_fn = $gids['first_name'];
$ab_ln = $gids['last_name'];
echo '<td>'.$ab_id.' -'. $ab_fn.''.$ab_ln.' </td>';
}
In this messy code you're closing the while loop too early:
while ($gids = mysql_fetch_array($getids)) {
$ab_id = $gids['id'];
$ab_fn = $gids['first_name'];
$ab_ln = $gids['last_name'];
}
Only the last retrieved row is used later on. Also, don't use mysql_fetch_array if you're not accessing the numeric indeces of your result. Use mysql_fetch_assoc instead.

Categories