PDA

View Full Version : [PHP] Problema con ob_start e codice innestato


[000]Jean
17-04-2008, 01:00
Sto seguendo un tutorial (http://spinningtheweb.blogspot.com/2006/07/approximating-master-pages-in-php.html) che ho trovato in giro che spiega come creare dei templates in stile master page di ASP.NET. Per ora sembrava andare tutto bene, ma quando ho provato a innestare del codice PHP all'interno del contenuto delle pagine, ha smesso di funzionare.

Questo è il codice del template:<?php
include "common.inc.php";
if (basename($_SERVER["PHP_SELF"]) <> "index.php") {
session_start();
if (!session_is_registered('biblioteca')) errore_accesso('3');
else $logged = 1;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Biblioteca - <?php echo $titolo; ?></title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<br />
<h1>Biblioteca</h1>
<h2><?php echo $titolo; ?></h2>
<br />
<div class="container">
<div class="nav">
<form class="log" action="<?php if (!$logged) echo "login.php"; else echo "logout.php";?>" method="POST" name="log">
<?php if ($logged) echo "Benvenuto ".$_SESSION['user']."\n<br />"; ?>
<div <?php if ($logged) echo "class=\"hidden\"";?>>
<label>User:</label> <input type="text" name="user"><br />
<label>Password:</label> <input type="password" name="pass"><br />
<input type="submit" value="Entra" name="invia">
<input type="reset" value="Reset" name="reset">
</div>
<input <?php if (!$logged) echo "class=\"hidden\"";?> type="submit" value="Logout" name="logout">
</form>
<ul>
<li><a href="autori_add.php">Inserimento autori</a></li>
<li><a href="libri_add.php">Inserimento libri</a></li>
<li><a href="editori_add.php">Inserimento editori</a></li>
<li><a href="lingue_add.php">Inserimento lingue</a></li>
</ul>
</div>
<?php if (is_set($logged)) echo "<div class=\"".$msg_class."\">".$msg_text."</div>\n";
else if($_SESSION['msg_text'] <> '') {
echo "<div class=\"".$_SESSION['msg_class']."\">".$_SESSION['msg_text']."</div>\n";
$_SESSION['msg_text'] = '';
}
?>
<div class="content">
<?php echo $content; ?>
</div>
</div>
<div class="footer">Questo sito è un esercizio di PHP realizzato da Tizio Caio, mat 39999</div>
</body>
</html>E questo è il codice di una generica pagina con un echo innestato, che funziona<?php ob_start();?>
Questa &egrave; la pagina di benvenuto.
<br />
<br />
<?php echo "Questo è del codice innestato"; ?>
<?php
$content = ob_get_clean();
$titolo = "Pagina iniziale";
include("template.php");
?>Se invece provo con questa, mi risponde picche:<?php ob_start(); ?>
Inserimento autori:
<form action="autori_q.php" method="POST" name="autori">
<label>Cognome: </label><input type="text" name="cognome"><br />
<label>Nome: </label><input type="text" name="nome"><br />
<label>Nome tradotto: </label><input type="text" name="nome_trad"><br />
<label>Qualifica: </label><input type="text" name="qualifica"><br />
<label>Pseudonimo: </label><input type="text" name="pseudonimo"><br /><br />
<?php
$conn = mysql_connect("localhost", "root") or send_msg("ERRORE: connessione al server non riuscita", "msg_err");
mysql_select_db("biblioteca", $conn) or send_msg("ERRORE: scelta del database non riuscita", "msg_err");
$sql = "SELECT * FROM lingue";
$res = mysql_query($sql, $conn);
$num = mysql_num_rows($res);
if($num > 0) {
echo "<select name=\"lingua\">\n";
while ($row = mysql_fetch_array($res)) {
echo "<option name=\"".$row['0']."\">".$row['0']."</option>\n";
}
echo "</select>";
} else send_msg("ERRORE: non è stata inserita nessuna lingua", "msg_err");
?>
<input type="submit" value="Inserisci"> <input type="reset" value="Cancella">
</form>
<?php
$content = ob_get_clean();
$titolo = "Inserimento autori";
include("template.php");
?>Se provo a innestare questo codice, mi tira fuori una pagina contenente solo ciò che è compreso tra l'ob_start() e il primo tag <?php ?>. Se tolgo il codice innestato, o provo con la pagina di prima, va tutto a meraviglia.

Cosa sto sbagliando? :muro:

[000]Jean
17-04-2008, 01:08
Credo di aver in qualche modo isolato il problema: questa tecnica non digerisce le parentesi graffe :| Possibile? Da che dovrebbe dipendere?

VICIUS
17-04-2008, 01:24
Ora non ricordo di preciso come funziona il buffering dell'output in php però penso che il problema sia dovuto al fatto che dai due volte ob_start() mentre alla fine non chiami ob_end_flush().

OT: non è che per caso conosci un certo eteria? :)

[000]Jean
17-04-2008, 01:32
OT: Si che lo conosco :P

Allora, il secondo ob_start me l'ero scordato, l'ho tolto e l'esito non cambia. Poi, se faccio ob_get_clean(), è come se facessi ob_get_content() e ob_clean() assieme, quindi quel problema non dovrebbe presentarsi.

VICIUS
17-04-2008, 07:10
Allora, il secondo ob_start me l'ero scordato, l'ho tolto e l'esito non cambia. Poi, se faccio ob_get_clean(), è come se facessi ob_get_content() e ob_clean() assieme, quindi quel problema non dovrebbe presentarsi.
Se template.php è come quello del tutorial non dovrebbero esserci problemi e anche il resto del codice sembra corretto. A questo punto non ti resta che controllare che la query ritorni effettivamente dei risultati.

Come ultima cosa puoi provare a concatenare tutti gli output in una unica stringa invece di usare ob_start/get_clean per controllare che effettivamente il problema siano queste funzioni.

Jean;22056242']OT: Si che lo conosco :P
Allora ecco perché mi sembrava di averti già incontrato. Ci saremo incrociati su un qualche server di unreal o et :D

[000]Jean
17-04-2008, 09:40
Come non detto, l'errore non è colpa delle parentesi graffe, ma della funzione che scatta con l'else, la send_msg. Codice della funzione:
function send_msg($msg, $color) {
if(!session_is_registered('imbottigliamento')) {
errore_accesso('3');
} else {
$_SESSION['msg_text'] = $msg;
$_SESSION['msg_class'] = $color;
header("Location: homepage.php");
}
}Sarà mica colpa dell'header? Non credo, siamo in buffering, non dovrebbe aver ancora mandato nulla!! :muro: