PDO更新查询绝对没有任何意义

时间:2015-01-27 09:12:04

标签: php mysql pdo

所以昨天我遇到了这个错误,我似乎无法解决这个错误。下面的代码段应该在递归的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();

?>

这绝对没有。我没有改变表格中的任何内容,也没有任何错误。

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用其中任何一种方法?

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

答案 1 :(得分:0)

所以今天我终于成功了!我看着整件事都错了。脚本中没有任何缺陷,除了可能是我没有评论它的事实。今天我开始评论所有内容,并给我的变量更好的名字,事实证明,我一直在想错。更新查询有效,但是他们更新了错误的行,因此似乎没有发生任何事情。

以下是最终解决方案:

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

?>