4

i create a template file for my site... it's like:

<!-- template.php -->
<?php function showheader() { ?>
<head><body>
<!-- some of style files and menus -->
<div class="content">
<?php } ?>

<?php function showfooter() { ?>
</div></body></html>
<?php } ?>

i use this file as a template like this:

<?php include_once("template.php"); showheader(); ?>
content text or photo or ... etc.
<?php showfooter(); ?>

that's all... but if i try to use a connection on template file, it screw up! i used an external file like:

<?php
//
// include_once connection file
// query strings goes here
//

do {
echo $row_table['id']; //example
} while ($row_table = mysql_fetch_assoc($table));

?>

and i use this file as include_once("filename.php"); on template file... at this point it gives errors... like what is this connection variable, what is this connection string... etc. it cannot reach connection strings...

by the way, i use another external connection like:

<?php
global $hostname_conn,$database_conn,$username_conn,$password_conn,$conn;
$hostname_conn = "localhost";
$database_conn = "test";
$username_conn = "****";
$password_conn = "****";
$conn = mysql_pconnect($hostname_conn, $username_conn, $password_conn) or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_query("SET NAMES 'utf8'");
?>

i'm gonna cry! what's the problem... and do you know another way to use template... thanks much...

PS: i change variables on conn.php as global (and it didnt work) and i change include, include_once, require, require_once where i include files but it didnt give anything.

mrtakdnz
  • 149
  • 2
  • 5
  • 10
  • 1
    Hmm, I'd try using Smarty or some other template framework instead of creating my own template system. have a look here: http://www.smarty.net/ – dhh Oct 21 '10 at 14:41
  • 2
    As a matter of fact, you should **never** connect to the database in your template. And your whole idea of template is wrong. for the header and footer just use `include` operator. But it's least part of template. An HTML *between* header and footer - should be subject of the template. – Your Common Sense Oct 21 '10 at 15:14
  • i try to use smarty but i cannot achieve it... i have a customizable content management system (easy customizable, i cannot customize drupal or joomla). – mrtakdnz Oct 21 '10 at 15:27
  • This seems to be a menagerie of problems. If you are looking to solve your script's error, we need complete detail on where the error is and where the database connection gets created (including what files get included when). – erisco Oct 21 '10 at 15:37

1 Answers1

14

This separates the page into two PHP files: (1) the first obtains the data, and (2) the second displays the data.

While getting data, not a single character should be printed out.
If some errors occurred, display an error page.

Once you get all your data with no errors - it's time to include a template. The template has two PHP files as well: the template for the page itself and the template that is shared in common by all the pages in the site.

By sorting things this way you'll solve all your present and future templating problems.

A typical script may look like

<?
//include our settings, connect to database etc.
include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php';
//getting required data
$DATA=dbgetarr("SELECT * FROM links");
$pagetitle = "Links to friend sites";
//etc
//and then call a template:
$tpl = "links.php";
include "template.php";
?>

where template.php is your main site template, including common parts, like header, footer, menu etc:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My site. <?=$pagetitle?></title>
</head>
<body>
<div id="page">
<? include $tpl ?>
</div>
</body>
</html>

and links.php is the actual page template:

<h2><?=$pagetitle?></h2>
<ul>
<? foreach($DATA as $row): ?>
<li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li>
<? endforeach ?>
<ul>

easy, clean and maintainable.

settings.php contains all common settings:

<?php
$hostname_conn,$database_conn,$username_conn,$password_conn,$conn;
$hostname_conn = "localhost";
$database_conn = "test";
$username_conn = "****";
$password_conn = "****";
$conn = mysql_connect($hostname_conn, $username_conn, $password_conn) 
         or trigger_error(mysql_error(),E_USER_ERROR); 
mysql_query("SET NAMES 'utf8'") or trigger_error(mysql_error(),E_USER_ERROR);

$tpl = "default.php";
$pagetitle = "";

function dbgetarr(){
  $a     = array();
  $args  = func_get_args();
  $query = array_shift($args); 
  $query = str_replace("%s","'%s'",$query); 
  foreach ($args as $key => $val) { 
    $args[$key] = mysql_real_escape_string($val); 
  } 
  $query = vsprintf($query, $args);

  $res = mysql_query($query);
  if (!$res) {
    trigger_error("dbget: ".mysql_error()." in ".$query);
  } else {
    while($row = mysql_fetch_assoc($res)) $a[]=$row;
  }
  return $a;
}

?>
Your Common Sense
  • 156,878
  • 40
  • 214
  • 345
  • awesome dude, that's what i want! (mostly :) ) just one q! i want to know that if i imported my file form another directory, it probably gives error about file paths. for problems like this, will $_SERVER['DOCUMENT_ROOT'] command solve my problem? – mrtakdnz Oct 21 '10 at 17:35
  • 1
    @dreamlore yes, exactly for that purpose. It makes *an absolute path* out of the relative path from the site root. Say, you have `/templates/` dir in your site root. `"include /templates/file.php";` would be wrong, `include "templates/file.php";` would be relative and wrong anywhere outside root, while `include $_SERVER['DOCUMENT_ROOT'] ."/templates/file.php";` would be correct anywhere. – Your Common Sense Oct 21 '10 at 17:48
  • thanks for your explanation, it will be very useful for me. and thanks again for your answer... by the way i solve my problem temporarily with JavaScript but next time, i'll build my template like you are... – mrtakdnz Oct 21 '10 at 21:55