使用 PHP 创建图像验证码
Create image captcha with PHP
您好,我想用 php 创建图像验证码,我有下一个表单代码。
<form action="" method="POST">
<div class="label_form">Usuario:</div> <input type="text" name="user"/><br>
<div class="label_form">Contraseña:</div> <input type="password" name="pass"/><br>
<img alt="Numeros aleatorios" src="layouts/captcha.php" />
<input class="label_form" type="text" name="num"/><br>
<input type="submit" value="ENTRAR" name="submit"/>
</form>
这是发送表单前的验证代码:
if (isset($_POST["submit"])) {
if ($_SESSION['img_number'] != $_POST['num']) {
echo "<div class='msg_error'>Los caracteres no se corresponden.</div>";
} else {
/*DO STUFF*/
}
}
在另一个名为 captcha.php
的文件中,我有代码 php 用于生成图像:
header("Content-type: image/png");
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 5; $i++) {
$pos = rand(0, 36);
$str. = $string {
$pos
};
}
$img_handle = ImageCreate(60, 22) or die("Es imposible crear la imagen");
$back_color = ImageColorAllocate($img_handle, 102, 102, 153);
$txt_color = ImageColorAllocate($img_handle, 255, 255, 255);
ImageString($img_handle, 31, 5, 0, $str, $txt_color);
Imagepng($img_handle);
session_start();
$_SESSION['img_number'] = $str;
这给出了一张损坏的图像,显示了来自 img
"Numeros aleatorios"
的 alt,所以告诉我 file.php
可以正常调用 img
但生成的代码是不工作,任何帮助是感激 :D 谢谢。
尝试更改:
$str .= $string{$pos};
到
$str .= $string[$pos]; //Array of strings.
我更新了我的答案:
<?php
header("Content-type: image/png");
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 5; $i++) {
$pos = rand(0,36);
$str .= $string[$pos];
}
$img_handle = ImageCreate (60, 22) or die ("Es imposible crear la imagen");
$back_color = ImageColorAllocate($img_handle,102,102,153);
$txt_color = ImageColorAllocate($img_handle,255,255,255);
ImageString($img_handle, 31, 5, 0, $str, $txt_color);
Imagepng($img_handle);
session_start();
$_SESSION['img_number'] = $str;
?>
在我的本地服务器中,验证码图像显示正确。
您的代码很好,您唯一错过的是在 catpcha.php
文件的顶部声明 $str = ""
这是您的代码的有效捕获:
更新
你的 $string
长度是 36,所以你应该生成一个介于 0 和 35 之间的随机位置,如下所示:
$pos = rand(0,35);
否则,您有时会收到损坏的图像和 PHP 通知。
更新 N°2
之所以没有声明 $str = ""
就得到了损坏的图像,是因为这一行
$str .= $string{$pos};
抛出 PHP
通知并损坏图像。 (当然,只有当你 display_errors 时,这就是它在@Danny 的服务器上完美运行的原因)
您好,我想用 php 创建图像验证码,我有下一个表单代码。
<form action="" method="POST">
<div class="label_form">Usuario:</div> <input type="text" name="user"/><br>
<div class="label_form">Contraseña:</div> <input type="password" name="pass"/><br>
<img alt="Numeros aleatorios" src="layouts/captcha.php" />
<input class="label_form" type="text" name="num"/><br>
<input type="submit" value="ENTRAR" name="submit"/>
</form>
这是发送表单前的验证代码:
if (isset($_POST["submit"])) {
if ($_SESSION['img_number'] != $_POST['num']) {
echo "<div class='msg_error'>Los caracteres no se corresponden.</div>";
} else {
/*DO STUFF*/
}
}
在另一个名为 captcha.php
的文件中,我有代码 php 用于生成图像:
header("Content-type: image/png");
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 5; $i++) {
$pos = rand(0, 36);
$str. = $string {
$pos
};
}
$img_handle = ImageCreate(60, 22) or die("Es imposible crear la imagen");
$back_color = ImageColorAllocate($img_handle, 102, 102, 153);
$txt_color = ImageColorAllocate($img_handle, 255, 255, 255);
ImageString($img_handle, 31, 5, 0, $str, $txt_color);
Imagepng($img_handle);
session_start();
$_SESSION['img_number'] = $str;
这给出了一张损坏的图像,显示了来自 img
"Numeros aleatorios"
的 alt,所以告诉我 file.php
可以正常调用 img
但生成的代码是不工作,任何帮助是感激 :D 谢谢。
尝试更改:
$str .= $string{$pos};
到
$str .= $string[$pos]; //Array of strings.
我更新了我的答案:
<?php
header("Content-type: image/png");
$string = "abcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 5; $i++) {
$pos = rand(0,36);
$str .= $string[$pos];
}
$img_handle = ImageCreate (60, 22) or die ("Es imposible crear la imagen");
$back_color = ImageColorAllocate($img_handle,102,102,153);
$txt_color = ImageColorAllocate($img_handle,255,255,255);
ImageString($img_handle, 31, 5, 0, $str, $txt_color);
Imagepng($img_handle);
session_start();
$_SESSION['img_number'] = $str;
?>
在我的本地服务器中,验证码图像显示正确。
您的代码很好,您唯一错过的是在 catpcha.php
文件的顶部声明 $str = ""
这是您的代码的有效捕获:
更新
你的 $string
长度是 36,所以你应该生成一个介于 0 和 35 之间的随机位置,如下所示:
$pos = rand(0,35);
否则,您有时会收到损坏的图像和 PHP 通知。
更新 N°2
之所以没有声明 $str = ""
就得到了损坏的图像,是因为这一行
$str .= $string{$pos};
抛出 PHP
通知并损坏图像。 (当然,只有当你 display_errors 时,这就是它在@Danny 的服务器上完美运行的原因)