Я видел пару вариантов этого, но в основном они меняют всю строку, а не только одно значение в этой строке, а не динамически.PHP MySql Значение Swap в две строки
Вот вопрос:
У меня есть три строки, каждая со следующими клетками (идентификатор, название, содержание, display_order, видно). id is auto_increment. заголовок и содержимое вводятся вручную, а видимый - это переключатель. display_order устанавливается, когда каждая строка создается и автоматически устанавливается как самое высокое целое число и устанавливается в нижней части стека.
Я установил его так, чтобы, если какая-либо из этих записей была удалена вручную, я могу автоматически изменить порядок стека (если есть 4 записи, и я удаляю # 2, новый порядок сбрасывается как 1,2, 3, а не 1,3,4).
В каждой строке есть набор кнопок со стрелками вверх и вниз, вызывающих move.php с запросами id (id), display_order (pos) и direction (dir).
В move.php он использует условное выражение для определения того, следует ли перемещать запись UP или DOWN в зависимости от того, какая переменная направления задана.
Что PHP кода мне нужно написать взять эти три переменные (идентификатор, позы, реж) и поменять места значения в ячейках таблицы display_order: Вот визуальное представление
Начальное:
id title pos
-----------------
1 slide1 1
2 slide2 2
3 slide3 3
После нажатия на кнопку UP для записи ID # 3:
id title pos
-----------------
1 slide1 1
2 slide2 3
3 slide3 2
УМ ВАС ID и POS не всегда будет таким же числом
ИСПОЛЬЗОВАНИЕ предложения davidethell, я создал это:
Вот что я создал, но все, что я получаю это эхо $ newPos скорее, что собирается вернуться к admin.php:
require ("connection.php");
$id = $_GET['id'];
$pos = $_GET['pos'];
$dir = $_GET['dir'];
if ($dir == 'up') {
$newPos = $pos-1;
} else {
$newPos = $pos+1;
}
$fromRow = "SELECT * FROM pages WHERE display_order = ".$pos."";
$toRow = "SELECT * FROM pages WHERE display_order = ".$newPos."";
$reord = mysqli_query($conn, "UPDATE pages SET display_order = " . $toRow['display_order'] . " WHERE id = " . $fromRow['id']."; UPDATE pages SET display_order = " . $fromRow['display_order'] . " WHERE id = " . $toRow['id']);
if ($reord){
header("Location: admin.php");
}else{
echo $newPos;
}
проблема я бегу в том, что это только отголоски в $ newPos
Обновлено КОД:
require ("connection.php");
$fromArray = array();
$toArray = array();
$id = $_GET['id'];
$pos = $_GET['pos'];
$dir = $_GET['dir'];
if ($dir == 'up') {
$newPos = $pos-1;
} else {
$newPos = $pos+1;
}
$fromRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$pos."");
$toRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$newPos."");
$reord = mysqli_query($conn, "UPDATE pages SET display_order = " . $toRow['display_order'] . " WHERE id = " . $fromRow['id']);
$reord = mysqli_query($conn, "UPDATE pages SET display_order = " . $fromRow['display_order'] . " WHERE id = " . $toRow['id']);
if ($reord){
header("Location: admin.php");
}else{
echo $newPos;
}
Результат: Echos в $ newPos вместо возвращения к admin.php
- это идентификатор, или данное положение задано? мой ответ предполагает, что это идентификатор, если это позиция, которую вы можете просто использовать 'UPDATE-страницы SET display_order = CASE WHEN display_order = $ pos THEN $ newPos ELSE $ pos END WHERE display_order IN ($ pos, $ newPos)', но лучше используйте mysqli, и также лучше проверить, находимся ли мы в начале или в конце таблицы. – fthiella
@fthiella - кнопки вверх и вниз - это привязки с hrefs для move.php? id = XXX & posXXX & dirXXX. move.php - это страница с этим скриптом. id - это идентификатор строки в таблице базы данных. pos - это переменная, назначенная для display_order таблицы строк таблицы, и если вы нажали стрелку UP или DOWN. Таким образом, вы нажали кнопку UP во второй строке с идентификатором 54, будет move.php? Id = 54 & pos = 2 & dir = up. Все трое записаны в командах $ _GET в начале скрипта. – Murphy1976
Я думаю, вам не нужно получать и id и pos, вам просто нужен один из них (учитывая идентификатор, который вы можете вычислить pos, и наоборот), в моем последнем коде я предполагаю, что только pos задан, потому что это немного проще – fthiella