Joomla.it Forum
Non solo Joomla... => Sviluppo => : lory22 09 Jun 2011, 14:00:14
-
qualcuno sa dirmi dove sto sbagliando con il codice di questo captcha.... non visualizza le lettere e penso sia un problema di passaggio della variabile di sessione...
vi posto il codice:
<?php
$session =& JFactory::getSession();
if (empty($session->get('rand_code'))){
$str = "";
$length = 0;
$caratteri = "abcdefghijkmnpqrstuvwxyz123456789"; /* Caratteri che appaiono come immagine */
for ($i = 0; $i < 5; $i++){ /* il 5 indica il numero di caratteri-immagine che appaiono */
$str .= $caratteri{rand(0,34)};
}
$session->set('rand_code', $str);
//$_SESSION['rand_code'] = $str;
echo $str;
}
$imgX = 60;//Sposta a dx i caratteri-immagine
$imgY = 18;//Sposta in alto i caratteri-immagine
$image = imagecreatetruecolor(60, 20);
$backgr_col = imagecolorallocate($image, 238,239,239);//Colore di sfondo
$border_col = imagecolorallocate($image, 208,208,20);//Colore del bordo
$text_col = imagecolorallocate($image, 46,60,31);//Colore dei caratteri-immagine
imagefilledrectangle($image, 0, 0, 60, 20, $backgr_col);//Cambiando i 4 valori appare un'ombra nera e si può creare un'effetto rilievo o incassato del rettangolo
imagerectangle($image, 0, 0, 59, 19, $border_col);// Sposta il bordino colorato del rettangolo
$font = "monofont.ttf";
$font_size = 14;//Dimensione dei caratteri-immagine
$angle = 0;//Ruota obliqui i caratteri-immagine
$box = imagettfbbox($font_size,$angle,$font,$session->get('rand_code'));
$x = (int)($imgX - $box[4]) / 2;//Sposta a sx i caratteri-immagine
$y = (int)($imgY - $box[5]) / 2;//Sposta in alto i caratteri-immagine
imagettftext($image,$font_size,$angle,$x,$y,$text_col,$font,$session->get('rand_code'));
header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy ($image);
//Fine Captca-image
//require_once 'indexcaptcha.php';
?>
-
ci sono le librerie grafiche di php sul server?
M.
-
$font = "monofont.ttf";
??? e questo dove lo hai messo ???? manca il path assoluto
header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy ($image);
In teoria giusto, ma se per qualche motivo c'è un warning ti salta l'immagine prima pulisci il tutto
ob_clean();
per ultimo per mia abitudine non uso
if (empty($session->get('rand_code'))){
quindi basta che tu sia sicuro che restituisce true quando è vuoto
per il resto il codice mi sembra corretto
-
le librerie grafiche ci sono .....
per il resto ho provato ma nulla, posto il codice che aveva le sessioni non richiamate con joomla
<?php
//Captca-image
session_start();
if (empty($_SESSION['rand_code'])){
$str = "";
$length = 0;
$caratteri = "abcdefghijkmnpqrstuvwxyz123456789"; /* Caratteri che appaiono come immagine */
for ($i = 0; $i < 5; $i++){ /* il 5 indica il numero di caratteri-immagine che appaiono */
$str .= $caratteri{rand(0,34)};
}
$_SESSION['rand_code'] = $str;
}
$imgX = 60;//Sposta a dx i caratteri-immagine
$imgY = 18;//Sposta in alto i caratteri-immagine
$image = imagecreatetruecolor(60, 20);
$backgr_col = imagecolorallocate($image, 238,239,239);//Colore di sfondo
$border_col = imagecolorallocate($image, 208,208,20);//Colore del bordo
$text_col = imagecolorallocate($image, 46,60,31);//Colore dei caratteri-immagine
imagefilledrectangle($image, 0, 0, 60, 20, $backgr_col);//Cambiando i 4 valori appare un'ombra nera e si può creare un'effetto rilievo o incassato del rettangolo
imagerectangle($image, 0, 0, 59, 19, $border_col);// Sposta il bordino colorato del rettangolo
$font = "monofont.ttf";
$font_size = 14;//Dimensione dei caratteri-immagine
$angle = 0;//Ruota obliqui i caratteri-immagine
$box = imagettfbbox($font_size,$angle,$font,$_SESSION['rand_code']);
$x = (int)($imgX - $box[4]) / 2;//Sposta a sx i caratteri-immagine
$y = (int)($imgY - $box[5]) / 2;//Sposta in alto i caratteri-immagine
imagettftext($image,$font_size,$angle,$x,$y,$text_col,$font,$_SESSION['rand_code']);
header("Content-type: image/jpeg");
imagejpeg($image);
imagedestroy ($image);
//Fine Captca-image
//require_once 'indexcaptcha.php';
?>
ho provato a utilizzare il jfactory di joomla ma evidentemente ho sbagliato qualcosa,
-
ma adesso ti funziona?
-
non visualizza le lettere
potrebbe essere un problema di server, lo so perchè per imprudenza e in seguito ad un malinteso con l'assistenza si è creata la stessa situazione nel mio server dedicato..
se fosse la stessa situazione, io l'ho risolta usando una chacpa esterna.
-
... ma puoi mettere un header() in quel punto?
M.
-
mau_develop in teoria hai ragione sarebbe buona norma mettere l'istruzione header all'inizio perché se lo script invia dei dati di output (anche un solo spazio bianco) si compromette l'invio dell'header, ma nei cms prima di iniziare a far girare il codice del plugin o del componente che hai scritto è già passato in così tante classi che qualche riga in più o in meno di codice non credo faccia poi la differenza.
E comunque alla fine ho capito l'errore di Lory!!!!
non è un problema di sessioni che mi sembrano scritte correttamente, ma su questo cavolo di empty ( l'avevo detto che non lo conoscevo...)
dalla guida ufficiale del php
Note:
empty() only checks variables as anything else will result in a parse error. In other words, the following will not work: empty(trim($name)).
insomma non si può scrivere
if (empty($session->get('rand_code'))){ ... }
ma se vuoi usare empty devi scrivere
$randCode = $session->get('rand_code');
if (empty($randCode)){ ... }
P.S.
cmq lory abilita nel php.ini le segnalazioni agli errori perché session_start(); ti dovrebbe dare un notice come doveva averti dato errore empty... altrimenti rischi di scrivere del codice pieno di errori