ORDER by sort DESC не работи

noxious

Registered
Здравейте и за много години!

Използвам jQuery UI Sortable, но новините в home page-a са ми сортиране ORDER by `sort` DESC, така че и последната добавена да излиза първа. Но в админ панела с този код по-долу последната добавена излиза последна поради ORDER by `sort` ASC. Проблемът е, че когато го направя DESC, кода не работи както искам. Размествам ги, но те се връщат на предходните позиции, но след няколко размествания се разместват и така. Трябва ми последната да излиза първа в админ панела, а не обратното, защото мисля да правя "Load more data" и с това сортиране ASC, няма да се получат нещата там, защото последната новина ще бъде някъде долу. Как може да се справя с това? Благодаря предварително!

PHP:
<?php
$sql = "SELECT * FROM `news` ORDER BY `sort` ASC";
$stmt = $dbh->prepare($sql);
$stmt->execute();

$result = $stmt->fetchAll();
?>
<style>
	#sortContent1 { margin-bottom: -8px; width: 100% }
	#sortContent1 li { list-style: none; margin: 0 0 4px 0; padding: 10px; background-color: #e95420; border-color: #e95420; border-radius: 6px; color: #fff; cursor: move }
	#sortContent1 li a { color: #fff }
</style>
<div class="container">
	<div class="row">
		<div class="col-xs-12 col-sm-12">
			<div class="panel panel-primary">
				<div class="panel-heading">
					<h3 class="panel-title">Новини</h3>
				</div>
				<div class="panel-body">
					<input type="hidden" id="path" value="" />
					<div id="sortContent1">
						<ul>
							<?php
							if ($result && count($result) > 0) {
								foreach ($result as $row_news) {
								?>
								<li id="recordsArray_<?php echo $row_news['id']; ?>">
									<?php echo $row_news['title']; ?>
									<a href="news.php?edit-news=<?php echo $row_news['id']; ?>"><span class="glyphicon glyphicon-edit"></span></a>
									<a href="news.php?delete-news=<?php echo $row_news['id']; ?>"><span class="glyphicon glyphicon-remove"></span></a>
								</li>
								<?php
								}
								?>
							<?php
							}
							?>
						</ul>
					</div>
				</div>
			</div>
		</div>
	</div>
</div>

PHP:
<?php 
include "../../config.php";

$action = $_POST['action']; 
$updateRecordsArray = $_POST['recordsArray'];

if ($action == "updateDbSortRecord") {
	$listingCounter = 1;
	foreach ($updateRecordsArray as $recordIDValue) {
		$sql = "UPDATE `news` SET sort = :listingCounter WHERE id = :recordIDValue";
		$stmt = $dbh->prepare($sql);
		$stmt->bindParam(':listingCounter', $listingCounter, PDO::PARAM_INT);
		$stmt->bindParam(':recordIDValue', $recordIDValue, PDO::PARAM_INT);
		$stmt->execute();
		
		$listingCounter = $listingCounter + 1; 
	}
}
?>

[js]<script src="../js/jquery-ui.min.js"></script>
<script>
jQuery(document).ready(function() {
jQuery(function() {
var path = "includes/drag_and_drop_news.php";
jQuery("#sortContent1 ul").sortable({
opacity: 0.6,
cursor: 'move',
update: function() {
var order = jQuery(this).sortable("serialize") + '&action=updateDbSortRecord';
jQuery.post(path, order, function(theResponse) {
console.log(theResponse);
});
}
});
});
});
</script>[/js]
 
Според мен целия проблем ти е от там че, сортираш по някакво поле sort. Работата е че това поле в някакъв момент се ъпдейтва, някакъв брояч става едно после две, ако не мине условието не се знае какво става и така.
Код:
$action = $_POST['action']; 
$updateRecordsArray = $_POST['recordsArray'];

if ($action == "updateDbSortRecord") {
        $listingCounter = 1;
        foreach ($updateRecordsArray as $recordIDValue) {
                $sql = "UPDATE `news` SET sort = :listingCounter WHERE id = :recordIDValue";
                $stmt = $dbh->prepare($sql);
                $stmt->bindParam(':listingCounter', $listingCounter, PDO::PARAM_INT);
                $stmt->bindParam(':recordIDValue', $recordIDValue, PDO::PARAM_INT);
                $stmt->execute();
                
                $listingCounter = $listingCounter + 1; 
        }
}

Ако сортираш просто по id всичко ще ти работи както искаш.
 
Ако имаш предвид да разменям id-тата вместо това в sort полето, то е същото, само че нямам друго поле, по което да проверявам дали променя избраното (по-точно казано нямам поле за WHERE 'полето' = ...). Но все пак не става така, бях пробвал.
 
Имам предвид че за да подреждаш резултатите във възходящ или низходящ ред, не ти е нужно нито полето sort нито where клауза. С други думи този код който, съм посочил в горния коментар става излишен целия. Трябва ти само това.

Код:
$sql = "SELECT * FROM `news` ORDER BY `id` DESC";

Така си спестяваш една заявка, биндване, цикли и т.н. Всяка новина която слагаш в базата влиза с по-голям номер от предхождащата я. Това ще е вярно естествено ако си направил полето id уникално и AUTO INCREMENT както, се прави по-принцип в 99% от случаите. Вече ако искаш да подреждаш по заглавие например, тогава ще ти трябва друго поле, но това вече е съвсем различна постановка.
 
Да, но не е това проблема. Пак така става, само на ASC работи, както трябва.

С DESC не променя в базата данни по някаква причина.
Ajax изпраща правилно "recordsArray[]=2&recordsArray[]=1&action=updateDbSortRecord", но UPDATE-а има проблем може би.
 
Идеята ти е да запазваш сорт типа ли? За това ли искаш да ъпдейтнеш обърнатите ID-та ?

Ако е така, логиката ти не е много правилна. Когато вземеш полетата във възходящ ред, то $listingCounter трябва да ти вземе стойността на последния елемент.

По това, което си дал предполагам $updateRecordsArray ти държи данни, за това направи следното

PHP:
$listingCounter = sizeof($updateRecordsArray);
$i = 0;

while ($listingCounter > 0) {
         $sql = "UPDATE `news` SET sort = :listingCounter WHERE id = :recordIDValue"; 
                $stmt = $dbh->prepare($sql); 
                $stmt->bindParam(':listingCounter', $listingCounter, PDO::PARAM_INT); 
                $stmt->bindParam(':recordIDValue', $updateRecordsArray[$i], PDO::PARAM_INT); 
                $stmt->execute(); 
                
                $listingCounter--;
                $i++; 
}

Така при всяко ID, което се увеличава sort полето ще получава реверсивната стойност.
Примерно имаш 5 записа:

id - 1 sort - 5
id - 2 sort -4
id -3 sort - 3
id - 4 sort - 2
id - 5 sort -1

Смятам, че това искаш да постигнеш?


Обаче според мен, ако искаш да запазваш последния вид на сортиране, то просто записвай вида на сортиране, вместо да правиш бавни операции като тази.
Някъде другаде запазаи sortType DESC/ASC и просто при извикване вади тази стойност и сортирай според нея по ID.
 

Back
Горе