2013-04-08 2 views
1

Я видел пару вариантов этого, но в основном они меняют всю строку, а не только одно значение в этой строке, а не динамически.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

+0

- это идентификатор, или данное положение задано? мой ответ предполагает, что это идентификатор, если это позиция, которую вы можете просто использовать 'UPDATE-страницы SET display_order = CASE WHEN display_order = $ pos THEN $ newPos ELSE $ pos END WHERE display_order IN ($ pos, $ newPos)', но лучше используйте mysqli, и также лучше проверить, находимся ли мы в начале или в конце таблицы. – fthiella

+0

@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

+0

Я думаю, вам не нужно получать и id и pos, вам просто нужен один из них (учитывая идентификатор, который вы можете вычислить pos, и наоборот), в моем последнем коде я предполагаю, что только pos задан, потому что это немного проще – fthiella

ответ

3

Вы можете использовать этот запрос:

UPDATE 
    yourtable INNER JOIN (
    SELECT 
     MAX(yourtable.pos) pos_prec, 
     curr.pos pos_curr 
    FROM 
     yourtable INNER JOIN 
     (SELECT pos FROM yourtable WHERE id=3) curr 
     ON yourtable.pos<curr.pos 
    GROUP BY 
     curr.pos) cp ON yourtable.pos IN (cp.pos_prec, cp.pos_curr) 
SET 
    pos = CASE WHEN pos=cp.pos_curr 
      THEN pos_prec ELSE pos_curr END 

Это немного сложнее, но он будет менять значение позиции, где ID = 3 с значение позиции предыдущего элемента, даже если есть пробелы.

См. Скрипку here.

EDIT

Если нет пробелов, вы могли бы просто использовать для перемещения ID # 3 UP:

UPDATE 
    yourtable INNER JOIN (SELECT pos FROM yourtable WHERE id=3) curr 
    ON yourtable.pos IN (curr.pos, curr.pos-1) 
SET 
    yourtable.pos = CASE WHEN yourtable.pos=curr.pos 
         THEN curr.pos-1 ELSE curr.pos END; 

и просто использовать +1 вместо -1 двигаться вниз (как UP и DOWN могут быть объединены в один запрос, если это необходимо).

PHP код

И это с помощью PHP и MySQLi, и предполагая, что позиция Дано:

<?php 
$mysqli = new mysqli("localhost", "username", "password", "test"); 

$pos = 3; 
$dir = 'down'; 

if ($dir == 'up') { $newPos = $pos-1; } else { $newPos = $pos+1; } 

if ($stmt = $mysqli->prepare(" 
    UPDATE 
    yourtable 
    SET 
    pos = CASE WHEN yourtable.pos=? 
       THEN ? 
       ELSE ? END 
    WHERE 
    pos IN (?, ?) 
    AND (SELECT * FROM (
     SELECT COUNT(*) FROM yourtable WHERE pos IN (?,?)) s)=2;")) 
{ 

    $stmt->bind_param("iiiiiii", $pos, $newPos, $pos, $pos, $newPos, $pos, $newPos); 
    $stmt->execute(); 
    printf("%d Row affected.\n", $stmt->affected_rows); 

    $stmt->close(); 
} 
$mysqli->close(); 
?> 

(я также добавил проверку, если пытается двигаться вверх первый поз , или DOWN последний, он ничего не сделает).

+0

Благодарим вас за ответ. Хотя, я уже запускаю скрипт, который даже не отображает стрелку UP для первой записи или стрелку вниз для последней записи. Для чего нужен «iiiiiii»? – Murphy1976

+0

РАБОТЫ СОВЕРШЕННО ... Я просто заменил команду printf моей командой заголовка. – Murphy1976

+0

@ Murphy1976 thanks :) у моего запроса есть некоторые заполнители?, С bing_param я привязываю каждый параметр к его заполнителю, а строка iiiiii указывает тип каждого параметра (i = целое число), это безопаснее и может избежать sql-инъекций – fthiella

1

Предполагая, что объект $ строка с данными каждого строки, просто сделать:

if ($dir == 'up') { 
    $fromRow = $row2; 
    $toRow = $row1; 
} 
else { 
    $fromRow = $row1; 
    $toRow = $row2; 
} 
$sql = "UPDATE mytable SET pos = " . $toRow['pos'] . " WHERE id = " . $fromRow['id']; 
// now execute your SQL however you want in your framework 
$sql = "UPDATE mytable SET pos = " . $fromRow['pos'] . " WHERE id = " . $toRow['id']; 
// now execute your SQL however you want in your framework 

Положи в функции или класса какой-то, чтобы сделать его повторно.

EDIT: Основываясь на ваших изменениях, похоже, что вы не получаете достаточную информацию в своих запросах. Они должны быть:

$fromRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$pos.""); 

$toRow = mysql_query("SELECT * FROM pages WHERE display_order = ".$newPos.""); 

Вы выбрали только поле id, но затем вы пытались использовать поле display_order.

+0

Вот что я создал, но все, что я получаю, это echo $ newPos, а вернувшийся к admin.php: – Murphy1976

+0

Я не вижу никакого кода в вашем комментарии. – davidethell

+0

Я редактировал исходный вопрос, чтобы разрешить форматирование кода. – Murphy1976

0

Я не буду писать вам код PHP.Но я дам вам SQL:

Предположим, что $ delta является либо +1, если позиция слайда должна быть поднята 1 или -1, если положение слайда должно быть опущено на 1. $ id является идентификатором горка. Ow, и предположим, что таблица называется slides_table.

Вам понадобятся 2 запросы:

update slides_table set pos = pos + $delta where id = $id; 
update slides_table set pos = pos - $delta where pos = (select pos from slides_table where id=$id) and id != $id 
Смежные вопросы