Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > mysql insert_id одновременное обращение


Автор: Sanchezzz 7.5.2011, 15:14
Добрый день тут делемка у меня 


функция из класса forums

$id_topic  = $this->db->insert_id; Если будут пользователи одновременно создавать тему на форуме я конкректно получу id последнего инсерта срузу после выполнения запроса, КОД ниже.  ? 

$this->db это обертка mysql или mysqli


Код


class forums {

//... 


public function createTopic($id_forum_cat , $userid , $username , $useremail ,  $nameTopic ,  $body = '', $icon = 'xx', $smiles_enable = true , $approved = true , $locked = false) {
        $id_forum_cat = intval($id_forum_cat);  $userid = intval($userid);
        
        $poster_time = time(); //Время создание темы и сообщение
        $nameTopic = $this->db->real_escape_string($nameTopic); // Название темы
        $body = $this->db->real_escape_string($body); // Текст сообщения
        $userip = ''; // ip узера.
        $approved = ($approved==true)? '1':'0'; // Одобрено 1 да 0 Нет
        $locked = ($locked==true)? '1':'0'; // Закрыть тему 1 Да 0 Нет
        $smiles_enable =  ($smiles_enable==true)? '1':'0';
        // Если это спам то нечего не создаем.
        // if(is_spam($body)) return false;

        
        // Создание темы
        $sql = "INSERT INTO `forum_topics` ( `id` , `topic_name` , `id_forum_cat` , `id_first_msg` , `id_last_msg` , `id_user_started` , `id_user_updated` , `num_replies` , `num_views` , `locked` , `unapproved` , `approved` )
            VALUES (
            '', '{$nameTopic}', '{$id_forum_cat}', '0', '0', '0', '0', '0', '0', '{$locked}', '0', '{$approved}'
            );
            ";
        if(!$this->db->query($sql) ){
                    printf("Error: %s\n", $this->db->sqlstate);
                    return false;
            }
        // ID темы в таблице forum_topics
            $id_topic  = $this->db->insert_id;
        
        // Создание сообщения
        $sql = "INSERT INTO `forum_messages` ( `id` , `id_topic` , `poster_time` , `id_user` , `subject` , `poster_name` , `poster_email` ,
        `poster_ip` , `smileys_enabled` , `modified_time` , `modified_name` , `body` , `icon` , `approved` )
        VALUES (
        '', '{$id_topic}', '{$poster_time}', '{$userid}', '{$nameTopic}', '{$username}', '{$useremail}', '{$userip}', '{$smiles_enable}', '0', '', '{$body}', '{$icon}', '{$approved}'
        );
        ";
        if(!$this->db->query($sql) ){
                    printf("Error: %s\n", $this->db->sqlstate);
                    return false;
            }
        // ID сообщение в таблице forum_messages
        $id_messages = $this->db->insert_id;  
        
        // Обновим тему на коректные данные
        $sql = "UPDATE `forum_topics` SET `id_first_msg` = '{$id_messages}',
                `id_last_msg` = '{$id_messages}',
                `id_user_started` = '{$userid}',
                `id_user_updated` = '{$userid}' WHERE `id` ={$id_topic} LIMIT 1 ;
        ";
        if(!$this->db->query($sql) ){
                    printf("Error: %s\n", $this->db->sqlstate);
                    return false;
        }
        
        return true;
    }

}



Автор: patap 7.5.2011, 15:39
для меня этот вопрос тоже какбы загадка. Но вот порылся в манах, и вот что я обнаружил:
(думаю я правильно все понял)

тут написано http://php.net/manual/en/function.mysql-insert-id.php
Цитата

    Note:

    Because mysql_insert_id() acts on the last performed query, be sure to call mysql_insert_id() immediately after the query that generates the value.

следовательно вероятность получения не того ид есть )

здесь нашел следующее http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
Цитата

For LAST_INSERT_ID(), the most recently generated ID is maintained in the server on a per-connection basis. It is not changed by another client. It is not even changed if you update another AUTO_INCREMENT column with a nonmagic value (that is, a value that is not NULL and not 0). Using LAST_INSERT_ID() and AUTO_INCREMENT columns simultaneously from multiple clients is perfectly valid. Each client will receive the last inserted ID for the last statement that client executed. 


как я понял, для того чтобы однозначно получить именно последний ид (автоинкримент) нужно после инсерт запроса выполнить следующий запрос

Код

SELECT LAST_INSERT_ID();


Добавлено через 4 минуты и 22 секунды
или блин я напутал чегго-то...кто что думает

Автор: Sanchezzz 7.5.2011, 16:04
SELECT LAST_INSERT_ID(); вроде уже выполняет автоматом PHP mysqli или равно сильно функции mysql_insert_id

Автор: patap 7.5.2011, 16:07
Sanchezzz, о тож я тоже так потом подумал потом. Думаю: что тогда возвращает mysql_insert_id, как не LAST_INSERT_ID. и в чем тогда разница...

Автор: Sanchezzz 7.5.2011, 18:29
пока оставлю этот вариант проверю как не будь нужно посмотреть как другие форумы решили эту проблему . точнее возможность наличии проблемы.

если кто с толкнулся с похожей проблемой реально отпишитесь в этом топики очень интересно )

Автор: Muerto 7.5.2011, 21:02
Не могу понять о чем в топике речь идет...
SELECT LAST_INSERT_ID();

Выдает последний запрос который ВЫ сделали.

Т.е. я делаю insert into ...

И если после этого SELECT LAST_INSERT_ID(); , то ничего другого вы не получите как последний Id

Если бы эта функция работала глобально на всю базу - от неё бы толку почти ноль было...

Так что пользуйтесь спокойно, а если какие проблемы, то виновата не функция...

---

Т.е. автор - если ваш пользователь создал тему, пусть параллельно создают их ещё миллион - разницы нету!

Это именно для текущего выполнения скрипта работает 

Автор: Nigel 7.5.2011, 21:24
У каждого процесса свое значение, возвращаемое функцией mysql_insert_id.
Тема давно обсуждалась уже, в следующий раз пользуйтесь, пожалуйста, поиском по форуму.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)