Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> mysql insert_id одновременное обращение 
:(
    Опции темы
Sanchezzz
Дата 7.5.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Добрый день тут делемка у меня 


функция из класса 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;
    }

}





--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
patap
Дата 7.5.2011, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



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

тут написано 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/get...-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 секунды
или блин я напутал чегго-то...кто что думает


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
Sanchezzz
Дата 7.5.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



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


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
patap
Дата 7.5.2011, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 26
Всего: 40



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


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
Sanchezzz
Дата 7.5.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



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

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


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Muerto
Дата 7.5.2011, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: 3
Всего: 4



Не могу понять о чем в топике речь идет...
SELECT LAST_INSERT_ID();

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

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

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

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

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

---

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

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

Это сообщение отредактировал(а) Muerto - 7.5.2011, 21:03


--------------------
user posted image
PM MAIL   Вверх
Nigel
Дата 7.5.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



У каждого процесса свое значение, возвращаемое функцией mysql_insert_id.
Тема давно обсуждалась уже, в следующий раз пользуйтесь, пожалуйста, поиском по форуму.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1069 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.