Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Problemi con header location e ob_start()

    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");
    }
    }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');
    }
    ?>
    </body>
    </html>

  2. #2
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    ob_start(), dovresti richiamarla prima del tag html e ob_end_flush() dopo il tag html di chiusura.
    Con i sogni possiamo conoscere il futuro...

  3. #3
    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
    Codice PHP:
    <?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.

  4. #4
    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.

  5. #5
    Quote Originariamente inviata da paolo1964 Visualizza il messaggio
    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.

    Quote Originariamente inviata da paolo1964 Visualizza il messaggio
    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.

  6. #6
    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).

  7. #7
    Quote Originariamente inviata da paolo1964 Visualizza il messaggio
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.