Content out of div PHP PDO - php

My content of the subcategories is getting out of the div somehow.
The first one stays on there but the second, third etc is getting out from it.
Any solutions to it?
<?php
...
$stmt = $dbh->query('SELECT parent.subcat_id, parent.subcat_name, child.subsubcat_name, child.subcat_id, child.cat_id FROM subcategories parent JOIN subsubcategories child ON child.cat_id = parent.cat_id');
$lastcat = 0;
$stmt->execute();
$row2 = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($row2 as $row) {
if($lastcat != $row['cat_id']){
$lastcat = $row['cat_id'];
echo '<div class="panel panel-default">
<div class="panel-heading">';
echo $row['subcat_name'];
echo '</div><div class="panel-body">';
}
echo $row['subsubcat_name'];
echo "</div></div>";
}
?>

This should be rewritten like:
$close_previous = false; // special flag
foreach ($row2 as $row) {
if ($lastcat != $row['cat_id']) {
$lastcat = $row['cat_id'];
// check whether you need to close divs from previous block
if ($close_previous) {
echo '</div>'; // close .panel-body
echo '</div>'; // close .panel-default
} else {
// for the first time you don't need
// to close divs, so here we skip it
$close_previous = true;
}
echo '<div class="panel panel-default"><div class="panel-heading">';
echo $row['subcat_name'];
echo '</div><div class="panel-body">';
}
echo $row['subsubcat_name'];
// add link
echo 'Click';
}
// explicitly close last divs block
echo '</div>'; // close .panel-body
echo '</div>'; // close .panel-default
Also it's a good practice to check your generated html-markup to see what is wrong.

Related

dynamic grid using php and bootstrap

I want to make a dynamic grid using php and bootstrap.
For example
Case 1 => If i have total 6 records then row 1 contain col-md-4 grids and row 2 contain col-md-4 grids
Case 2 => If i have total 5 records then row 1 contain col-md-4 grids and row 2 contain col-md-6 grids
Case 3 => If i have total 4 records then row 1 contain col-md-4 grids and row 2 contain col-md-12 grids
How to do that i have no idea, any solution?
<?php foreach($Banners as $i=>$DATA){
if($count%3==1){
echo "<div class='row'>";
$lgclass = "col-lg-4";
}
if($count%4==0){
$lgclass = "col-lg-6";
}
if($count%5==0){
$lgclass = "col-lg-6";
}
?>
<div class="<?php echo $lgclass;?> col-xs-12 col-sm-12" <?php echo $count;?>>
<h2 class="section-title" > </h2>
<a href="http://mymegarealty.net/index.php?option=com_jointeam">
<div class="full-width">
<img src="<?php echo $Imageurl;?>" class="img-responsive" style="height:250px;;display:unset;">
</div>
</a>
</div>
<?php
if($count%3==0){
echo "</div>";
}
$count++;} ?>
it would be better a recursive solution, if you want you can do it. I wrote you at the beginning the logic if I follow an example overturned on your needs. my logic was the procedural one.
<?php
/*
logic
while myElements !=0
if myElements > 2
dispay row whith 3 elements
myElements remove firs 3
else if myElements == 2
dispay row whith 2 elements
myElements remove firs 2
else if myElements == 1
dispay row whith 1 elements
myElements remove firs 1
end while
*/
// init my data
$data=[];
$element=5;
for($i=0;$i<$element;$i++){array_push($data,$i);}
var_dump($data);
// do code
function displayElement($data, $classAdd){
echo "<div class='".$classAdd."'>";
echo $data; // your cell
echo "</div>";
}
while (sizeof($data)!=0){
if (sizeof($data)>2){
echo "<div class='row'>";
displayElement($data[0],"col-lg-4");
displayElement($data[1],"col-lg-4");
displayElement($data[2],"col-lg-4");
echo "</div>";
$data=array_slice($data,3);
}elseif (sizeof($data)==2){
echo "<div class='row'>";
displayElement($data[0],"col-lg-6");
displayElement($data[1],"col-lg-6");
echo "</div>";
$data= array_slice($data,2);
}elseif (sizeof($data)==1){
echo "<div class='row'>";
displayElement($data[0],"col-lg-12");
echo "</div>";
$data= array_slice($data,1);
}
}
You should be able to simply achieve this with flex. But with bootstrap try to use recursion: small example below
<?php
$elements = [1, 2, 3, 4];
function displ(&$el, $out = "") {
if (count($el) === 0) {
return $out;
} elseif (count($el) > 3) {
$i = 0;
foreach ($el as $k=>$v) {
$out .= "<div class=\"col-md-4\">" . $v . "</div>";
unset($el[$k]);
$i++;
if ($i === 3) {
return displ($el, $out);
}
}
return displ($el, $out);
} elseif (count($el) < 3) {
foreach ($el as $k=>$v) {
$out .= "<div class=\"col-md-" . 12 / count($el) . "\">" . $v . "</div>";
unset($el[$k]);
}
return $out;
}
}
echo displ($elements);

How Would I Turn Mysqli Table Results into a menu with drop down

Here Is my question: What I am wanting To do is Take Results from a mysql table and turn them into a menu and a drop down menu
HERE IS A QUICK EXAMPLE:
if you see in my mysql table i have page_name and parent, So the example is:
page_name and if i have row 1 the page_name is 'Home' now it's parent is 'none' right but on id number 39 the page_name is 'Contact Us' and the Parent Is 'Far Far Away 123' so if the parent is equal to 'none' then it will show at the top of the menu not the drop down if it has a parent it will show under that parent like this:
Home | the ben page | The Brock Page | Far Far Away 123 | dsfk
Contact Us
You see Contact Us is under Far Far Away Because the parent Is Far Far Away 123
here is my table:
Here is my code That I am trying but it is not working for some reason:
<ul>
<?php
$sql = "SELECT * FROM pages ORDER by item_order";
$result = mysqli_query($db, $sql);
confirm_query($result);
while ($links = mysqli_fetch_assoc($result)) {
if($links['parent'] !== "none") {
?>
<li id = "<?php echo $links['id']; ?>"><a href="
<?php
echo "page.php?id=" . $links['id'] . "\" title=\"" . $links['page_title'] . "\"";
?>>
<?php
echo $links['page_name'];
?>
</a>
<?php
if($links['parent'] !== "none") {
$child = "";
$sql = "SELECT * FROM pages";
$result = mysqli_query($db, $sql);
while($row = mysqli_fetch_assoc($result)) {
if($row['parent'] !== "none") {
$child = $row['page_name'];
}
}
echo "<ul id=\"sub_menu\" class=\"sub_navagation" . $links['id'] . "\">";
echo "<li>";
echo $child;
echo "<li>";
echo "</ul>";
}
?>
</li>
<?php
}
}
?>
</ul>
CSS:
#sub_menu {
display: none;
}
#sub_menu:hover {
display: block;
}
Ok if as you can see i have the parent row in the MYSQL table and on id number 39 i want the 'Far Far Away123' to be the parent of Contact Us and i want to show it when i hover over 'Far Far Away123'
My suggestion is to build out an array of all the results. Then run through that array (instead of multiple database queries).
I added a function build_dropdown() that will take the page name and run through the array of pages to see if there are any items with a parent matching. If so, we make an array of those items and run through them to build the dropdown menu. If not, it does nothing and moves on to the next menu item.
<?php
function build_dropdown ($parent, $pages){
foreach($pages as $page){
if($page['parent'] == $parent){
$items = $page;
} // END if
} // END foreach
if(is_array($items)){ // If a sub
echo '<ul id="sub_menu" class="sub_navagation'. $item['id'] .'">';
foreach($items as $item){
echo '<li>'.$item['name'].'<li>';
} // END foreach
echo '</ul>';
} // END if
}
$sql = "SELECT * FROM pages ORDER by item_order";
$result = mysqli_query($db, $sql);
confirm_query($result);
while ($row = mysqli_fetch_assoc($result)) {
$pages[] = $row; // Add each row to $pages array to use later
}
foreach($pages as $key => $page){
if($page['parent'] == 'none'){ ?>
<li id = "<?php echo $page['id']; ?>">
<a href="page.php?id=<?php echo $page['id']; ?>" title="<?php echo $page['page_title']; ?>">
<?php echo $page['page_name']; ?>
</a>
<?php
build_dropdown($page['page_name'], $pages); // If there are child items then build them out
?>
</li>
<?php
} // END if
} // END foreach
?>
I suggest you will need to JOIN your table to basically query it again to get the parent value, and add that to your markup.
SELECT *
FROM Pages
LEFT JOIN Pages p2 on page_name = p2.parent
(note: the syntax above may not be right, but I wanted to give you an idea of where I would start).

Show more than one result from JOIN with if statement

I have this JOIN, that gets me more than on result:
at.tipo AS atividade,
at.data AS datacadastro,
at.user AS usercadastro,
LEFT JOIN atividades at
ON (at.produto = '$produto')
AND (at.tipo = 'cadastra' OR at.tipo = 'revisado')
And I have: if string = 'cadastra' shows something, if string = 'revisado' shows something else.
<?php
if ($row['atividade'] == 'cadastra') {
echo '<div id="user-img">';
echo '<img src="http://'.$row['imguser'].'"/></div>';
echo '<div id="user-cadastro" class="greytxt">';
echo 'Cadastrado por <br>' .$row['usercadastro']. '<br>em ';
echo $row['datacadastro']. '</div>';
}
?>
<?php
if ($row['atividade'] == 'revisado') {
echo '<div id="user-img">';
echo '<img src="http://'.$row['imguser'].'"/></div>';
echo '<div id="user-cadastro" class="greytxt">';
echo 'Cadastrado por <br>' .$row['usercadastro']. '<br>em ';
echo $row['datacadastro']. '</div>';
}
?>
The problem is, it's showing just the first result, and not all.
How can I display all results?
EDIT:
I have this JOIN inside a big query, that give me other important rows.
But I just want one result for this principal query (WHERE = $produto), and want more results from my JOIN table.
$rows = $result->num_rows;
for ($j = 0; $j < $rows; ++$j) {
$result -> data_seek($j);
$row = $result->fetch_array (MYSQLI_ASSOC);
?>
My result should be this, but JOIN shows just row 'cadastra'.
Use $result->fetch_array (MYSQLI_ASSOC) inside a while loop
while ($row = $result->fetch_array (MYSQLI_ASSOC)) {
if ($row['atividade'] == 'cadastra')
{
echo '<div id="user-img">';
echo '<img src="http://'.$row['imguser'].'"/></div>';
echo '<div id="user-cadastro" class="greytxt">';
echo 'Cadastrado por <br>' .$row['usercadastro']. '<br>em ';
echo $row['datacadastro']. '</div>';
} ?>
<?php if ($row['atividade'] == 'revisado')
{
echo '<div id="user-img">';
echo '<img src="http://'.$row['imguser'].'"/></div>';
echo '<div id="user-cadastro" class="greytxt">';
echo 'Cadastrado por <br>' .$row['usercadastro']. '<br>em ';
echo $row['datacadastro']. '</div>';
}
}

close div tag after 4 entries - mysql loop

i want my script to add a closing div tag after every fourth entrie of the db. i tried something like this:
<div class="row">
$ergebnis = $mysqli->query("SELECT name FROM pages Where city = '1';");
while($zeile = $ergebnis->fetch_array()) {
echo "<div class=\"col-sm-4 col-md-3\">
echo "<h3>".$zeile['name']."</h3>";
..
echo "</div>";
$i=0;
i++;
if ($i == 4){
echo "</div>";}
}
?>
would be great if you can help me here. thx
1) Get names of all cities
2) Initiate an indexing variable
3) Ieterate through the loop
4) Open <div class="row"> when $i==0 (Very First time) OR $i%4==0 (When fifth entry is to be printed). (Remember you are using 0 based indexing i.e. initializing $i=0).
5) Close the div tag for <div class="row"> when fourth city name has been printed i.e. $i%3==0 (Remember you are using 0 based indexing i.e. initializing $i=0).
Here's the code:
<?php
$ergebnis = $mysqli->query("SELECT name FROM pages Where city = '1';");
$i=0;
while($zeile = $ergebnis->fetch_array()) {
if ($i == 0 || $i%4==0){ // <div class="row"> opens on first entry and every fifth entry
echo "<div class=\"row\">";
}
echo "<div class=\"col-sm-4 col-md-3\">";
echo "<h3>".$zeile['name']."</h3>";
/*
Rest of your code
*/
echo "</div>";
$i++;
if ($i % 3 == 0){
echo "</div>"; // <div class="row"> closes here on every fourth entry
}
}
?>
Try this code,
<div class="row">
$ergebnis = $mysqli->query("SELECT name FROM pages Where city = '1';");
$i=0;
while($zeile = $ergebnis->fetch_array()) {
echo "<div class=\"col-sm-4 col-md-3\">
echo "<h3>".$zeile['name']."</h3>";
..
echo "</div>";
$i++;
if ($i == 4){
echo "</div>";
$i = 0;
}
}
?>

Listing diary events grouped by days in PHP/MySQL

I'm trying to list diary events in PHP from a MySQL database, but grouped by days. I'll explain.
This is a screenshot of what I have so far:
As you can see there are two diary events for the 23rd October 2012 and is showing two calendar icons/representations/whatever's. I actually want it to show one calendar icon on the left but list all of that days events on the right, until the next day - as seen in my a̶r̶t̶i̶s̶t̶s̶ idiots impression below:
This is the code I have just written, could somebody please point me in the right direction:
$SQL = "SELECT entry_id, entry_title, entry_body, entry_date, entry_day, entry_month, entry_year ";
$SQL .= "FROM pages_diary WHERE entry_month = :this_month AND entry_year = :this_year ";
$SQL .= "ORDER BY entry_date DESC;";
// PDO stuff
if ($STH->rowCount() > 0) {
while($row = $STH->fetch()):
$this_db_month_word = mktime(0, 0, 0, $row['entry_month']);
$this_db_month_word = strftime("%b", $this_db_month_word);
echo '<div class="diary_events_item" id="diary_events_item_'.$row['entry_id'].'">';
echo '<div class="diary_events_item_left">';
echo '<div class="calendar_wrap">';
echo '<div class="calendar_wrap_top">';
echo $this_db_month_word;
echo '</div>';
echo '<div class="calendar_wrap_bottom">';
echo str_pad($row['entry_day'],2,'0',STR_PAD_LEFT);;
echo '</div>';
echo '</div>';
echo '</div>';
echo '<div class="diary_events_item_right">';
echo '<strong>'.htmlspecialchars($row['entry_title']).'</strong><br>';
echo '<p>'.htmlspecialchars($row['entry_body']).'</p>';
echo '</div>';
echo '<div class="clear"></div>';
echo '</div>';
endwhile;
} else {
echo '<p>There are no diary entries logged for <strong>'.$this_month_word.' '.$this_year.'</strong>.</p>';
}
Not looking for exact code (although that would be spiffing), just an explanation would do, I'm sure I can work it out from that.
THE FIX
At the end of the WHILE loop, I added:
$last_db_day = $row['entry_day'];
And then wrapped the calendar item in:
if ($last_db_day != $row['entry_day']) {
echo '<div class="calendar_wrap_top">';
echo $this_db_month_word;
echo '</div>';
echo '<div class="calendar_wrap_bottom">';
echo str_pad($row['entry_day'],2,'0',STR_PAD_LEFT);;
echo '</div>';
}
As you loop over your resultset from the database, keep track of the last entry_date that you've seen and only output a new calendar icon if the current record is for a different date.
I usually do this as follows:
if ($STH->execute()) {
// output headers
$row = $STH->fetch();
while ($row) {
$current_date = $row['entry_date'];
// output $current_date initialisation
do {
// output event $row
} while ($row = $STH->fetch() and $row['entry_date'] == $current_date);
// output $current_date termination
}
// output footers
}
Although I would go the other way around and embed the PHP within the HTML rather then the other way around, here is what I would do using your code:
$SQL = "SELECT entry_id, entry_title, entry_body, entry_date, entry_day, entry_month, entry_year ";
$SQL .= "FROM pages_diary WHERE entry_month = :this_month AND entry_year = :this_year ";
$SQL .= "ORDER BY entry_date DESC;";
// PDO stuff
if ($STH->rowCount() > 0) {
$loopDay = '';
while($row = $STH->fetch()):
if ($row['entry_day'] != $loopDay) {
$loopDay = $row['entry_day'];
$changed = true;
}
$this_db_month_word = mktime(0, 0, 0, $row['entry_month']);
$this_db_month_word = strftime("%b", $this_db_month_word);
echo '<div class="diary_events_item" id="diary_events_item_'.$row['entry_id'].'">';
echo '<div class="diary_events_item_left">';
if ($changed) {
echo '<div class="calendar_wrap">';
echo '<div class="calendar_wrap_top">';
echo $this_db_month_word;
echo '</div>';
echo '<div class="calendar_wrap_bottom">';
echo str_pad($row['entry_day'],2,'0',STR_PAD_LEFT);;
echo '</div>';
echo '</div>';
} else {
echo ' ';
}
echo '</div>';
echo '<div class="diary_events_item_right">';
echo '<strong>'.htmlspecialchars($row['entry_title']).'</strong><br>';
echo '<p>'.htmlspecialchars($row['entry_body']).'</p>';
echo '</div>';
echo '<div class="clear"></div>';
echo '</div>';
$changed = false;
endwhile;
} else {
echo '<p>There are no diary entries logged for <strong>'.$this_month_word.' '.$this_year.'</strong>.</p>';
}

Categories