【问题标题】:PHP how to check for email already in MySQL database?PHP如何检查MySQL数据库中已有的电子邮件?
【发布时间】:2012-03-07 17:27:05
【问题描述】:

您好,我在 Stackoverflow 上向所有 PHP 大神寻求帮助 :)

我创建了一个电子邮件注册表单(只有一个电子邮件字段),它能够使用 Ajax 进行验证,并从我找到的一个基本 PHP 脚本向数据库发布一封新电子邮件。

但是,我要做的下一步是在添加之前检查电子邮件是否已经在数据库中。 Stack 上有几个与此完全相同的问题,我已经尝试了所有答案,但无济于事:( 我不是 PHP 人,还不能破解它。

下面是我当前的 insert.php 文件,该文件确实有效,并且确实在数据库中添加了一个新的电子邮件字段。但是,下面的代码是我尝试用来检查现有电子邮件的最新代码,但我收到了发送数据错误。

用于添加电子邮件的工作 PHP 文件

<?php
$con = mysql_connect("localhost","root","root");
if (!$con)
{
    die('Could not connect: ' . mysql_error());
}

mysql_select_db("mydatabase", $con);

$sql="INSERT INTO newsletter (email)
    VALUES
    ('$_POST[mail]')";

    if (!mysql_query($sql,$con)) {
        die('Error: ' . mysql_error());
    }

    echo "Thanks for subscribing!"; //Text on page
    //header("Location: /thankyoupage.php"); //Redirect page

mysql_close($con)
?>

使用 PDO 更新代码 下面的代码可以添加电子邮件,但仍然允许重复...

<?php
/*** mysql hostname ***/
$hostname = 'localhost';
/*** mysql username ***/
$username = 'root';
/*** mysql password ***/
$password = 'root';
/*** email ***/
$email    = '$_POST[mail]';

try {
$dbh = new PDO("mysql:host=$hostname;dbname=mydatabase", $username, $password);

//$query = SELECT count(*) AS `total` FROM `data` WHERE `email` = '{$request}'

$query = SELECT COUNT(*) as 'count' FROM `data` WHERE email = '$_POST[mail]';
$row = mysql_fetch_assoc(mysql_query($query));

if($row['total']) {
    echo 'Sorry email already exists';
}
else {
    /*** echo a message saying we have connected & added email ***/
    echo 'Thanks for subscribing!';

    /*** INSERT data ***/
    $count = $dbh->exec("INSERT INTO newsletter(email) VALUES ('$_POST[mail]')");
}

/*** echo a message saying we have connected & added email ***/
//echo 'Thanks for subscribing!';

/*** INSERT data ***/
//$count = $dbh->exec("INSERT INTO newsletter(email) VALUES ('$_POST[mail]')");

/*** echo the number of affected rows ***/
/*echo $count;*/

/*** close the database connection ***/
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
?>

提前感谢任何有时间看这个的人:)

补充说明: 我的数据库表称为时事通讯,有 2 个字段(仅 ID - 数字)和(电子邮件)

【问题讨论】:

  • 数据库中的电子邮件列是否有唯一索引?
  • @Jim 我已经在这里尝试过答案:stackoverflow.com/questions/4378814/… 但我想我在 PHP 中的诗句不够
  • 嘿,您对 SQL 注入完全开放,如果您还没有被黑客入侵,那么您将会被黑客入侵。学习在 PDO 中使用准备好的查询并完全避免这个问题。
  • +1 表示 PDO,但查看这段代码,您可能需要花费一些时间来深入研究 PDO。注意:您也可以直接设置 mysql 表,禁用“重复”。更好、更快、更清洁。
  • @prodigitalson 我对此不确定,但我确实有一个名为 ID 的列,它只包含数字。当我从测试中删除电子邮件条目时,它确实会删除 ID。示例:我的 ID 为 1-5,那么我可以添加的任何新电子邮件都将从 45 左右开始......

标签: php mysql database


【解决方案1】:

如果电子邮件是唯一键,那很简单

<?php
mysql_connect("localhost","root","root");
mysql_select_db("howdini");
$email = mysql_real_escape_string($_POST['mail']);
$sql="INSERT IGNORE INTO newsletter (email) VALUES ('$email')";
mysql_query($sql) or trigger_error(mysql_error()." ".$sql);
if (mysql_affected_rows()) {
  header("Location: /thankyoupage.php"); //Redirect page
} else {
  //already exists
}

【讨论】:

  • 刚刚尝试了这个确切的代码,我在 IF 中输入了 echo 'thanks',在 else 中输入了 echo 'Sorry'。能够添加电子邮件,但是当我添加 d@d.com 两次时,我没有收到错误消息。
  • 刚刚更新了有效的 PDO 代码,但仍然可以添加重复项,我检查了我的表,发现 ID 是我的主键,去谷歌如何创建唯一键
  • +1 表示 PDO,但是查看这段代码,您可能需要花费一些时间来深入研究 PDO。注意:你也可以直接设置你的mysql表,禁用“重复”,使用"UNIQUE " mysql statement。更好、更快、更清洁。
  • 嘿,你的代码成功了!在我终于弄清楚如何添加唯一密钥之后:D 谢谢!现在我要看看我是否可以 PDO 你的代码。
  • 如果电子邮件服务允许用户名中包含点,那么name@server.com 等于na.me@server.com 呢??
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 2019-09-17
  • 2013-06-08
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2014-05-10
相关资源
最近更新 更多