【问题标题】:PHP code for inserting non-duplicate values into MySQL用于将非重复值插入 MySQL 的 PHP 代码
【发布时间】:2016-11-21 06:01:22
【问题描述】:

我有基本的 PHP/MySQL 经验,上过入门课程。我的知识实际上仅限于以下 PHP 代码:

if(!($stmt = $mysqli->prepare...)
if(!($stmt->bind_param...)
if(!$stmt->execute...)

我目前正在尝试编写一个程序,允许用户输入新密码,并根据数据库中的现有密码检查密码。

这是我所拥有的:

<?php
foreach($Password){
    $dupesql = "SELECT PasswordID Passwords WHERE (Password = '$Password')";
    $duperaw = mysql_query($dupesql);
    if(mysql_num_rows($duperaw){
        echo nl2br("$Password has already been used \n");
    }
    else{
        echo "Password added \n";
    }
}
?>

我从这篇文章中得到了代码:Check for duplicates before inserting

我不确定代码本身是否有问题,或者我是否需要在我的 PHP 代码中添加任何其他内容才能使其正常工作,因为它目前正在产生“错误 500”。

【问题讨论】:

  • 请使用password_hash() 存储密码,从您提供的代码来看,您将密码存储为明文,您永远不应该这样做。
  • 你不会把 mysql_ 和 mysqli_ 混在一起吧?您要检查给出的 cmets/答案,还是我们应该站在这里直到您有一些活动? 500错误是服务器错误;检查您的日志。此处不接受发布和离开/离开答案。
  • 还有你的foreach($Password);真的没有多大作用。你有RTM吗? php.net/manual/en/control-structures.foreach.php我不接受。
  • 感谢所有 cmets,我没有意识到我必须坐在网上立即回复 cmets。才2个小时,又回到我的帖子回复cmets。首先,这只是一个小原型,它只是一个更大项目的一部分,所以我不存储实际密码,明文应该可以工作。其次,我不确定 RTM 是什么意思,正如我之前解释的那样,我从另一个帖子接受的答案中复制了这段代码。看完下面的答案,我确实把所有的mysql命令都改成了mysqli命令。
  • 为什么密码必须是唯一的?

标签: php mysql


【解决方案1】:

MySQL 扩展已被弃用,您可能已经从 PHP 7.0 中删除了它。将您的代码重写为 MySQLi 或 PDO。查看有关如何转换为 MySQLi 的问题:How could I change this mysql to mysqli?

此外,您的代码只是不添加密码(从不)。可能您希望在“已添加密码”消息之前添加它,但请注意:您要使用的解决方案并不理想,因为在检查密码是否存在和添加密码之间存在竞争条件的风险。这意味着可以添加两次密码。

要解决此问题,您可能需要使用事务。这个问题涵盖了更多细节:PHP + MySQL transactions examples

【讨论】:

  • 我担心你可能在这个问题上掉进了一个相当深的兔子洞,这个问题也没有多大意义,尤其是他们的foreach。请参阅我在他们的问题下留下的 cmets。
  • @Fred-ii- 嗯,是的,你可能是对的。但我会在这里保留我的答案,因为它可能对其他人有用。至少在提到竞争条件问题方面。
  • *sigh* - 是的,恐怕丹尼斯也是。哦,好吧,他们有足够的能力继续您的答案和 cmets 中给出的内容。
  • 我阅读了您提供的链接。本质上,我应该将所有涉及“sql”的代码都更改为“sqli”,对吧?
  • @AishaAshwal 您的代码包含其他问题。已经提到过 foreach 语法错误+密码实际上从未保存过。此外,错误 500 可能意味着任何问题 - 检查您的服务器日志以了解确切的问题。
【解决方案2】:

我决定走一条完全不同的路线,即将密码列设置为唯一。

然后我做了一个简单的 INSERT,如果用户尝试添加重复项会提示错误:

<?php
        if(!($stmt = $mysqli->prepare("INSERT INTO Heroes(HeroName, FirstName, LastName, Age, HomeCountry, RoleID) VALUES (?,?,?,?,?,?)"))){
            echo "Prepare failed: "  . $stmt->errno . " " . $stmt->error;
        }
        if(!($stmt->bind_param("sssisi",$_POST['HeroName'],$_POST['FirstName'],$_POST['LastName'],$_POST['Age'],$_POST['HomeCountry'],$_POST['RoleID']))){
            echo "Bind failed: "  . $stmt->errno . " " . $stmt->error;
        }
        if(!$stmt->execute()){
            echo "Execute failed: "  . $stmt->errno . " " . $stmt->error;
        } else {
            echo "Added " . $stmt->affected_rows . " row to Heroes.";
        }
?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多