我正在尝试删除带有外键的列。我坐在这上面已经知道了一段时间了,感觉就像我正在监督某些事情,并且遮篷必须很明显,但我只是不明白。 我从loggs中得到的错误是:
PHP致命错误:无法声明类User,因为名称为 已经在使用的user_id是来自的标识符的外键 班级用户。
我使用的数据库是InnoDB。我已经尝试过了:
$drop = 'ALTER TABLE `Group` DROP FOREIGN KEY `user_id`';
$stmt = $conn->prepare($drop);
$stmt->execute();
但这没什么作用,loggs中没有错误。
我很抱歉,这很明显,我是学生,这是我第三周。 ¯_(ツ)_ /¯
<?php
require 'connect.php';
require 'model.php';
$identifier = null;
if(!empty($_GET['identifier'])) {
$identifier = $_REQUEST['identifier'];
}
if(!empty($_POST)) {
require 'connect.php';
require 'model.php';
$identifier = $_REQUEST['identifier'];
settype($identifier, 'integer');
$group = Group::retrieve($conn, $_GET['identifier']);
Group::delete($conn, $group);
header('Location: view.php');
} else {
echo 'Its not working';
}
?>
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<link href='bootstrap/bootstrap/css/bootstrap.min.css' rel='stylesheet'>
<script src='bootstrap/bootstrap/js/bootstrap.min.js'></script>
</head>
<body>
<div class='container'>
<div class='span10 offset1'>
<div class='row'>
<h3>Delete</h3>
</div>
<form class='form-horizontal' action='delete.php?identifier=<?php echo $identifier?>' method='post'>
<input type='hidden' name='identifier' value='<?php echo $identifier;?>'/>
<p class='alert alert-error'>DO YOU REALLY WANT TO Delete?</p>
<div class='form-actions'>
<button type='submit' class='btn btn-danger'>EXTERMINATE</button>
<a class='btn' href='view.php'>No</a>
</div>
</form>
</div>
</div>
</body>
</html>
我的模型中班级组的相关部分如下:
public static function retrieve($conn, $identifier) {
$query = 'SELECT * FROM `Group` WHERE `identifier` = :identifier';
$stmt = $conn->prepare($query);
$stmt->bindParam(':identifier', $identifier, PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
return new Group((int)$result['identifier'], $result['admin'],
$result['superuser'], $result['testaccount'], (int)$result['user_id']);
}
public static function delete($conn, Group $group) {
$query = 'DELETE FROM `Group` WHERE identifier = :identifier, admin = :admin,
superuser = :superuser, testaccount = :testaccount, user_id = :user_id';
$stmt = $conn->prepare($query);
$stmt->bindValue(':identifier', $group->getIdentifier(), PDO::PARAM_INT);
$stmt->bindValue(':admin', $group->getAdmin(), PDO::PARAM_STR);
$stmt->bindValue(':superuser', $group->getSuperuser(), PDO::PARAM_STR);
$stmt->bindValue(':testaccount', $group->getTestaccount(), PDO::PARAM_STR);
$stmt->bindValue(':user_id', $group->getUser_id(), PDO::PARAM_INT);
$stmt->execute();
return TRUE;
}
答案 0 :(得分:0)
如果您的查询在MySql控制台中失败,请选中此选项。如果失败,则表示约束名称可能不正确。如果是这种情况,请尝试以下代码。 必须使用外来键约束名而不是列名来删除外键。
要获取约束名称,您可以使用
SHOW CREATE TABLE Group
ALTER TABLE `Group` DROP FOREIGN KEY `your_constraint_name_here`
更多信息可以在
找到答案 1 :(得分:0)
感谢您的帮助。我在删除外键的代码中出现错误,它可以这样工作:
$drop = 'ALTER TABLE `Group` DROP FOREIGN KEY `Group_ibfk_1`';
$stmt = $conn->prepare($drop);
$stmt->execute();
此外,在delete函数中,它还必须是AND而不是逗号,例如:
$query = 'DELETE FROM `Group` WHERE identifier = :identifier AND admin = :admin AND
superuser = :superuser AND testaccount = :testaccount AND user_id = :user_id';
无论如何,这被认为是好的做法吗?还有另一种方法来处理带有外键的删除列,然后暂时删除键吗?