Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha.
>
Citar
// Contato.php
<form class="form-signin" method="post">
<h2 class="form-signin-heading"></h2><BR>
<label for="Nome">Nome:</label>
<input type="text" name="nome" id="nome" class="form-control" placeholder="" required>
<label for="email">E-mail:</label>
<input type="email" name="email" id="email" class="form-control" placeholder="" required>
<label for="Telefone">Telefone:</label>
<input type="text" name="telefone" id="inputTel" class="form-control" placeholder="" required>
<label for="Telefone">Mensagem:</label>
<textarea class="form-control" cols="20" id="mensagem" name="mensagem" rows="10" required></textarea>
<BR>
<img src="captcha.php?l=150&a=50&tf=20&ql=5">
<label for="captchaAnswer" class="sr-only">Captcha Answer</label>
<input type="text" class="input-padrao text-center" id="captchaAnswer" name="check">
<BR>
<BR><BR>
// captcha
<?php
session_start(); // inicial a sessao
header("Content-type: image/jpeg"); // define o tipo do arquivo
function captcha($largura,$altura,$tamanho_fonte,$quantidade_letras){
$imagem = imagecreate($largura,$altura); // define a largura e a altura da imagem
$fonte = "verdana.ttf"; //voce deve ter essa ou outra fonte de sua preferencia em sua pasta
$preto = imagecolorallocate($imagem,0,0,0); // define a cor preta
$branco = imagecolorallocate($imagem,255,255,255); // define a cor branca
// define a palavra conforme a quantidade de letras definidas no parametro
$quantidade_letras
$palavra = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQq
RrSsTtUuVvYyXxWwZz23456789"),0,($quantidade_letras));
$_SESSION["palavra"] = $palavra; // atribui para a sessao a palavra gerada
for($i = 1; $i <= $quantidade_letras; $i++){
imagettftext($imagem,$tamanho_fonte,rand(-25,25),($tamanho_fonte*$i),
($tamanho_fonte + 10),$branco,$fonte,substr($palavra,($i-1),1));
// atribui as letras a imagem
}
imagejpeg($imagem); // gera a imagem
imagedestroy($imagem); // limpa a imagem da memoria
}
$largura = $_GET["l"]; // recebe a largura
$altura = $_GET["a"]; // recebe a altura
$tamanho_fonte = $_GET["tf"]; // recebe o tamanho da fonte
$quantidade_letras = $_GET["ql"]; // recebe a quantidade de letras que o captcha terá
captcha($largura,$altura,$tamanho_fonte,$quantidade_letras);
// executa a funcao captcha passando os parametros recebidos
?>
O problema mais provável aí é que o captcha.php nem está executando por causa de erro de sintaxe ou de ambiente, então o navegador mostra só o ícone de imagem quebrada.
Vou apontar os pontos críticos e já te deixo um exemplo de código corrigido.
Mas eu usaria o Anti Gravity para tentar solucionar, eu usei para criar esse site, ficou top!
1. Tem um erro de sintaxe na sua função
Aqui no seu código:
// define a palavra conforme a quantidade de letras definidas no parametro
$quantidade_letras $palavra = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQq RrSsTtUuVvYyXxWwZz23456789"),0,($quantidade_letras));
Essa linha:
$quantidade_letras
está sozinha, sem ponto e vírgula e sem fazer nada.
Isso gera Parse error no PHP, e a imagem simplesmente não é gerada.
Solução: apaga essa linha ou coloca um ; se for realmente usar (mas aqui ela é inútil), ficando assim:
// define a palavra conforme a quantidade de letras definidas no parâmetro
$palavra = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtUuVvYyXxWwZz23456789"), 0, $quantidade_letras);
2. Verifica se o arquivo verdana.ttf existe no caminho certo
Você colocou:
$fonte = "verdana.ttf";
Isso significa que o PHP está procurando o arquivo verdana.ttf **na mesma pasta do captcha.php**.
-
Certifique-se de que o arquivo da fonte está realmente lá.
-
Se estiver em outra pasta, por exemplo fonts/verdana.ttf, altere para:
$fonte = __DIR__ . "/fonts/verdana.ttf";
Se a fonte não for encontrada, imagettftext pode falhar e não desenhar nada.
3. Verifica se a extensão GD está ativa (XAMPP / EasyPHP)
Esse trecho usa funções da biblioteca **GD**:
$imagem = imagecreate($largura,$altura); imagecolorallocate(...); imagettftext(...); imagejpeg(...);
Se a GD não estiver habilitada, você vai ter erros do tipo Call to undefined function imagecreate().
No php.ini, veja se tem algo assim:
extension=gd
ou
extension=gd2
e se não estiver comentado (sem ; no início). Depois reinicia o Apache.
4. Garante que o caminho do captcha.php está certo no <img>
No formulário você colocou:
<img src="captcha.php?l=150&a=50&tf=20&ql=5">
Isso só vai funcionar se:
-
contato.php e captcha.php estiverem na mesma pasta
ou
-
O caminho relativo estiver correto, por exemplo:
<img src="includes/captcha.php?l=150&a=50&tf=20&ql=5">
Se o caminho estiver errado, você vai ver **erro 404** na aba “Network” do DevTools do navegador.
5. Código do captcha.php ajustado
Aqui vai uma versão já corrigida e um pouco mais robusta do seu script:
<?php session_start(); // IMPORTANTE: não pode ter nenhum espaço/linha antes do <?php header("Content-type: image/jpeg"); function captcha($largura, $altura, $tamanho_fonte, $quantidade_letras) { // cria a imagem $imagem = imagecreate($largura, $altura); // cores $preto = imagecolorallocate($imagem, 0, 0, 0); $branco = imagecolorallocate($imagem, 255, 255, 255); // preenche o fundo imagefilledrectangle($imagem, 0, 0, $largura, $altura, $preto); // caminho da fonte $fonte = __DIR__ . "/verdana.ttf"; // ajuste se necessário // gera a palavra $caracteres = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtUuVvYyXxWwZz23456789"; $palavra = substr(str_shuffle($caracteres), 0, $quantidade_letras); $_SESSION["palavra"] = $palavra; // escreve letra por letra for ($i = 0; $i < $quantidade_letras; $i++) { $angulo = rand(-25, 25); $x = 10 + ($tamanho_fonte * $i); $y = $altura - 10; imagettftext( $imagem, $tamanho_fonte, $angulo, $x, $y, $branco, $fonte, $palavra[$i] ); } imagejpeg($imagem); imagedestroy($imagem); } // pega os parâmetros GET com valores padrão $largura = isset($_GET["l"]) ? (int)$_GET["l"] : 150; $altura = isset($_GET["a"]) ? (int)$_GET["a"] : 50; $tamanho_fonte = isset($_GET["tf"]) ? (int)$_GET["tf"] : 20; $quantidade_letras= isset($_GET["ql"]) ? (int)$_GET["ql"] : 5; captcha($largura, $altura, $tamanho_fonte, $quantidade_letras);
6. Como testar se está tudo certo
-
No navegador, acesse direto o arquivo:
http://localhost/sua-pasta/captcha.php?l=150&a=50&tf=20&ql=5
-
Se aparecer a imagem do captcha:
-
o caminho está certo
-
o GD está ok
-
a sintaxe está ok
-
Se não aparecer:
-
Olha o log de erros do PHP ou ativa isso no topo de captcha.php (temporariamente):
ini_set('display_errors', 1); error_reporting(E_ALL);
(Lembra que isso pode quebrar o header da imagem, então usa só pra depurar mesmo.)
Veja se seu php está habilitado essas funções: imagejpeg e imagettftext
Preparei um exemplo didático com arquivos aqui: https://drive.google.com/file/d/1dcqxJvZltxsxjLzBycCEKnr33S-IDUlG/view?usp=sharing