PDO 更新查询什么都不做
PDO update query does absolutely nothing
所以昨天我 运行 遇到了这个我似乎无法掌握的错误。下面的代码应该在递归 MariaDB table 开关位置中创建两个 post。
$cid
是应该向上或向下切换位置的 post 的 ID。
$pid
是父 ID。
$ord
是 post 在父项下的位置。
$dir
是 post 应该向上或向下移动的方向。
那么第一个post应该移动到的位置的post就是第一个post的初始位置。
<?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();
?>
这绝对没有任何作用。我没有更改 table 中的任何内容,也没有任何错误。
您尝试过使用这些方法吗?
$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();
?>
所以昨天我 运行 遇到了这个我似乎无法掌握的错误。下面的代码应该在递归 MariaDB table 开关位置中创建两个 post。
$cid
是应该向上或向下切换位置的 post 的 ID。
$pid
是父 ID。
$ord
是 post 在父项下的位置。
$dir
是 post 应该向上或向下移动的方向。
那么第一个post应该移动到的位置的post就是第一个post的初始位置。
<?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();
?>
这绝对没有任何作用。我没有更改 table 中的任何内容,也没有任何错误。
您尝试过使用这些方法吗?
$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();
?>