gpt4 book ai didi

php - 引发 SQLSTATE[23000] : Integrity constraint violation: 1062 Duplicate because of unique constraint 的唯一约束

转载 作者:行者123 更新时间:2023-11-29 11:16:45 24 4
gpt4 key购买 nike

在我的 mysql 数据库中,我将“电子邮件”字段设置为唯一约束。我不希望两个或更多用户拥有相同的电子邮件地址。我创建了这个函数来检查这一点。我只希望当不同的用户尝试使用相同的地址时运行该函数。这是函数:

    <?php

function Email_gogo() {

if(!empty($_POST['email']))
{

$mysql_hostname = '*****';
$mysql_username = '*****';
$mysql_password = '*****';
$mysql_dbname = '*****';

try {
$db= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", `enter code here`$mysql_username, $mysql_password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
exit( $e->getMessage() );
}
$query_email = "
SELECT
email
from users
where
email = :email
";

$query_goes = array(

':email' => $_POST['email']

);

Try{
$stmt = $db->prepare($query_email);
$stmt ->execute($query_goes);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){

}
}
catch(PDOException $ex){
echo 'ERROR: '. $ex->getMessage();
}
if($stmt->rowCount() > 0){

echo("That Email is already in use...");
}


}

}

?>

此函数在脚本中调用,允许管理员检查用户名、电子邮件和姓氏。用户名无法更改。这是我更新的脚本。这是脚本:

<?php


require("common.php");
require_once("gogo.php");

if(empty($_SESSION['user']))
{

header("Location: ../hound/login.php");


die("Redirecting to ../hound/login.php");
}

if(!empty($_POST))
{

if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
{

die("Please enter a valid email address...");
}

}
Email_gogo();

$array_value = array(
':email' => $_POST['email'],
':first_name' => $_POST['first_name'],
':last_name' => $_POST['last_name'],
':id' => $_POST['id']
);



$query = "UPDATE users
SET
email = :email,
first_name = :first_name,
last_name = :last_name

WHERE
id = :id
";


try
{

$stmt = $db->prepare($query);
$result = $stmt->execute($array_value);
}
catch(PDOException $ex)
{

die("Ouch, failed to run query: " . $ex->getMessage());
}



header("Location: users.php");


die("Redirecting to users.php");

?>

这是错误:该电子邮件已在使用中(来自该功能)。它确实检查电子邮件是否正在使用,但会引发另一个错误:

Ouch, failed to run query: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ 'marx@fun.org' pour la clef 'email'

(此错误来自脚本)。

我在脚本中间调用了该函数。我的问题是我应该使用该函数,并且仅在用户尝试使用相同地址时才运行它。先感谢您。

最佳答案

问题是你的函数实际上并没有返回任何东西,它只是显示一条错误消息,之后 PHP 将继续正常执行。因此,无论电子邮件是否正在使用,您的“更新”查询都会被执行。这是您应该在 Email_gogo 中执行的操作

function Email_gogo() 
{
if(!empty($_POST['email']))
{
$mysql_hostname = '*****';
$mysql_username = '*****';
$mysql_password = '*****';
$mysql_dbname = '*****';

try
{
$db= new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", `enter code here`$mysql_username, $mysql_password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (PDOException $e)
{
exit( $e->getMessage() );
}

$query_email = "
SELECT
email
from users
where
email = :email
";

$query_goes = array(

':email' => $_POST['email']

);

try
{
$stmt = $db->prepare($query_email);
$stmt ->execute($query_goes);
}
catch(PDOException $ex)
{
echo 'ERROR: '. $ex->getMessage();
}

if($stmt->rowCount() > 0)
return false;
else
return true;
}
}

然后当你稍后调用它时:

if(Email_gogo())
{
$array_value = array(
':email' => $_POST['email'],
':first_name' => $_POST['first_name'],
':last_name' => $_POST['last_name'],
':id' => $_POST['id']
);



$query = "UPDATE users
SET
email = :email,
first_name = :first_name,
last_name = :last_name

WHERE
id = :id
";


try
{

$stmt = $db->prepare($query);
$result = $stmt->execute($array_value);
}
catch(PDOException $ex)
{

die("Ouch, failed to run query: " . $ex->getMessage());
}



header("Location: users.php");


die("Redirecting to users.php");
}
else
die("Email address already in use");

此外,函数中的“while”循环是完全没有必要的。您只需将其删除即可。 rowCount() 方法不需要循环遍历每条记录来了​​解有多少条记录。

编辑:添加完整代码以提高清晰度。

关于php - 引发 SQLSTATE[23000] : Integrity constraint violation: 1062 Duplicate because of unique constraint 的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39600280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com