所以昨天我遇到了这个错误,我似乎无法掌握。下面的这段代码应该使递归MariaDB表中的两个帖子交换位置。
$cid
是应该向上或向下切换位置的帖子的 ID。 $pid
是父 ID。 $ord
是帖子在父级下方的位置。 $dir
是柱子应该向上或向下移动的方向。
然后,第一个职位应该移动到的位置上的职位将占据第一个职位的初始位置。
<?php
$cid = isset($_GET['cid']) ? $_GET['cid'] : "";
$pid = isset($_GET['pid']) ? $_GET['pid'] : "";
$ord = isset($_GET['ord']) ? $_GET['ord'] : "";
$dir = isset($_GET['dir']) ? $_GET['dir'] : "";
if($cid == "" || $pid == "" || $ord == "" || $dir == "") die('nu gick det åt pipsvängen...');
if($dir == "up") {
$opos = $ord--;
} elseif($dir == "down") {
$opos = $ord++;
} else {
die('ingen riktning');
};
$ostmt = $dbh -> prepare("UPDATE csa_categories SET ordning = :onp WHERE foralder = :pid AND ordning = :oop");
$ostmt -> bindValue(":onp", $ord);
$ostmt -> bindValue(":pid", $pid);
$ostmt -> bindValue(":oop", $opos);
$ostmt -> execute();
$cstmt = $dbh -> prepare("UPDATE csa_categories SET ordning = :cnp WHERE id = :cid");
$cstmt -> bindValue(":cnp", $opos);
$cstmt -> bindValue(":cid", $cid);
$cstmt -> execute();
?>
这绝对没有任何作用。我没有更改表格中的任何内容,也没有任何错误。
您是否尝试过使用这些方法中的任何一种?
$ostmt = $dbh -> prepare("UPDATE csa_categories SET ordning = :onp WHERE foralder = :pid AND ordning = :oop");
$ostmt -> bindParam(":onp", $ord);
$ostmt -> bindParam(":pid", $pid);
$ostmt -> bindParam(":oop", $opos);
$ostmt -> execute();
或
$ostmt = $dbh -> prepare("UPDATE csa_categories SET ordning = :onp WHERE foralder = :pid AND ordning = :oop");
$ostmt -> execute(array(':onp'=>$ord,':'pid'=>$pid,':oop'=>$opos));
此外,此语句是否产生任何输出:
$ostmt = $dbh -> prepare("SELECT ordning FROM csa_categories WHERE foralder = :pid AND ordning = :oop");
$ostmt -> bindParam(":pid", $pid);
$ostmt -> bindParam(":oop", $opos);
$ostmt -> execute();
所以今天我终于成功了!我把整件事看错了。那里的剧本没有缺陷,除了我没有评论它的事实。今天我开始评论所有内容,并为我的变量提供了更好的名称,事实证明,我一直在想错。更新查询有效,但他们更新了错误的行,因此似乎什么也没发生。
这是最终的解决方案:
<?php
$absid = isset($_GET['cid']) ? $_GET['cid'] : ""; // ID of absolute row
$parid = isset($_GET['pid']) ? $_GET['pid'] : ""; // Absolute row's parent ID
$abspos = isset($_GET['ord']) ? $_GET['ord'] : ""; // Current position of absolute row
$newrelpos = $abspos; // New position of relative row
$dir = isset($_GET['dir']) ? $_GET['dir'] : ""; // Direction to move absolute row
if($absid == "" || $parid == "" || $abspos == "" || $dir == "") die('missing variable(s)');
// Generate absolute row's new position
if($dir == "up") {
$newabspos = $abspos - 1;
} elseif($dir == "down") {
$newabspos = $abspos + 1;
} else {
die('direction not set');
};
$relpos = $newabspos; // Current position of relative row
// Fetch relative row's ID
$stmt = $dbh -> prepare("SELECT id FROM csa_categories WHERE foralder = :parid AND ordning = :pos");
$stmt -> bindValue(":parid", $parid);
$stmt -> bindValue(":pos", $relpos);
$stmt -> execute();
$row = $stmt -> fetch();
$relid = $row['id']; // Relative row's ID
// Update absolute row
$astmt = $dbh -> prepare("UPDATE csa_categories SET ordning = :newabspos WHERE id = :absid");
$astmt -> bindValue(":newabspos", $newabspos);
$astmt -> bindValue(":absid", $absid);
$astmt -> execute();
// Update relative row
$rstmt = $dbh -> prepare("UPDATE csa_categories SET ordning = :newrelpos WHERE id = :relid");
$rstmt -> bindValue(":newrelpos", $newrelpos);
$rstmt -> bindValue(":relid", $relid);
$rstmt -> execute();
?>