Newsgroup: it.comp.www.php
Titolo: visualizzazione errata captcha

ciao a tutti, seguendo il codice qui sotto, per testare il sistema 
captcha, codice trovato su internet(
html.it
) se commento la riga:
header('Content-Type: image/png');
mi esegue lo script correttamente, visualizzando l'immagine, il form, e 
dentro l'immagine mi vsualizza giustamente i caratteri alfanumerici 
casuali, ma all'inizio della pagina mi fa vedere i simboli di caratteri 
strani come se mi facesse vedere la struttura in codice dell'immagine ( 
non se se mi sono spiegato, al massimo la posto)
se tolgo il commento, mi fa vedere solo l'immagine, senza form, senza 
errori e senza caratteri alfanumerici all'interno dell'immagine. Nel db 
controllando, sembra tutto corretto, nel senso che scrive e legge senza 
errori.
Perchè se tolgo l'intestazione fa così e se la metto non viene eseguito 
lo script come dovrebbe essere?
Ho sbirciato il manuale di php, ma tra il codice di esempio e il manuale 
non ci sono errori.
Qualcuno può aiutarmi a capire dove sbaglio?
Vorrei implementare questo codice all'interno di una pagina di 
iscrizione del Forum del mio sito, nel quale si registrano gli utenti.
Grazie a tutti per l'aiuto e la comprensione. Sempre a disposizione per 
ulteriori dettagli..
Ciao, Logan.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=db', 'user', 'password');
$stmt = $pdo->prepare("SELECT * FROM validation WHERE url_key = ? AND 
expire_date > NOW()");
$stmt->execute(array($_GET['token']));
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$texture = imagecreatefrompng('texture.png');
$source = imagecolorat($texture, rand(0, imagesx($texture)), rand(0, 
imagesy($texture)));
$r = ($source >> 16 & 0xff) + 50;
$g = ($source >> 8 & 0xff) + 50;
$b = ($source & 0xff) + 50;
$text_color = imagecolorallocate($texture, $r, $g, $b);
imagestring($texture, 5, (imagesx($texture) - strlen($row['captcha']) * 
5)/ 2, 5,  $row['captcha'], $text_color);
header('Content-Type: image/png');
imagepng($texture);
imagedestroy($texture);
function random_string($len)
{
    $string = "";
    $chars = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
                "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
                "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G",
                "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
                "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2",
                "3", "4", "5", "6", "7", "8", "9");
    for($i = 0; $i < $len; ++$i)
    {
       shuffle($chars);
       $string .= $chars[0];
    }
    return $string;
}
$message = 'Inserisci la stringa alphanumerica per effettuare la 
validazione:';
$pdo = new PDO('mysql:host=localhost;dbname=db', 'user', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if(isset($_POST['validate_token']))
{
    // Eseguo la validazione
    $stmt = $pdo->prepare("SELECT * FROM validation WHERE url_key = ? 
AND expire_date > NOW()");
    $stmt->execute(array($_POST['token']));
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    $message = ($row && ($row['captcha'] == $_POST['validate_token'])) ? 
'token corretto' : 'token <strong>NON</strong> corretto';
    $stmt = $pdo->prepare("DELETE FROM validation WHERE url_key = ?");
    $stmt->execute(array($_POST['token']));
}
// Elimino tutti i record scaduti
$pdo->query("DELETE FROM validation WHERE expire_date <= NOW()");
// Genero casualmente un record per la tabella validation
$url_key = sha1(uniqid(rand(), true)); // Possiamo (e dovremmo) fare meglio
$captcha = random_string(6);
$stmt = $pdo->prepare("INSERT INTO validation (id, url_key, captcha, 
expire_date) VALUES ('', ?, ?, DATE_ADD(NOW(), INTERVAL 5 MINUTE))");
$stmt->execute(array($url_key, $captcha));
?>
<html>
    <head>
       <title>CAPTCHA test</title>
    </head>
    <body>
       <form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
          <input type="hidden" name="token" value="<?php echo $url_key; 
?>" />
          <p>
             <?php echo $message; ?>
          </p>    <input type="text" name="validate_token" />
          <input type="submit" name="action" value="Test" />
          <img src="captcha.php?token=<?php echo $url_key; ?>" 
width="200" height="30" /><br/>
       </form>
    </body>
</html>

imagedestroy($texture);
Qui finisce il primo script. Assumendo che sia un esempio funzionante -
non ho controllato.
Leonardo
-- 
The cock doth craw, the day doth daw,
the channerin' worm doth chide:
gin we be mist oot o' oor place,
a sair pain we maun bide.