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();

?>