Kan tillägga att jag kör med
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
så jag borde ju se ifall det blev något fel i SQLen.
5 svar · 1 334 visningar · startad av prplxr
Ska skifta två poster i en tabell som har ett fält som heter "ordning" vilket jag använder för att sortera posterna. Har verkligen kört fast. Inga felmeddelanden, ingenting, det bara händer inget. Har testat SQL-koden för sig i phpMyAdmin och då fungerar det galant.
Kan någon se vad jag gör för fel? Ledsen för rörig kod.
<?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++;
};
$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();
?>
Kan tillägga att jag kör med
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
så jag borde ju se ifall det blev något fel i SQLen.
Innehåller dina variabler de värden du förväntar dig?
Kan det möjligtvis vara så att dina två queries ändrar på samma rad, så att du ändrar tillbaka värdet på ordning till det ursprungliga värdet när query nummer 2 körs?
Jag provkörde en förenklad variant av din första query (jag tog bort foralder-kolumnen), och det fungerade för mig. Jag ser inte några direkta fel i koden.
Det är det här som får mig att slita mitt hår! Det känns ju inte som att det ÄR något fel på koden!
Jag har själv kollat av vad variablerna innehåller och kört mina queries en och en, i samma ordning, i phpMyAdmin. Guess what? Det fungerar utmärkt då!
Anledningen till att jag kör mina queries just i den ordningen som jag gör, är att jag då kör den relativa posten först (identifierad med foralder- och ordningfälten (friar upp platsen den absoluta posten ska ha)) och sedan den absoluta (identifierad med id), är ju för att undvika att den relativa "tappar länken" till den absoluta.
Har du alltså lagt det på nätet, och då fungerar det inte? Kan det möjligen vara så att servern inte har stöd för PHP? Om du har det på din internetleverantörs server kan det i alla fall vara så.
Du skrev inte riktigt tydligt hur du har gjort, bara att koden fungerar när du kör det på ett sätt, men inte på ett annat.
Har du alltså lagt det på nätet, och då fungerar det inte? Kan det möjligen vara så att servern inte har stöd för PHP? Om du har det på din internetleverantörs server kan det i alla fall vara så.
Du skrev inte riktigt tydligt hur du har gjort, bara att koden fungerar när du kör det på ett sätt, men inte på ett annat.
Jag garanterar dig att PHP är installerat och att min ISP definitivt inte har något med saken att göra. :)
Jag hade bara tänkt lite fel. Blir ju så ibland när man är trött. Tog och döpte om alla variabler och lade till kommentarer, rad för rad. Då insåg var jag gjort fel. Allt fungerar som jag tänkt nu.
<?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();
?>
Men jo, jag skrev visst hur jag gjort. ;-)
Jag testade mina queries i phpMyAdmin och där fungerade de. Jag hade bara blandat ihop två variabler. En av många goda anledningar att kommentera sin kod och välja variabelnamn omsorgsfullt.