#php #html #sql
#php #HTML #sql
Вопрос:
Как следует из названия, я пытаюсь сравнить «коды», которые не используются в моей базе данных, с текстовым полем ввода. Однако, даже если оба равны, они не совпадают. Я объясню проблему ниже:
SQL (PromoCode.php ):
public function SelectPromoCode($db) {
$stmt = $db->prepare(
" SELECT *
FROM `promocode_3`
WHERE used = 0
");
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $rows;
}
Это просто выбирает только неиспользуемые коды в моей базе данных (где используется = 0)
Здесь пользователь пытается ввести код (name = активировать)
Теперь вот файл, в котором происходит сравнение между базой данных и пользовательским вводом (membership.php ):
//connecting to the SQL Select
require_once($routePath . "_mc/PromoCode.mc.php");
$mcPromoCode = new PromoCode_MC();
// variable for the SQL Select
$coupons3 = $mcPromoCode->SelectPromoCode($db);
// isset for the redeem button
if (isset($_POST['redeem']) amp;amp; $_POST['redeem'] == 'REDEEM') {
$couponCode = $_POST['lux_code'];
// looping through the SQL select
foreach($coupons3 as $coupons_db3) {
if ($couponCode == $coupons_db3['coupon_code']) {
echo $coupons_db3['coupon_code'];
echo ' equal to ';
echo $couponCode;
?><br><?php
} else if ($couponCode != $coupons_db3['coupon_code']) {
echo $coupons_db3['coupon_code'];
echo ' not equal to ';
echo $couponCode;
?><br><?php
}
}
}
Пожалуйста, обратите внимание, что мои echos предназначены только для тестирования, просто чтобы посмотреть, работают ли сравнения в foreach.
Предполагается сравнение пользовательского ввода и неиспользуемого кода в базе данных в «if ($couponCode == $coupons_db3[‘coupon_code’])», но это просто переходит прямо к «else».
Используя этот код прямо сейчас, даже если я ввожу точный код с учетом регистра при вводе, он просто проходит через «else» «не равно» вместо «равно».
В этом примере я попытался ввести «MWCGB083», но он по-прежнему говорит «не равно», даже если пользовательский ввод и неиспользуемый код в базе данных абсолютно одинаковы.
Хотелось бы получить некоторую помощь в том, что неправильно или отсутствует в моем коде сравнения. Я четко объяснил, в чем проблема, спасибо всем, кто может помочь.
Комментарии:
1.Проверили ли вы наличие конечных или передних пробелов либо во входных данных, либо в базе данных. Убедитесь, что при вставке в базу данных вы
trim
php.net/manual/en/function.trim.php результат. Затем, когда вы берете введенный пользователем код, вы$couponCode = trim($_POST['lux_code']);
2. Возможно, попробуйте использовать === вместо == для сравнения
3. оба === и trim не изменяют выходные данные, все по-прежнему отображаются как неравные.
4. Чтобы добавить к комментарию @JasonBrumwell, вам нужно использовать
trim($coupons_db3['coupon_code'])
на всякий случай, если у вас в базе данных есть пробелы в конце. Вы также могли бы изменитьecho $couponCode;
наecho "'{$couponCode}'";
. Это покажет, есть ли у вас пробелы в конце базы данных.5. Иногда случается, что есть «скрытые символы», которые вы не можете видеть, но они есть. Возможно, попробуйте также экранировать ваши строки, чтобы вы могли проверить, что внутри них нет ничего странного.
Ответ №1:
Странная идея, но вы пробовали поместить свою логику в сам запрос?
Выборка всех существующих промо-кодов может привести к снижению производительности и / или даже проблемам с уязвимостями.
(Непроверенный, пожалуйста, дайте мне знать о любых синтаксических ошибках и т.д.)
public function VerifyPromoCode($db,$code) {
$stmt = $db->prepare(
" SELECT *
FROM `promocode_3`
WHERE code = ?
AND used = 0
");
$stmt->execute([$code]);
if ($stmt->rowCount() >= 1) {
//Promo code valid!
return true;
} else {
//Promo code NOT valid
return false;
}
}
Комментарии:
1. Я бы использовал
LIKE %value%
для contains, если это не сработает.
Ответ №2:
Я бы попробовал использовать trim
для них. Возможно, у вас есть какой-то «дополнительный» материал в одном из них, например, нулевой байт
Вы можете увидеть это с помощью приведенного ниже кода.
$foo = "foo"; //<-- add a null byte
echo $foo." is ";;
var_dump('foo' == $foo);
var_dump('foo' == trim($foo));
Вывод (в режиме raw, а не текстовое поле в изолированной среде):
foo is bool(false) bool(true)
Обратите внимание, что в выходных данных не отображается нулевой байт, и при их сравнении это не одно и то же, поэтому здесь это явно false, но если мы его урежем, то это то же самое и будет true.
Вы также можете попробовать ядерный вариант:
$foo = preg_replace('/[*[:print:]]/', '', $foo);
Что это делает, так это удаляет все непечатаемые символы. Вы также можете использовать var_export
который предназначен для печати синтаксически правильных значений (когда это возможно) для PHP, чтобы вы могли вставлять их в код и т.д.. Я бы хотел, чтобы больше людей здесь использовали это, я даже написал для этого конвертер.
В любом случае:
var_export($foo);
Вывод
'foo' . "" . ''
Я не уверен, почему это просто не выполняется "foo"
но что бы то ни было, я уверен, что с точки зрения синтаксиса это сработало бы. Но суть в том, что вы видите, как это теперь видно для вывода отладки. К сожалению, вы не вставили фактический текст, иногда даже это может удалить их, в зависимости от того, как это обрабатывается.
Не уверен, что причина в этом, но, как я показал выше, это возможно. Логика в программировании просто так не разрушается.
Надеюсь, это поможет!