【问题标题】:PHP / MySQL: How to return info if record already exists (without update)PHP / MySQL:如果记录已经存在,如何返回信息(不更新)
【发布时间】:2015-09-07 01:53:29
【问题描述】:

我正在使用以下内容将新行插入 MySQL 数据库。 对此的查询存储在 PHP 文件 (ajax.php) 中,输入值通过 jQuery 中的 Ajax 调用传递给它。

一切都按预期工作,但如果电子邮件已经在数据库中,我想向用户返回一条消息。 我知道如何使用 ON DUPLICATE KEY 更新数据库行,但 谁能告诉我如何检查这个并在它已经存在的情况下回显某些内容(即不更新它)?
(电子邮件是一个主键,所以我只需要检查这一列。)

我的 PHP:

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$dob = $_POST["dob"]; 
$sql = "INSERT INTO Users (email, dob) VALUES ('" . $email . "', '" . $dob . "')"; 
if ($conn->query($sql)){ 
    echo 'DB Update successful'; 
}else{ 
    echo 'DB Update failed'; 
} 
$conn->close();

【问题讨论】:

  • 警告:您的代码极易受到 SQL 注入攻击。您应该将用户输入值绑定到查询参数,而不是将它们直接包含在查询中。请先阅读以下内容:php.net/manual/en/security.database.sql-injection.php
  • 非常感谢。我是新手,所以我分步写这个。目前我只是在测试,但在上线之前肯定会调查一下。

标签: php mysql ajax insert duplicates


【解决方案1】:

在插入之前,您只需要一个简单的SELECT 调用。

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}
$email = $_POST["email"];
$dob = $_POST["dob"];
$sql = "SELECT email FROM Users WHERE email = " .$email;
$query = $conn->query($sql);
if (mysqli_num_rows($query) > 0){
    echo "There exists an user with this email";
}
else {
    $sql = "INSERT INTO Users (email, dob) VALUES ('" . $email . "', '" . $dob . "')";
    if ($conn->query($sql)) {
        echo 'DB Update successful';
    }
    else {
        echo 'DB Update failed';
    };
}

$conn->close();

【讨论】:

  • 只有一个问题:这里需要什么 $row ?我只看到一行提到它。
  • 其实不需要,它只是选择了那个用户。
  • 非常感谢:在 RiggsFolly 的更新之后,事实证明他的方法实际上更适合我在这里的需要,所以我接受了他的回答,但投票支持你。希望没关系,再次感谢您的帮助!
  • 在 Gordon 对上述内容发表评论后,我对此进行了更多研究,最终决定在这里坚持我最初的感受,所以最后我接受了这个答案并投票给 Riggs 一个。来回抱歉,再次感谢您的帮助!
【解决方案2】:

简单的方法是计算表中条目与您尝试存储的电子邮件相同的条目的出现次数。计数而不是选择意味着它更快,并且只返回一个计数而不是一个完整的行,您必须查看或计算结果中的行。

$conn = new mysqli($servername, $username, $password, $dbname);
$conn->set_charset("utf8");
if($conn->connect_error){
    die("Connection failed: " . $conn->connect_error);
}

$stmt = $Conn->prepare("Select Count(email) as cnt FROM Users WHERE email = ?");
$stmt->bind_param('s', $_POST["email"]);
$stmt->execute();
$stmt->bind_result($cnt)
$stmt->close();

if ( $Cnt > 0 ) {
    // its already there so do whatever you want in this case
} else {

    $sql = "INSERT INTO Users (email, dob) VALUES (?,?)"; 
    $stmt = $Conn->prepare($sql);
    $stmt->bind_param('ss', $_POST["email"],$_POST["dob"]);
    if ($stmt->execute(){ 
        echo 'DB Update successful'; 
    }else{ 
        echo 'DB Update failed'; 
    } 
}
$conn->close();

【讨论】:

  • 也谢谢你!
  • 更新:感谢您的更新。这实际上对我来说更有意义,所以我会接受这个答案。再次感谢您的帮助 - 这是您过去几天第二次帮助我! :)
  • 只是在这里补充一下:在实现这个时,我对上面的内容做了两个小改动。不确定是否有必要,但这样对我来说看起来更合乎逻辑:1)我将 $countResult 行的最后一部分更改为 ...'" . $email . "'"); 2)我在 else 之后添加了一个 { .
  • 计数会增加额外的开销(在这种情况下非常少,因为电子邮件是主键,但对于类似问题来说是个坏主意)。
  • @GordonLinoff:谢谢!那么对于一般的类似情况,您会更喜欢 Burak 的方法吗?我是新手,所以我试图从一开始就以正确的方式去做。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2010-12-29
  • 2011-08-21
  • 1970-01-01
  • 2018-02-01
  • 2014-03-04
相关资源
最近更新 更多