【问题标题】:MySQL select a column with replaced text where it equals a valueMySQL选择一个替换文本的列,它等于一个值
【发布时间】:2016-02-16 04:22:52
【问题描述】:

我最近收到提醒,无论您是否输入“。”,Gmail 电子邮件地址都是相同的。在“@gmail.com”之前。所以“myemail@gmail.com”和“my.email@gmail.com”都发送到“myemail@gmail.com”。

因此,当用户在我的网站上注册时,我想检查他们是否没有使用此漏洞利用基本相同的电子邮件地址创建多个帐户。

我清理了他们发送给我的电子邮件地址,使用 PDO 登录到我的数据库,然后尝试运行此代码:

$data=$db->query("SELECT REPLACE(email,'.','') AS email_without_periods FROM account_data HAVING email_without_periods LIKE '".str_replace($sanitizedEmail,".","")."'");

if($row=$data->fetch()){
//It found a match between the sanitized email without decimals and the email rows without decimals. Hey, this dude's trying to create multiple accounts!
    $error="You're trying the email decimal trick! You sneaky devil... ";
}

但是,这个输入不起作用:它似乎没有注册任何行。

当我将 LIKE '".str_replace($sanitizedEmail,".","")."'" 替换为 LIKE '%".str_replace($sanitizedEmail,".","")."%'" 时,它带回了所有行。

我基本上想在数据库中搜索str_replace($postEmail,".",""),但首先要删除email 行中的所有句点。我正在使用 PDO。

我该怎么做?

【问题讨论】:

  • $sanitizedEmail的值是多少?
  • 既然使用的是 PDO,为什么不使用准备好的语句而不是连接到 SQL 中?
  • 您用逗号替换所有句点,而不是删除它们。使用replace(email, ',', '') 删除它们。但是您还删除了gmail.com 中的句点,因此它将变为gmailcom
  • $sanitizedEmail 可能是myemail@gmail.com" 基本上是表单通过$_POST 获取然后进行清理的任何电子邮件地址。
  • 所以如果用户在表单中输入my.email,你会将其清理为myemail?

标签: php mysql email pdo gmail


【解决方案1】:

str_replace 中的参数顺序错误。应该是:

str_replace('.', '', $sanitizedEmail)

您使用的参数顺序与 SQL 的 REPLACE 函数相同,但它们不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多