PDA

Visualizza la versione completa : Problemi con header location e ob_start()


paolo1964
14-04-2016, 14:47
Buongiorno, mi sono appena iscritto anche se vi seguo da tempo e leggendo il vostro forum ho realizzato un piccolo programma in php (semplice, non sono ancora arrivato alla programmazione ad oggetti). Questo programma funziona regolarmente su un certo hosting a pagamento, ora l'ho trasferito su altro hosting e non funziona pi¨. Il problema credo di aver capito Ŕ negli header location che io ho usato a profusione nel mio programma e non sono all'inizio dello script. Ho letto che potrei usare la funzione ob_start, ma non saprei dove metterla visto che entro ed esco spesso dal php. Vi scrivo uno dei miei file e vi chiedo:
1) Ŕ proprio sbagliata l'impostazione? e se si come dovrebbe essere quella giusta.
2) se volessi usare ob_start() dove dovrei metterlo? visto che esco e poi rientro nel php.
(in altri file alterno ancora di pi¨ php e html)

Grazie in anticipo a chiunque abbia la pazienza di aiutarmi

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="../pfcss/pfform.css" type="text/css">
</head>
<body>
<?php
session_start();
require_once '../header3.php';
if(isset($_SESSION['username'])) {

if(isset($_GET['id_articolo'])){$code=$_GET['id_articolo'];}
if(isset($_POST['invia'])){
$cod=$_POST['code'];

$codice_articolo = $_POST['codice_articolo'];
$descr_breve = $_POST['descr_breve'];
$descr_breve = addslashes(stripslashes($descr_breve));
$unita_misura = $_POST['unita_misura'];
$unita_misura = addslashes(stripslashes($unita_misura));
$nota_articolo = $_POST['nota_articolo'];
$nota_articolo = addslashes(stripslashes($nota_articolo));
$giacenza = $_POST['giacenza'];
$inventariato = $_POST['inventariato'];

//inserting data order
try{
$sql = "UPDATE articolo SET codice_articolo='$codice_articolo', descr_breve='$descr_breve', unita_misura='$unita_misura', nota_articolo='$nota_articolo', giacenza='$giacenza', inventariato ='$inventariato' WHERE id_articolo='$cod'";
$count = $conn->exec($sql);

$conn = null;
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
if($count == 0){
echo "<br><br>";
echo "<td> NESSUNA OPERAZIONE EFFETTUATA </td>";
echo "<br><br>";
echo "<a href='../ordiniadmin/adminordini.php'>TORNA INDIETRO</a>";
}
else{
header("location: vediarticolo.php");:facepalm::facepalm::facepalm:
}
}else{
$sql = "select * from articolo where id_articolo = '$code'";
foreach ($conn->query($sql) as $row){

$codice_articolo = $row["codice_articolo"];
$descr_breve = $row["descr_breve"];
$id_gruppo = $row["id_gruppo"];
$unita_misura = $row["unita_misura"];
$nota_articolo = $row["nota_articolo"];
$giacenza = $row["giacenza"];
$inventariato = $row["inventariato"];
}

?>
<h4> SELEZIONA I CAMPI DA VARIARE</h4>
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
<fieldset>
<legend>CODICE ARTICOLO</legend>
<label>SIGLA <input type="text" name="codice_articolo" id="codice articolo" value="<?php echo $codice_articolo ?>"></label>
</fieldset>
<br>
<fieldset>
<legend>DESCRIZIONE BREVE</legend>
<label>DESCRIZIONE ARTICOLO <input size="80%" type="text" name="descr_breve" id="descr_breve" value="<?php echo $descr_breve ?>"></label>
</fieldset>
<br>
<fieldset>
<legend>UNITA DI MISURA </legend>
<label>U.M. <input size="5" type="text" name="unita_misura" id="unita_misura" value="<?php echo $unita_misura ?>"></label>
</fieldset>
<br>
<fieldset>
<legend>NOTA ARTICOLO</legend>
<label>NOTA ARTICOLO FACOLTATIVA <input size="80%" type="text" name="nota_articolo" id="nota_articolo" value="<?php echo $nota_articolo ?>"></label>
</fieldset>
<br>
<fieldset>
<legend>GRUPPO</legend>

<label>GRUPPO MERCEOLOGICO <select name="id_gruppo" required>
<?php
$sql = "SELECT * FROM gruppi";
foreach($conn->query($sql) as $row){
print "<option value='$row[id_gruppo]' ";
if ($row['id_gruppo']==$id_gruppo)echo "selected";
print "> $row[descr_gruppo] </option>";
}
?>
</select></label>
</fieldset>
<br>
<fieldset>
<legend>GIACENZA</legend>
<label>QUANTITA IN GIACENZA <input size="12" type="text" name="giacenza" id="giacenza" value="<?php echo $giacenza ?>"></label>
</fieldset>
<br>
<fieldset>
<legend>INVENTARIATO </legend>
<label>INVENTARIATO 0=NO 1=SI <input size="1" type="text" name="inventariato" id="inventariato" value="<?php echo $inventariato ?>"></label>
</fieldset>
<input type="hidden" name="code" value="<?php echo $code ?>">
<br><br>
<button type="submit" name="invia" id="invia">Invia</button>
<button type="reset" id="cancella">Cancella</button>
</form>
<br>
<a href='../ordiniadmin/adminordini.php'>TORNA INDIETRO</a>
<?php
}
}else{
header ('location: ../ingresso.php');:facepalm::facepalm::facepalm:
}
?>
</body>
</html>

gaten
14-04-2016, 15:07
ob_start(), dovresti richiamarla prima del tag html e ob_end_flush() dopo il tag html di chiusura.

k.b
14-04-2016, 15:13
Prima di tutto ti invito a leggere il regolamento su come postare correttamente il codice all'interno del messaggio.

Venendo alle tue domande:
1) si, in tutta onesta' il codice postato e' un'enciclopedia di errori: come hai giustamente dedotto, nessun output puo' essere generato prima di inviare header, quindi dovresti ristrutturare il codice per avere prima tutto cio' che riguarda eventuali redirect e poi l'output, di qualunque tipo. La cosa migliore, direi anzi necessaria, e' separare COMPLETAMENTE codice PHP e HTML, possibilmente usando un template engine: anche sistemando il problema degli header, un codice del genere e' un incubo di leggibilita' e manutenzione. Era comprensibile nei primi tempi di PHP, ma ormai una struttura del genere e' come usare un modem 56k al posto della fibra ottica.
Oltre a questo, c'e' la nota positiva dell'utilizzo di PDO, ma la cosa e' completamente vanificata dalla serie di addslashes() e stripslashes() il cui scopo inteso e' fare quello che i prepared statements fanno nel modo giusto.

2) lo sconsiglio e non so nemmeno se funziona correttamente, ma puoi provare a mettere un semplice


<?php ob_start(); ?>

come prima riga dello script, ma l'output buffering in teoria serve a tutt'altro, e usato cosi' e' la soluzione sbagliata a un problema che e' solo di progettazione del codice.

paolo1964
14-04-2016, 15:44
Mi scuso per l'errore nella pubblicazione del codice, non avevo letto. Capisco quello che mi dici, purtroppo imparando da solo su internet ci si imbatte in cose ormai superate e lo si scopre troppo tardi.
Volevo chiederti secondo te perchŔ il mio codice su un hosting che ha php 5.4.44 funziona? E' dovuto all'impostazione del php.ini?
Seconda cosa e assai pi¨ importante, dove potrei documentarmi per capire meglio come realizzare la separazione tra php e html senza correre il rischio di ricadere in cose giÓ superate? Potresti approfondire meglio il discorso sui 'template engine'?
Ho comprato alcuni manuali ma non so perchŔ tramite i libri non riesco ad apprendere mentre leggendo vari articoli su internet comprendo meglio.
Grazie.

k.b
14-04-2016, 16:01
Mi scuso per l'errore nella pubblicazione del codice, non avevo letto. Capisco quello che mi dici, purtroppo imparando da solo su internet ci si imbatte in cose ormai superate e lo si scopre troppo tardi.
Volevo chiederti secondo te perchŔ il mio codice su un hosting che ha php 5.4.44 funziona? E' dovuto all'impostazione del php.ini?
Si e' un'impostazione del php.ini che puo' abilitare o disabilitare l'output buffering.


Seconda cosa e assai pi¨ importante, dove potrei documentarmi per capire meglio come realizzare la separazione tra php e html senza correre il rischio di ricadere in cose giÓ superate? Potresti approfondire meglio il discorso sui 'template engine'?
Ho comprato alcuni manuali ma non so perchŔ tramite i libri non riesco ad apprendere mentre leggendo vari articoli su internet comprendo meglio.
Grazie.
Ho imparato PHP ormai parecchi anni fa e quindi non ti so consigliare guide di cui abbia esperienza diretta. Se vuoi lavorare seriamente con PHP imparando a sviluppare in maniera organizzata ti consiglio di studiare un framework come Laravel, andando ad approfondire con ricerche mirate (o chiedendo qui) i punti che non ti sono chiari.

paolo1964
14-04-2016, 17:44
Grazie, ho dato uno sguardo a Laravel, mi sÓ che forse Ŕ un salto troppo alto per me ma ci prover˛ sicuramente. Un' ultima domanda per risolvere il problema nell'immediato, nello script sopra pubblicato, a parte tutti gli errori, cosa dovrei utilizzare al posto di header location per indirizzare ad atra pagina? (tenete presente che in altri script dove uso header location passo insieme anche delle variabili).

k.b
14-04-2016, 17:47
Grazie, ho dato uno sguardo a Laravel, mi sÓ che forse Ŕ un salto troppo alto per me ma ci prover˛ sicuramente. Un' ultima domanda per risolvere il problema nell'immediato, nello script sopra pubblicato, a parte tutti gli errori, cosa dovrei utilizzare al posto di header location per indirizzare ad atra pagina? (tenete presente che in altri script dove uso header location passo insieme anche delle variabili).
In PHP (che poi in questo caso significa in HTML) non c'e' un altro modo, l'unica alternativa e' farlo in javascript ma e' una soluzione ancora peggiore.

Loading