Jump to content

mysql query + foreach


kartul

Recommended Posts

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

while($row = mysql_fetch_assoc($sql))
{
   foreach($row as $id => $val)
{    
      echo $id . " -- " . $val . "<br>";
  }
}

heh.. cleaver :P

i was just about to say that this wont work with the template system but when i think about it now, it might.. :D

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

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

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.