|
|
|
| Такая вот задача, что-то никак не идёт...
В базу пишутся сообщения и номер задаётся в PHP ($mes=$mes+1 - т.е. номера в итоге в базу идут так:1,2,3,4,5...). Однако пользователи могут удалять эти сообщения и из-за этого последовательная нумерация нарушается, а иногда и клинит добавление новой записи по причине, что заданный номер уже в базе есть (т.е. происходит смещение).
Как можно сделать, чтобы перед добавлением нового сообщения php-скрипт нашёл в базе первое свободное число попорядку -начиная с единицы, а потом присвоил этот номер новому записываемому сообщению?
Вот моя безуспешная попытка что-то соорудить:
<?
$result=mysql_query("select * from mes");
$nomer_mes=mysql_result($result, 0, 'nomer_mes');
$col=mysql_num_rows($result);
for ($i=1; $i < $col+1; $i ++){ //$col+1 - это если все номера попорядку есть
if($i !=$nomer_mes)
$new_nom_mes = $i;
break;
}
mysql_query ("insert into mes values ('$new_nom_mes','$mes')");
echo $new_nom_mes;
?>
|
Всё время присваивает 1 и перезатирает старое сообщение новым с этой единицей...
Нelp! | |
|
|
|
|
|
|
|
для: Владимир22
(30.07.2006 в 04:49)
| | а если мне дадут ссылку на сообщение, далее это сообщение удалится и на его место запишется новое, в итоге я приду не на то сообщение? обычно так никто не делает ибо никому не нужен порядок в порядковых номерах сообщений. | |
|
|
|
|
|
|
|
для: RV
(30.07.2006 в 05:15)
| | Это простые объявления, которые хранятся в течение короткого срока(
Мне надо именно так как я описал... | |
|
|
|
|
|
|
|
для: Владимир22
(30.07.2006 в 05:22)
| |
<?
$sql = "select id from table";
while ($result = mysql_fetch_assoc($sql))
{
$str2[] = $result;
// получаем массив $str2 = array(1, 3, 4, 5, 7); где числа это те, которое есть в базе
}
$temp_str = $str2;
$min = array_shift($temp_str);
$max = array_pop($temp_str);
$s = array();
for ($i = $min; $i <= $max;)
{
$s[] = $i;
$i++;
}
$dif = array_diff($s, $str2);
$res = array_shift($dif);
echo $res;
?>
|
| |
|
|
|
|
|
|
|
для: RV
(30.07.2006 в 06:09)
| | Немного запутано для меня... буду пробовать.. Главное, чтобы если с последовательностью всё в порядке, то присвоило число следующее за макимальноимеющимся. | |
|
|
|
|
|
|
|
для: Владимир22
(30.07.2006 в 06:32)
| | получаем из базы все порядковые номера. (допустим там числа 1 3 4 5 6 9)
берем минимальное число и максимальное которое есть среди порядковых номеров (1 9)
генерируем новый массив от минимального числа до максимального (получится 1 2 3 4 5 6 7 8 9)
сравниваем два массива
делаем новый массив с теми числами, которых нет в базе (т.е.2 7 8)
берем первое число из массива.
единственная проблема с минимальным числом в базе, если оно удалено, то первое будет самым минимальным (т.е. если идут числа в базе 3 5 6 7 8, то минимальным будет число 3 а не 1), но это легко исправить | |
|
|
|
|
|
|
|
для: RV
(30.07.2006 в 06:38)
| | допустим можно генерировать новый массив от 1 до максимального числа из базы | |
|
|
|
|
|
|
|
для: RV
(30.07.2006 в 06:41)
| | Что не хочет работать, даже эхом ничего не показывает...
А может можно как-то подправить мой вариант? НЕ могу понять в чём там у меня ошибка. | |
|
|
|
|
|
|
|
для: Владимир22
(30.07.2006 в 16:31)
| | исправьте так
for ($i = 1; $i <= $max +1;)
включите ошибки, сделайте print_r для каждого массива, проверьте запрос и результат, откройте мануал и почитайте что делает каждая функция. | |
|
|
|
|
|
|
|
для: RV
(30.07.2006 в 17:04)
| | RV, спасибо, но что-то никак не работает (включил все ошибки, проверил базу и пр.).
А что не так в моём коде (ведь по логике всё правильно)? Можать как-то можно его доработать? | |
|
|
|
|
|
|
|
для: Владимир22
(30.07.2006 в 18:04)
| | покажите запрос и результат | |
|
|
|