Всем привет. Я нашёл в интернете интересную
капчу и решил попробовать сделать что-то подобное на своём сайте, но только в классе (я новичок, поэтому не судите строго).
Вот что у меня получилось, но я не понимаю, как передать различные данные из бд в класс. Кроме того, при формировании каптчи выпавшее число не совпадает с нужным, иногда не выпадает вовсе и порой повторяется, хотя не должно (скрин ниже). Буду очень благодарен за помощь и советы.
class captcha
{
private $pdo;
function __construct($pdo)
{
$this->pdo = $pdo;
}
function getRecord()
{
$result = $this->pdo->query("SELECT `id` FROM tbl_term ORDER BY RAND() LIMIT 1");
return $result->fetch(PDO::FETCH_COLUMN);
}
function getCaptchaIcons()
{
$captcha = $this->pdo->prepare("SELECT tbl_captcha_images.*, tbl_term.name FROM tbl_captcha_images
JOIN tbl_term ON tbl_captcha_images.term_id = tbl_term.id WHERE term_id != ? ORDER BY RAND() LIMIT 4");
$captcha->execute([$this->getRecord()]);
$captchaResult = $captcha->fetchAll();
return $captchaResult;
}
function getRandomCaptchaId()
{
$captcha = $this->pdo->prepare("SELECT tbl_captcha_images.*, tbl_term.name FROM tbl_captcha_images
JOIN tbl_term ON tbl_captcha_images.term_id = tbl_term.id WHERE term_id = ? LIMIT 1");
$captcha->execute([$this->getRecord()]);
$captchaResult = $captcha->fetchAll();
return $captchaResult;
}
function captchaForm(){
$captchaOutput = array_merge($this->getCaptchaIcons(), $this->getRandomCaptchaId());
shuffle($captchaOutput);
echo ('<div class="row">
<div class="captcha-container">
<p> Select the <span class="text-color">'.$this->getRecord().'</span><span id="captcha-info" class="validation-message"></span></p>
<input type="hidden" name="captcha_code" value="">
');
foreach ($captchaOutput as $value) {
echo ('
<div class="svg-padding">'.$value['name'].'
<div class="svg">'.$value['captcha_icon'].'<input type="hidden" class="icons" value="'.$value['id'].'"></div>
</div>');
}
echo (' </div>
</div>');
}
}
И сам скриншот