проблема записи id с нуля

sunyang

Мастер
Регистрация
25 Апр 2009
Сообщения
440
Реакции
30
у меня вот этот скрипт:
PHP:
<?
if(!defined('in_site')) die('Hacking attempt'); 
// если юзер зареган, редиректим на страницу юзера
if(!empty($_SESSION['userid']) or !empty($_COOKIE['save_user_id'])){
	header("Location: ?q=user");
	exit();
}
// register vars
$email = isset($_POST['email']) ? str_ent($_POST['email']) : '';
$login = isset($_POST['login']) ? str_ent($_POST['login']) : '';
$phone = isset($_POST['phone']) ? str_ent($_POST['phone']) : '';
$tzone = isset($_POST['tzone']) ? str_ent($_POST['tzone']) : '';
// register
if(isset($_POST['submit']) && $_POST['submit']=='register')
{
	// user agree with rules
	if(!empty($_POST['agree']))
	{
		$pass1 = str_ent($_POST['pass1']);
		$pass2 = str_ent($_POST['pass2']);
		$scode = str_ent($_POST['scode']);
		// check errors
		if(empty($email) or empty($pass1) or empty($pass2) or empty($login) or empty($phone)  or empty($scode))
		{
			$status = "Все поля должны быть заполнены";
		}
		// check email address
		else if(!CheckEmail($email))
		{
			$status = "Ошибка синтаксиса e-mail адреса";
		}
		// check passwords length
		else if(strlen($pass1)<6 || strlen($pass1)>30)
		{
			$status = "Длина пароля не должна быть меньше 6 символов и не должна быть больше 30 символов";
		}
		// check password syntax
		else if(!preg_match("/^[a-z_0-9\-\.]{6,30}$/i", $pass1))
		{
			$status = "Ошибка синтаксис пароля";
		}
		// confirm password
		else if($pass1!=$pass2)
		{
			$status = "Пароли не совпадают";
		}
		// проверка поля номера телефона
		else if(strlen($phone)<11 || strlen($phone)>11)
		{
			$status = "Введите номер телефона в формате: 79XXXXXXXXX (11 цифр без знака '+')";
		}
		// check phone syntax
		else if(!preg_match("/^[0-9\-\.]{11,11}$/i", $phone))
		{
			$status = "Проверьте правильность ввода номера телефона";
		}
		// <-- номер
		// check login length
		else if(strlen($login)<3 or strlen($login)>30)
		{
			$status = "Длина имя пользователья не должно быть меньше 3 символов и не должно быть больше 30 символов";
		}
		// check login (nick)
		else if(!preg_match("/^[a-z0-9]+$/i", $login))
		{
			$status = "Ошибка синтаксис логина";
		}
		// check security code
		else if(!empty($_SESSION['security_code']) && $_SESSION['security_code']!=$scode)
		{
			$status = "Код  безопасности введен не верно";
		}
		else{
			// check login exists
			if($sql->selectCell('SELECT login FROM ?_users WHERE login=?s', $login))
			{
				$status = "<b>$login</b> Данный логин  используется другим участником";
			}
			// check email exists
			else if($sql->selectCell('SELECT email FROM ?_users WHERE email=?s', $email))
			{
				$status = "Данный e-mail  используется другим участником";
			}
			// check phone exists
			else if($sql->selectCell('SELECT phone FROM ?_users WHERE phone=?s', $phone))
			{
				$status = "Данный телефон используется другим участником";
			}
			else{
				// get all insert data
				$row = array('email' => $email,
				             'pass'  => md5($pass1),
							 'login' => $login,
							 'tzone' => $tzone,
							 'phone' => $phone,
							 'edate' => date('Y-m-d H:i:s'),
							 'mdate' => date('Y-m-d H:i:s'),
							 'cdate' => date('Y-m'));
				if($sql->query('INSERT INTO ?_users (?#) VALUES(?a)',
							   array_keys($row), array_values($row)))
				{
					header("Location: ?q=preview");
					exit();
				}
			}
		}
	}
	else{
		// user not agree our rules
		$status = "Вы не согласны правилами участия в конкурсе и правилами пользования сайтом?";
	}
}
?>
записывает вот в эту базу:
PHP:
CREATE TABLE IF NOT EXISTS `gs_users` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(100) NOT NULL,
  `pass` varchar(35) NOT NULL,
  `fpass` varchar(30) DEFAULT NULL,
  `login` varchar(30) NOT NULL,
  `tzone` char(6) NOT NULL,
  `edate` datetime NOT NULL,
  `mdate` datetime NOT NULL,
  `cdate` varchar(10) NOT NULL,
  `logged` int(1) unsigned DEFAULT '0',
  `firstname` varchar(60) NOT NULL,
  `lastname` varchar(60) NOT NULL,
  `bdate` date NOT NULL,
  `slove` int(2) unsigned DEFAULT '0',
  `hobbi` text,
  `work` varchar(250) DEFAULT NULL,
  `love_music` text,
  `love_movie` text,
  `love_books` text,
  `love_color` text,
  `i_am` text,
  `deviz` text,
  `my_dream` text,
  `country` varchar(50) DEFAULT NULL,
  `district` varchar(50) DEFAULT NULL,
  `city` varchar(50) DEFAULT NULL,
  `icq` varchar(20) DEFAULT NULL,
  `views` int(6) unsigned DEFAULT '0',
  `rating` int(6) DEFAULT '0',
  `phone` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=9 ;
...значения.
Но проблема в том, что если у меня было зарегано 5 узеров с id 1, 2, 3, 4 и 5 соответственно. Я их всех удаляю, добавляю новых юзеров, но id новых узеров начинается не с нуля а с id 6
Как подправить базу чтоль, чтоб после удаления всех юзеров присвоение id начиналось с нуля... а если удален 1 или несколько юзеров, то при реге новых им присваиваются иды удаленных ?
 
так нельзя делать если на то нет острой необходимости ... очень острой необходимости ...

подобного рода манипуляции могут нарушить целостность бд

ну а сделать это можно запросом

PHP:
  ALTER TABLE `gs_users` AUTO_INCREMENT = new_value;

но его можно будет использовать лишь тогда когда удаляют самого последнего юзера...
ну а подтирать с конца по 1 юзеру думаю нет смысла

да и тип данных
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,

имеет диапазон 0 to 4294967295
для вас точно столь критично его значение что нужно что-то там удалять?
 
Можно ещё в скрипт, который добавляет запись в БД добавить кусок, который проверяет пробелы в id и если таковые есть, то в массив записываемых данных
PHP:
$row = array('email' => $email, 
                             'pass'  => md5($pass1), 
                             'login' => $login, 
                             'tzone' => $tzone, 
                             'phone' => $phone, 
                             'edate' => date('Y-m-d H:i:s'), 
                             'mdate' => date('Y-m-d H:i:s'), 
                             'cdate' => date('Y-m'));
добавлял ещё один элемент 'id'=> $id,
Но это геморойный процесс и тогда в принципе не нужен AUTO_INCREMENT...
+1 chang Очень стрёмное действие... Когда в базе только одна таблица это ещё как то допустимо, но когда больше и между ними есть связь, то могут возникнуть очень большие проблемы...
 
чтобы ид начинались с 1 нужно чистить таблицу этим запросом
PHP:
TRUNCATE TABLE `table`
можно убрать AUTO_INCREMENT, и тогда самому писать ид ну это если нужно не всю таблицу очищать
 
Хм, а не пробовали при записи юзера в БД ИД то же указывать?)
Тогда можно использовать команду на вывод максимального значения ИД а потом к нему просто прибавлять 1.
Но как кто то тут уже писал это может нарушить целостность... в общем очень не рекомендую =)
Тогда ваш запрос редактируем вот таким образом:
БЫЛО:
`id` int(6) unsigned NOT NULL AUTO_INCREMENT,
СТАЛО:
`id` int(6) unsigned NOT NULL,

После чего в каждом запросе добавления юзера в самом начале добавляем строку на присвоение ему определенного ИД.
 
Временная таблица, минимум правок в скрипте, первый запрос выполняется непосредственно перед инсертом:
CREATE TEMPORARY TABLE tmp_users SELECT id from gs_users;
INSERT INTO gs_users values ( (SELECT IFNULL(max(id),0)+1 FROM tmp_users),/*и дальше столбцы по базе*/ );
 
Назад
Сверху