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

Тема в разделе "PHP", создана пользователем sunyang, 9 апр 2011.

Модераторы: latteo
  1. sunyang

    sunyang

    Регистр.:
    25 апр 2009
    Сообщения:
    444
    Симпатии:
    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)<|| 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)<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` (
      `
    idint(6unsigned NOT NULL AUTO_INCREMENT,
      `
    emailvarchar(100NOT NULL,
      `
    passvarchar(35NOT NULL,
      `
    fpassvarchar(30) DEFAULT NULL,
      `
    loginvarchar(30NOT NULL,
      `
    tzonechar(6NOT NULL,
      `
    edatedatetime NOT NULL,
      `
    mdatedatetime NOT NULL,
      `
    cdatevarchar(10NOT NULL,
      `
    loggedint(1unsigned DEFAULT '0',
      `
    firstnamevarchar(60NOT NULL,
      `
    lastnamevarchar(60NOT NULL,
      `
    bdatedate NOT NULL,
      `
    sloveint(2unsigned DEFAULT '0',
      `
    hobbitext,
      `
    workvarchar(250) DEFAULT NULL,
      `
    love_musictext,
      `
    love_movietext,
      `
    love_bookstext,
      `
    love_colortext,
      `
    i_amtext,
      `
    deviztext,
      `
    my_dreamtext,
      `
    countryvarchar(50) DEFAULT NULL,
      `
    districtvarchar(50) DEFAULT NULL,
      `
    cityvarchar(50) DEFAULT NULL,
      `
    icqvarchar(20) DEFAULT NULL,
      `
    viewsint(6unsigned DEFAULT '0',
      `
    ratingint(6) DEFAULT '0',
      `
    phonetext,
      
    PRIMARY KEY (`id`)
    ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=;
    ...значения.
    Но проблема в том, что если у меня было зарегано 5 узеров с id 1, 2, 3, 4 и 5 соответственно. Я их всех удаляю, добавляю новых юзеров, но id новых узеров начинается не с нуля а с id 6
    Как подправить базу чтоль, чтоб после удаления всех юзеров присвоение id начиналось с нуля... а если удален 1 или несколько юзеров, то при реге новых им присваиваются иды удаленных ?
     
  2. chang

    chang

    Регистр.:
    20 ноя 2009
    Сообщения:
    364
    Симпатии:
    117
    так нельзя делать если на то нет острой необходимости ... очень острой необходимости ...

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

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

    PHP:
      ALTER TABLE `gs_usersAUTO_INCREMENT new_value;
    но его можно будет использовать лишь тогда когда удаляют самого последнего юзера...
    ну а подтирать с конца по 1 юзеру думаю нет смысла

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

    имеет диапазон 0 to 4294967295
    для вас точно столь критично его значение что нужно что-то там удалять?
     
  3. dino

    dino

    Регистр.:
    28 май 2009
    Сообщения:
    550
    Симпатии:
    204
    Можно ещё в скрипт, который добавляет запись в БД добавить кусок, который проверяет пробелы в 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 Очень стрёмное действие... Когда в базе только одна таблица это ещё как то допустимо, но когда больше и между ними есть связь, то могут возникнуть очень большие проблемы...
     
  4. Sanja_

    Sanja_ Создатель

    Регистр.:
    9 окт 2009
    Сообщения:
    27
    Симпатии:
    8
    чтобы ид начинались с 1 нужно чистить таблицу этим запросом
    PHP:
    TRUNCATE TABLE `table`
    можно убрать AUTO_INCREMENT, и тогда самому писать ид ну это если нужно не всю таблицу очищать
     
  5. ApJIeKuHo

    ApJIeKuHo Писатель

    Регистр.:
    10 июл 2009
    Сообщения:
    4
    Симпатии:
    11
    Хм, а не пробовали при записи юзера в БД ИД то же указывать?)
    Тогда можно использовать команду на вывод максимального значения ИД а потом к нему просто прибавлять 1.
    Но как кто то тут уже писал это может нарушить целостность... в общем очень не рекомендую =)
    Тогда ваш запрос редактируем вот таким образом:
    БЫЛО:
    `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
    СТАЛО:
    `id` int(6) unsigned NOT NULL,

    После чего в каждом запросе добавления юзера в самом начале добавляем строку на присвоение ему определенного ИД.
     
  6. FaLL3N

    FaLL3N Постоялец

    Регистр.:
    4 дек 2006
    Сообщения:
    100
    Симпатии:
    17
    Временная таблица, минимум правок в скрипте, первый запрос выполняется непосредственно перед инсертом: