Te mando una preliminar que puedes adaptar a tu proyecto. Se trata de leer la tabla origen, guardar los datos, insertar el elemento nuevo, borrar la tabla y reinsertar los elementos ordenador.
<<<<<<<<<<<<<<<<<<< TRABAJA SOBRE UNA TABLA DE PRUEBAS ANTES DE PONERLO EN PRODUCCION <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Modifica a gusto, espero que te sirva:
Código PHP:
<?php
/**
* CREAR LA TABLA DE PRUEBAS
* CREATE TABLE `temp` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`descripcion` VARCHAR(8) DEFAULT NULL,
`dependencia` CHAR(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
INSERT INTO `temp`(`id`,`descripcion`,`dependencia`) VALUES (1,'A','0'),(2,'B','1'),(3,'C','1'),(4,'D','1'),(5,'E','2'),(6,'F','1'),(7,'G','2'),(8,'H','1'),(9,'I','2');
*/
error_reporting(E_ALL);
ini_set("display_errors", 1);
mysql_connect("localhost","USER","PASS");
mysql_select_db("bd217754");
/**
* Inserta un elemento en la posición $xElement y reordena la tabla
*
* @param int $xElement
* @return array
* @author barcoavenus.blog.com
*/
function reOrder($xElement, $xData){
$xResponse = array();
/**
* Selecciono todos los elementos de la tabla ordenador por el campo orden
*/
$sql = "SELECT * FROM temp ORDER BY id;";
if(!$query = mysql_query($sql)) $xResponse = array("Error en la select: ".mysql_error());
/**
* Agrego el elemento nuevo en la posición correcta
*/
foreach ($xData as $key => $value)
$xResponse[$xElement][$key] = $value;
while($fetch = mysql_fetch_assoc($query)){
if($fetch['id'] == $xElement) //Si estamos en el orden que nos interesa
{
//Insertamos en el elemento actual en la siguiente posición, es decir, desplazado hacia abajo
foreach ($fetch as $key => $value)
$xResponse[$fetch['id']+1][$key] = ($key=='id'?$fetch['id']+1:$value);
}
else { //de lo contrario lo dejamos como estaba
foreach ($fetch as $key => $value)
$xResponse[$fetch['id']][$key] = ($key=='id'?$fetch['id']:$value);
}
}
/**
* Ahora $xResponse contiene todos los elementos de la tabla y además en la posición $xElement el elemento indicado
*/
mysql_free_result($query);
asort($xResponse);
/**
* Borramos la tabla y la regeneramos, utilizo transacciones para evitar perdida de datos
*/
mysql_query("BEGIN;");
if(!mysql_query("TRUNCATE TABLE temp;")) {echo "Imposible limpiar tabla!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
$xInsert = "";
//Generar la sentencia insert
foreach ($xResponse as $xInfo){
$xSql = "INSERT INTO temp (";
foreach ($xInfo as $key => $value)
$xSql .= "".$key.",";
$xSql = substr($xSql, 0, -1); //Quito la coma final
$xSql.= ") VALUES (";
foreach ($xInfo as $key => $value)
$xSql .= "'".$value."',";
$xSql = substr($xSql, 0, -1); //Quito la coma final
$xSql.= ");";
$xInsert .= $xSql;
if(!$insert = mysql_query($xSql)) {echo mysql_errno().": Imposible insertar filas!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
}
if(!mysql_query("COMMIT;")) {echo mysql_errno().": Imposible hacer commit!: ".mysql_error(); mysql_query("ROLLBACK;"); return false;};
return true;
}
/**
* tabla antes:
* id descripcion dependencia
------ ----------- -----------
1 A 0
2 B 1
3 C 1
4 D 1
5 E 2
6 F 1
7 G 2
8 H 1
9 I 2
*/
$xData = array(
'id' => '7',
'descripcion' => 'X',
'dependencia' => '2');
if(!reOrder(7, $xData)) die("<h1>No he podido reordenar la tabla!</h1>");
die("<h1>Tabla reordenada!</h1>");
/**
* Tabla después
* id descripcion dependencia
------ ----------- -----------
1 A 0
2 B 1
3 C 1
4 D 1
5 E 2
6 F 1
7 X 2
8 H 1
9 I 2
*/
?>