Php PDO更新查询完全不起任何作用
所以昨天我遇到了一个我似乎无法理解的错误。下面的代码应该在一个递归表中创建两个POSTPhp PDO更新查询完全不起任何作用,php,mysql,pdo,Php,Mysql,Pdo,所以昨天我遇到了一个我似乎无法理解的错误。下面的代码应该在一个递归表中创建两个POST $cid是应该向上或向下切换位置的帖子的ID。 $pid是父ID。 $ord是post在父项下的位置。 $dir是邮件应该向哪个方向移动,向上或向下 然后,处于第一个立柱应该移动到的位置的立柱将占据第一个立柱的初始位置 <?php $cid = isset($_GET['cid']) ? $_GET['cid'] : ""; $pid = isset($_GET['pid']) ? $
$cid
是应该向上或向下切换位置的帖子的ID。
$pid
是父ID。
$ord
是post在父项下的位置。
$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("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();
?>
回显所有值并检查是否正常?如果没有任何错误,可能正在更新其他连接到哪里?@Rakesh:是的,我已经检查了所有变量。它们的值正是我所期望的。Mihai:在包含此文件的另一个文件中。像这样重复您的精确查询更新csa_categories SET ordning=$ord,其中foralder=$pid和ordning=$opos
,并使用mysql数据库软件执行。我尝试了前两个建议,但没有任何运气。第三个查询按预期返回一行
为空?它返回数组([0]=>00000[1]=>[2]=>)
因此没有问题。如果添加$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING)会怎么样在调用$dbh->prepare()
之前,先执行code>,然后输出$dbh->errorinfo()
和$ostmt->errorinfo()代码>?(这应该将PDO的错误模式从error设置为Warning)我已经有了PDO::ERRMODE_Warning
。语句和处理程序都返回相同的,数组([0]=>00000[1]=>[2]=>)
<?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();
?>