正如标题所述,我正在尝试将数据库中未使用的“代码”与输入文本字段进行比较。但是,即使两者相等,它们也不匹配。我将在下面进一步解释该问题:
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)
用户在此处尝试输入验证码(名称=兑换)
现在这是数据库与用户输入之间进行比较的文件(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']) && $_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
}
}
}
请注意,我的回声仅用于测试目的,只是为了查看foreach中的比较是否有效。
应该在“ if($ couponCode == $ coupons_db3 ['coupon_code'])”中对用户输入和数据库中未使用的代码进行比较,但是直接进入“ else”。 / p>
立即使用该代码,即使我在输入中输入了精确的区分大小写的代码,它也会通过“ else”“不等于”而不是“等于”。
在此示例中,我尝试输入“ MWCGB083”,但即使用户输入的信息与数据库中未使用的代码完全相同,它仍然显示“不等于”。
我想对我的比较代码中的错误或遗漏提供一些帮助。我已经清楚地说明了问题所在,谢谢能为您提供帮助的人。
答案 0 :(得分: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 :(得分:0)
我会尝试在它们上使用trim
。您可能其中有一些“多余”的东西,例如空字节\0
您可以通过以下代码看到它。
$foo = "foo\0"; //<-- add a null byte
echo $foo." is ";;
var_dump('foo' == $foo);
var_dump('foo' == trim($foo));
输出(在原始模式下,而不是沙箱中的文本区域):
foo is bool(false) bool(true)
请注意,输出未显示空字节,并且在比较它们时,它不相同,因此这里显然是假的,但是如果我们对其进行修整,则它相同且为真。
您也可以尝试核选项:
$foo = preg_replace('/[*[:print:]]/', '', $foo);
这是删除所有不可打印的字符。您还可以使用var_export
,该命令旨在为PHP打印语法上正确的值(如果可以),因此可以将其粘贴到代码等中。我希望在此使用更多的人,我什至写了{ {3}}。
任何人:
var_export($foo);
输出
'foo' . "\0" . ''
我不确定为什么它不仅会"foo\0"
,而且无论如何,我确信语法会行得通。但关键是,您现在看到了如何在调试输出时看到它。不幸的是,您没有粘贴实际的文本,有时甚至可以将其删除,具体取决于其处理方式。
不确定这是否是原因,但是正如我上面显示的那样,这是可能的。编程中的逻辑本身并没有分解。
希望有帮助!