PHP等值字符串不匹配

时间:2019-03-15 02:34:22

标签: 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)

table

用户在此处尝试输入验证码(名称=兑换)

enter

现在这是数据库与用户输入之间进行比较的文件(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”“不等于”而不是“等于”。

code

在此示例中,我尝试输入“ MWCGB083”,但即使用户输入的信息与数据库中未使用的代码完全相同,它仍然显示“不等于”。

我想对我的比较代码中的错误或遗漏提供一些帮助。我已经清楚地说明了问题所在,谢谢能为您提供帮助的人。

2 个答案:

答案 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)

Sandbox

请注意,输出未显示空字节,并且在比较它们时,它不相同,因此这里显然是假的,但是如果我们对其进行修整,则它相同且为真。

您也可以尝试核选项:

 $foo = preg_replace('/[*[:print:]]/', '', $foo);

这是删除所有不可打印的字符。您还可以使用var_export,该命令旨在为PHP打印语法上正确的值(如果可以),因此可以将其粘贴到代码等中。我希望在此使用更多的人,我什至写了{ {3}}。

任何人:

  var_export($foo);

输出

  'foo' . "\0" . ''

我不确定为什么它不仅会"foo\0",而且无论如何,我确信语法会行得通。但关键是,您现在看到了如何在调试输出时看到它。不幸的是,您没有粘贴实际的文本,有时甚至可以将其删除,具体取决于其处理方式。

不确定这是否是原因,但是正如我上面显示的那样,这是可能的。编程中的逻辑本身并没有分解。

希望有帮助!