kartul Posted February 11, 2010 Share Posted February 11, 2010 hey why does this code returns only one row instead of 30 rows? $sql = mysql_query("SELECT title FROM index WHERE id > 1 LIMIT 0,30") or die(mysql_error()); $row = mysql_fetch_assoc($sql); foreach($row as $id => $val) { echo $id . " -- " . $val . "<br>"; } it's driving me crazy. been trying to figure it out for a half an hour. if I change foeach to while it works like it should but i need foreach to do the jobs cause the template system class i use. i just don't want to see all that sql querys and big php code on template page... Link to comment https://forums.phpfreaks.com/topic/191819-mysql-query-foreach/ Share on other sites More sharing options...
sader Posted February 11, 2010 Share Posted February 11, 2010 while($row = mysql_fetch_assoc($sql)) { foreach($row as $id => $val) { echo $id . " -- " . $val . "<br>"; } } Link to comment https://forums.phpfreaks.com/topic/191819-mysql-query-foreach/#findComment-1011011 Share on other sites More sharing options...
kartul Posted February 11, 2010 Author Share Posted February 11, 2010 while($row = mysql_fetch_assoc($sql)) { foreach($row as $id => $val) { echo $id . " -- " . $val . "<br>"; } } heh.. cleaver i was just about to say that this wont work with the template system but when i think about it now, it might.. thanks man!! will try this out asap! // oh god.. why this has to be so complicated..? i tried it with the template class and it only returns last entry, twice.. this is probably cause the variable assigned gets overwritten. but how do i get past this? i tried to assign $body->set to $a but it didn't work.. here are all files i have so far.. template.php <?php class Template { var $vars; /// Holds all the template variables var $path; /// Path to the templates /** * Constructor * @param string $path the path to the templates * @return void */ function Template($path = null) { $this->path = $path; } /** * Set the path to the template files. * @param string $path path to template files * @return void */ function set_path($path) { $this->path = $path; } /** * Set a template variable. * @param string $name name of the variable to set * @param mixed $value the value of the variable * @return void */ function set($name, $value) { $this->vars[$name] = $value; } /** * Open, parse, and return the template file. * @param string string the template file name * @return string */ function fetch($file) { extract($this->vars); // Extract the vars to local namespace ob_start(); // Start output buffering include($this->path . $file); // Include the file $contents = ob_get_contents(); // Get the contents of the buffer ob_end_clean(); // End buffering and discard return $contents; // Return the contents } } /** * An extension to Template that provides automatic caching of * template contents. */ class CachedTemplate extends Template { var $cache_id; var $expire; var $cached; /** * Constructor. * @param string $path path to template files * @param string $cache_id unique cache identifier * @param int $expire number of seconds the cache will live * @return void */ function CachedTemplate($path, $cache_id = null, $expire = 900) { $this->Template($path); $this->cache_id = $cache_id ? 'cache/' . md5($cache_id) : $cache_id; $this->expire = $expire; } /** * Test to see whether the currently loaded cache_id has a valid * corrosponding cache file. * @return bool */ function is_cached() { if($this->cached) return true; // Passed a cache_id? if(!$this->cache_id) return false; // Cache file exists? if(!file_exists($this->cache_id)) return false; // Can get the time of the file? if(!($mtime = filemtime($this->cache_id))) return false; // Cache expired? if(($mtime + $this->expire) < time()) { @unlink($this->cache_id); return false; } else { /** * Cache the results of this is_cached() call. Why? So * we don't have to double the overhead for each template. * If we didn't cache, it would be hitting the file system * twice as much (file_exists() & filemtime() [twice each]). */ $this->cached = true; return true; } } /** * This function returns a cached copy of a template (if it exists), * otherwise, it parses it as normal and caches the content. * @param $file string the template file * @return string */ function fetch_cache($file) { if($this->is_cached()) { $fp = @fopen($this->cache_id, 'r'); $contents = fread($fp, filesize($this->cache_id)); fclose($fp); return $contents; } else { $contents = $this->fetch($file); // Write the cache if($fp = @fopen($this->cache_id, 'w')) { fwrite($fp, $contents); fclose($fp); } else { die('Unable to write cache.'); } return $contents; } } } ?> index.php <?php include("config.php"); // only db connection require_once("template.php"); $path = "./templates/default/"; $tpl = new Template($path); $tpl->set("title", "Index"); $sql = mysql_query("SELECT title FROM index WHERE id > 1 LIMIT 0,30") or die(mysql_error()); $a = null; $body = new Template($path); while($row = mysql_fetch_array($sql)) { $a .= $body->set("title", $row); // <- wont work.. } $body->set("title", $a); // <- this too $tpl->set("content", $body->fetch("content.tpl.php")); echo $tpl->fetch("index.tpl.php"); ?> content.tpl.php <table> <tr> <th>Name</th> </tr> <?php foreach($title as $tit): ?> <tr> <td><?php echo $tit;?></td> </tr> <?php endforeach; ?> </table> index.tpl.php <html> <head> <title><?php echo $title;?></title> </head> <?php echo $title;?> <body> <?php echo $content;?> </body> </html> i'm not asking code to make it fully functional. i need directions.. Link to comment https://forums.phpfreaks.com/topic/191819-mysql-query-foreach/#findComment-1011013 Share on other sites More sharing options...
sader Posted February 11, 2010 Share Posted February 11, 2010 well does this work? $body = new Template($path); $a; while($row = mysql_fetch_array($sql)) { $a .= $row['title']."<br />"; //or what ever your field name is called } $body->set("title", $a); //.... Link to comment https://forums.phpfreaks.com/topic/191819-mysql-query-foreach/#findComment-1011033 Share on other sites More sharing options...
kartul Posted February 11, 2010 Author Share Posted February 11, 2010 well does this work? $body = new Template($path); $a; while($row = mysql_fetch_array($sql)) { $a .= $row['title']."<br />"; //or what ever your field name is called } $body->set("title", $a); //.... had to change it a little bit: $a = array(); $body = new Template($path); while($row = mysql_fetch_array($sql)) { $a[] .= $row['title']; } $body->set("title", $a); and it works now!!! thank you so much! now I can finally do something. thank you again! Link to comment https://forums.phpfreaks.com/topic/191819-mysql-query-foreach/#findComment-1011044 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.