gpt4 book ai didi

PHP MySQL在唯一索引上创建重复记录奇怪失败

转载 作者:行者123 更新时间:2023-11-29 04:55:09 31 4
gpt4 key购买 nike

操作:创建在唯一键上重复的表记录。

唯一键有效,因为没有创建重复记录。

不好:我在 PHP 中使用的 mysqli 函数并没有像我预期的那样失败。

Meta: 我有一些 PHP(运行 5.3.6)处理从 AJAX POST 请求在 Mysql (5.5.9) 表中创建新记录。身份验证和输入清理和验证是在我共享的代码范围之外处理的。 respond 函数还处理以有效格式打印出响应。我要插入的表有一个自动递增的 ID 列和一个唯一的名称列。

// connect to server
$mysqli = new mysqli("localhost", "dbuser", 'dbpassword', "database");
if(mysqli_connect_errno()) {
$response["message"] = "unable to connect to the MySQL server at 'localhost' as 'dbuser' using a password or select the database 'database' because ".mysqli_connect_errno();
respond($response);
}

// build and run query
if ($stmt = $mysqli -> prepare("INSERT INTO `database`.`table` (`id`, `name`) VALUES (NULL, ?);")) {
$stmt -> bind_param("s", $inputs["name"]);
$success = $stmt -> execute();
if ($success) {
$response["status"] = "success";
$response["id"] = $mysqli -> insert_id;
respond($response);
} else {
$response["message"] = "failed to insert because ".$stmt -> error;
}

$stmt -> close();
} else {
$response["message"] = "unable to build query because ".$mysqli -> error;
respond($response);
}

$mysqli -> close();

这在插入新的唯一名称时按预期工作,但在尝试插入新的重复名称时不返回任何内容。我期待着

$stmt -> execute();

失败,所以我会返回一个解释错误的响应。此代码不执行此操作。我发现返回创建因重复而失败的唯一方法是在关闭语句之前添加 2 行代码,如下所示:

// connect to server
$mysqli = new mysqli("localhost", "dbuser", 'dbpassword', "database");
if(mysqli_connect_errno()) {
$response["message"] = "unable to connect to the MySQL server at 'localhost' as 'dbuser' using a password or select the database 'database' because ".mysqli_connect_errno();
respond($response);
}

// build and run query
if ($stmt = $mysqli -> prepare("INSERT INTO `database`.`table` (`id`, `name`) VALUES (NULL, ?);")) {
$stmt -> bind_param("s", $inputs["name"]);
$success = $stmt -> execute();
if ($success) {
$response["status"] = "success";
$response["id"] = $mysqli -> insert_id;
respond($response);
} else {
$response["message"] = "failed to insert because ".$stmt -> error;
}

$stmt -> close();
} else {
$response["message"] = "unable to build query because ".$mysqli -> error;
respond($response);
}

$response["message"] = "Duplicate";
respond($response);

$mysqli -> close();

我不明白的是,当查询按预期运行时,没有返回重复的响应。当查询因为它试图在唯一键上插入重复项而失败时,这将返回重复的响应。

问题:为什么插入成功后没有运行代码块末尾的响应函数?

问题:为什么由于尝试在唯一键上插入重复项而导致插入失败没有像我预期的那样抛出异常或失败?

我也试过将整个东西包装在一个 try catch block 中,但它没有任何帮助,因为它没有抛出任何异常。如果您能对此事有所了解,我将不胜感激。

最佳答案

问题:为什么插入成功后没有运行代码块末尾的响应函数?

我假设您的 respond 方法在某个停止执行的地方有一个 exitdie

问题:为什么由于尝试在唯一键上插入重复项而导致的插入失败没有像我预期的那样抛出异常或失败?

我认为这与您的 if 语句中的逻辑有关。

如果您的过程进入 else 语句

$response["message"] = "failed to insert because ".$stmt -> error;

从未发送任何响应(永远不会调用respond 函数)。您的第二个示例起作用的原因是因为代码每次都到达该点(因为它在最后一个 else 语句之外。如果您在上面的行之后移动对 respond 的调用可能会发现它按预期返回消息。完整代码可能如下所示:

// connect to server
$mysqli = new mysqli("localhost", "dbuser", 'dbpassword', "database");
if(mysqli_connect_errno()) {
$response["message"] = "unable to connect to the MySQL server at 'localhost' as 'dbuser' using a password or select the database 'database' because ".mysqli_connect_errno();
respond($response);
}

// build and run query
if ($stmt = $mysqli -> prepare("INSERT INTO `database`.`table` (`id`, `name`) VALUES (NULL, ?);")) {
$stmt -> bind_param("s", $inputs["name"]);
$success = $stmt -> execute();
if ($success) {
$response["status"] = "success";
$response["id"] = $mysqli -> insert_id;
respond($response);
} else {
$response["message"] = "failed to insert because ".$stmt -> error;
respond($response); // <-- this is the bit you need
}

$stmt -> close();
} else {
$response["message"] = "unable to build query because ".$mysqli -> error;
respond($response);
}

$mysqli -> close();

关于PHP MySQL在唯一索引上创建重复记录奇怪失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7263877/

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