Calling data from a mysql database and populating a row of articles using functions
07-13-2010, 08:28 AM
|
Calling data from a mysql database and populating a row of articles using functions
|
Posts: 2
|
I'm an amateur at this but I'll try my best to explain it.
How to explain this. I'm working with vbulletin 4 software right now and I'm trying to make a "scrolling features" section. The idea is to be able to place articles in a "featured content" category and have them dynamically appear at the top of the page in a formatted fashion. I successfully accomplished this by pulling the information directly out of the mysql table. Then it was decided to have a single Top Story section there as well. I also wanted to accomplish this by using a category name to dynamically place it at the top of the site, alongside the "scrolling features" section.
The problem I'm running into is doing both at once within the same script. I thought the best way to do it was to use functions since using two if statements resulted in failure. I tried all kinds of conditionals and looping statements, and now I'm stuck. I can't get it to display at all unless I'm only trying to do one section or the other, and trying to do it using functions only ends up spitting out one story in the "scrolling features" section. What can I do to get this on the right track?
I'm restricted in that the script has to end in the form of [ICODE]"$output = "[/ICODE]. Any help at all would be greatly appreciated.
PHP Code:
ob_start();
//The three functions below belong in a separate file function truncate($text, $length, $suffix = '…', $isHTML = true){ $i = 0; $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true); $tags = array(); if($isHTML){ preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach($m as $o){ if($o[0][1] - $i >= $length) break; $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1); // test if the tag is unpaired, then we mustn't save them if($t[0] != '/' && (!isset($simpleTags[$t]))) $tags[] = $t; elseif(end($tags) == substr($t, 1)) array_pop($tags); $i += $o[1][1] - $o[0][1]; } } // output without closing tags $output = substr($text, 0, $length = min(strlen($text), $length + $i)); // closing tags $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : ''); // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">) $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE))); // Append closing tags to output $output.=$output2;
// Get everything until last space $one = substr($output, 0, $pos); // Get the rest $two = substr($output, $pos, (strlen($output) - $pos)); // Extract all tags from the last bit preg_match_all('/<(.*?)>/s', $two, $tags); // Add suffix if needed if (strlen($text) > $length) { $one .= $suffix; } // Re-attach tags $output = $one . implode($tags[0]); return $output; } //This is the first problem function. This does not spit out the info I need it to function contentstring($category, $previewtxt, $popular) { if($category == 41) { $content_bits .= "\t\t<li>\n\t\t<div class=\"preview_image\"><img src=\"".$popular[previewimage]."\" /></div>\n\t\t<h3><a href=\"/content/".$popular[nodeid]."\">".$popular[title]."</a></h3>\n\t\t<p>".$previewtxt."</p>\n\t\t</li>\n</ul>"; } return $content_bits; }
//This is the second problem function. This does not spit out the info I need it to function newsstring($category, $previewtxt, $popular) { if($category == 42) { $news_bits .= "<div class="news"><div class=\"news_preview_img\"><img src=\"".$popular[previewimage]."\" /></div><h3><a href=\"/content/".$popular[nodeid]."\">".$popular[title]."</a></h3>\n\t\t<p>".$previewtxt."</p>\n\t\t</div>\n<ul id=\"ffxivblog\" class=\"jcarousel-skin-ffxivblog\">\n"; } return $news_bits; }
// Featured Content $popular_get = vB::$db->query_read(" SELECT ".TABLE_PREFIX."cms_node.nodeid, ".TABLE_PREFIX."cms_node.contentid, ".TABLE_PREFIX."cms_article.pagetext, ".TABLE_PREFIX."cms_article.previewimage, ".TABLE_PREFIX."cms_nodecategory.categoryid, ".TABLE_PREFIX."cms_nodeinfo.title FROM ".TABLE_PREFIX."cms_node LEFT JOIN ".TABLE_PREFIX."cms_article ON ".TABLE_PREFIX."cms_node.contentid = ".TABLE_PREFIX."cms_article.contentid LEFT JOIN ".TABLE_PREFIX."cms_nodecategory ON ".TABLE_PREFIX."cms_node.nodeid = ".TABLE_PREFIX."cms_nodecategory.nodeid LEFT JOIN ".TABLE_PREFIX."cms_nodeinfo ON ".TABLE_PREFIX."cms_node.nodeid = ".TABLE_PREFIX."cms_nodeinfo.nodeid WHERE ".TABLE_PREFIX."cms_nodecategory.categoryid BETWEEN 41 AND 42"); $content_bits = ''; $news_bits = ''; while($popular = vB::$db->fetch_array($popular_get)) { $item = $popular[pagetext]; $item = preg_replace('[\[.{2,}/.{1,}\]]', '', $item); $item = preg_replace('[<object.{2,}/object>]', '', $item); $previewtxt = truncate($item, 80, $suffix = '…', $isHTML = true); $category = $popular[categoryid]; $content_bits = contentstring($category, $previewtxt, $popular); $news_bits = contentstring($category, $previewtxt, $popular); } $output = $content_bits . $news_bits; ob_end_clean();
|
|
|
|
07-13-2010, 06:25 PM
|
Re: Calling data from a mysql database and populating a row of articles using functio
|
Posts: 42,385
Name: Chris Hirst
Location: Blackpool. UK
|
PHP only runs when the page is requested, once the HTML source code has been sent to the browser, the PHP script has run and is finished with until the page is requested again.
__________________
Chris. ->> Please login or register to view this content. Registration is FREE <<-
A foolish consistency is the hobgoblin of little minds
Thought for today:- Is SEO the only industry where all the cowboys are Indians?
|
|
|
|
07-13-2010, 09:29 PM
|
Re: Calling data from a mysql database and populating a row of articles using functio
|
Posts: 2
|
I was able to solve this with some help from someone else. Here's the code if anyone is interested.
Functions
PHP Code:
function truncate($text, $length, $suffix = '…', $isHTML = true){ $i = 0; $simpleTags=array('br'=>true,'hr'=>true,'input'=>true,'image'=>true,'link'=>true,'meta'=>true); $tags = array(); if($isHTML){ preg_match_all('/<[^>]+>([^<]*)/', $text, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); foreach($m as $o){ if($o[0][1] - $i >= $length) break; $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1); // test if the tag is unpaired, then we mustn't save them if($t[0] != '/' && (!isset($simpleTags[$t]))) $tags[] = $t; elseif(end($tags) == substr($t, 1)) array_pop($tags); $i += $o[1][1] - $o[0][1]; } } // output without closing tags $output = substr($text, 0, $length = min(strlen($text), $length + $i)); // closing tags $output2 = (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : ''); // Find last space or HTML tag (solving problem with last space in HTML tag eg. <span class="new">) $pos = (int)end(end(preg_split('/<.*>| /', $output, -1, PREG_SPLIT_OFFSET_CAPTURE))); // Append closing tags to output $output.=$output2;
// Get everything until last space $one = substr($output, 0, $pos); // Get the rest $two = substr($output, $pos, (strlen($output) - $pos)); // Extract all tags from the last bit preg_match_all('/<(.*?)>/s', $two, $tags); // Add suffix if needed if (strlen($text) > $length) { $one .= $suffix; } // Re-attach tags $output = $one . implode($tags[0]); return $output; } function outputstring($category, $previewtxt, array $popular) { $sResult = ''; switch($category) { case 41: $sResult = "\t\t<li>\n\t\t<div class=\"preview_image\"><img src=\"".$popular['previewimage']."\" /></div>\n\t\t<h3><a href=\"/content/".$popular['nodeid']."\">".$popular['title']."</a></h3>\n\t\t<p>".$previewtxt."</p>\n\t\t</li>\n"; break; case 42: $sResult = "<div class=\"news\"><div class=\"news_preview_img\"><img src=\"".$popular['previewimage']."\" /></div><h3><a href=\"/content/".$popular['nodeid']."\">".$popular['title']."</a></h3>\n\t\t<p>".$previewtxt."</p>\n\t\t</div>\n<ul id=\"ffxivblog\" class=\"jcarousel-skin-ffxivblog\">\n"; break; } return $sResult; }
Main Code
PHP Code:
ob_start(); include('./scripts/custom-functions.php'); $popular_get = vB::$db->query_read(" SELECT ".TABLE_PREFIX."cms_node.nodeid, ".TABLE_PREFIX."cms_node.contentid, ".TABLE_PREFIX."cms_article.pagetext, ".TABLE_PREFIX."cms_article.previewimage, ".TABLE_PREFIX."cms_nodecategory.categoryid, ".TABLE_PREFIX."cms_nodeinfo.title FROM ".TABLE_PREFIX."cms_node LEFT JOIN ".TABLE_PREFIX."cms_article ON ".TABLE_PREFIX."cms_node.contentid = ".TABLE_PREFIX."cms_article.contentid LEFT JOIN ".TABLE_PREFIX."cms_nodecategory ON ".TABLE_PREFIX."cms_node.nodeid = ".TABLE_PREFIX."cms_nodecategory.nodeid LEFT JOIN ".TABLE_PREFIX."cms_nodeinfo ON ".TABLE_PREFIX."cms_node.nodeid = ".TABLE_PREFIX."cms_nodeinfo.nodeid WHERE ".TABLE_PREFIX."cms_nodecategory.categoryid BETWEEN 41 AND 42"); $content_bits = ''; $news_bits = '';
while($popular = vB::$db->fetch_array($popular_get)) { $category = $popular['categoryid']; $item = $popular['pagetext']; $item = preg_replace('[\[.{2,}/.{1,}\]]', '', $item); $item = preg_replace('[<object.{2,}/object>]', '', $item); $previewtxt = truncate($item, 80, $suffix = '…', $isHTML = true);
// These will need to be concatenated if ($category == 42) { $news_bits .= outputstring($category, $previewtxt, $popular); } else { $content_bits .= outputstring($category, $previewtxt, $popular); } } $output = $news_bits.$content_bits."</ul>"; ob_end_clean();
|
|
|
|
|
« Reply to Calling data from a mysql database and populating a row of articles using functions
|
|
|
| Thread Tools |
Search this Thread |
|
|
|
Posting Rules
|
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is Off
|
|
|
|