我在PHP& Mysql项目。
简单地说,我有两个表项目和项目功能,
每个项目都有特定的功能。
CREATE TABLE projects (
ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
name varchar(255) NOT NULL
);
CREATE TABLE projects_features (
projectId INT NOT NULL,
name varchar(255) NOT NULL,
value varchar(255) NOT NULL,
weight INT NOT NULL
);
INSERT INTO projects VALUES (NULL,'project1');
INSERT INTO projects VALUES (NULL,'project2');
INSERT INTO projects_features VALUES (1,'Feature1','Feature1 Value',1);
INSERT INTO projects_features VALUES (2,'Feature2','Feature2 Value',2);
INSERT INTO projects_features VALUES (1,'Feature3','Feature3 Value',3);
INSERT INTO projects_features VALUES (2,'Feature4','Feature4 Value',4);
INSERT INTO projects_features VALUES (1,'Feature5','Feature5 Value',5);
我通过以下方式获取项目功能:
SELECT * FROM projects_features WHERE projectId = 1 ORDER BY weight ASC;
所以体重越大,体重越低。
现在, 在“我的视图”中,我向上移动并向下移动按钮,因此我可以重新排序项目功能。
我可以先选择当前项目的重量,然后选择上面的项目重量,
然后键入两个更新查询以交换两行之间的权重,
但这不是一种专业的方式,我不喜欢使用四种查询。
我需要在一个查询中执行此操作而不是四个查询。
有人可以帮忙吗?
答案 0 :(得分:0)
这是我如何解决这个问题,假设我已经理解了这个问题。
首先,我要向featureId
添加projects_features
列,并使(projectId, featureId)
成为复合主键。这对我的解决方案来说实际上并非必要;它只是使其余部分更容易。对于下一部分,您需要能够在projects_features
中引用单个记录。
接下来,我在PHP中使用Move
按钮填充数组,例如
$update_list = array();
$update_list[i] = array(':project_id' => $proj_id,
':feature_id' => $feat_id,
':new_weight' => $weight);
最后,我通过封装UPDATE
语句的PHP函数进行更新,如下所示:
function updateWeights($update_array, $dbh)
{
$sql = 'UPDATE project_features
SET weight = :new_weight
WHERE projectId = :project_id
AND featureId = :feature_id'
$stmt = $dbh->prepare($sql);
foreach ($update_array as $update_item)
{
$stmt->execute($update_item);
}
}
注意我在这里使用PDO;它也可以用mysqli完成,虽然mysqli不支持命名绑定参数,所以语法会略有不同,比如
function updateWeights($update_array, $dbh)
{
$sql = 'UPDATE project_features
SET weight = ?
WHERE projectId = ?
AND featureId = ?'
$stmt = $dbh->prepare($sql);
foreach ($update_array as $update_item)
{
$stmt->bind_param('i', $update_item[':new_weight']);
$stmt->bind_param('i', $update_item[':project_id']);
$stmt->bind_param('i', $update_item[':feature_id']);
$stmt->execute();
}
}
另请注意,我实际上并没有运行此代码,因此不能表示它没有语法或其他错误。
我希望有所帮助。