Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Найти и присвоить переменной незанятое в базе число
 
 автор: Владимир22   (30.07.2006 в 04:49)   письмо автору
 
 

Такая вот задача, что-то никак не идёт...
В базу пишутся сообщения и номер задаётся в PHP ($mes=$mes+1 - т.е. номера в итоге в базу идут так:1,2,3,4,5...). Однако пользователи могут удалять эти сообщения и из-за этого последовательная нумерация нарушается, а иногда и клинит добавление новой записи по причине, что заданный номер уже в базе есть (т.е. происходит смещение).
Как можно сделать, чтобы перед добавлением нового сообщения php-скрипт нашёл в базе первое свободное число попорядку -начиная с единицы, а потом присвоил этот номер новому записываемому сообщению?
Вот моя безуспешная попытка что-то соорудить:

<?
$result
=mysql_query("select * from mes");
$nomer_mes=mysql_result($result0'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!

   
 
 автор: RV   (30.07.2006 в 05:15)   письмо автору
 
   для: Владимир22   (30.07.2006 в 04:49)
 

а если мне дадут ссылку на сообщение, далее это сообщение удалится и на его место запишется новое, в итоге я приду не на то сообщение? обычно так никто не делает ибо никому не нужен порядок в порядковых номерах сообщений.

   
 
 автор: Владимир22   (30.07.2006 в 05:22)   письмо автору
 
   для: RV   (30.07.2006 в 05:15)
 

Это простые объявления, которые хранятся в течение короткого срока(
Мне надо именно так как я описал...

   
 
 автор: RV   (30.07.2006 в 06:09)   письмо автору
 
   для: Владимир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;
?>

   
 
 автор: Владимир22   (30.07.2006 в 06:32)   письмо автору
 
   для: RV   (30.07.2006 в 06:09)
 

Немного запутано для меня... буду пробовать.. Главное, чтобы если с последовательностью всё в порядке, то присвоило число следующее за макимальноимеющимся.

   
 
 автор: RV   (30.07.2006 в 06:38)   письмо автору
 
   для: Владимир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:41)   письмо автору
 
   для: RV   (30.07.2006 в 06:38)
 

допустим можно генерировать новый массив от 1 до максимального числа из базы

   
 
 автор: Владимир22   (30.07.2006 в 16:31)   письмо автору
 
   для: RV   (30.07.2006 в 06:41)
 

Что не хочет работать, даже эхом ничего не показывает...
А может можно как-то подправить мой вариант? НЕ могу понять в чём там у меня ошибка.

   
 
 автор: RV   (30.07.2006 в 17:04)   письмо автору
 
   для: Владимир22   (30.07.2006 в 16:31)
 

исправьте так
for ($i = 1; $i <= $max +1;)

включите ошибки, сделайте print_r для каждого массива, проверьте запрос и результат, откройте мануал и почитайте что делает каждая функция.

   
 
 автор: Владимир22   (30.07.2006 в 18:04)   письмо автору
 
   для: RV   (30.07.2006 в 17:04)
 

RV, спасибо, но что-то никак не работает (включил все ошибки, проверил базу и пр.).
А что не так в моём коде (ведь по логике всё правильно)? Можать как-то можно его доработать?

   
 
 автор: RV   (30.07.2006 в 18:09)   письмо автору
 
   для: Владимир22   (30.07.2006 в 18:04)
 

покажите запрос и результат

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования