Проблем с @mysql_insert_id

misho

Registered
Преди няколко дни си преместих форума на друг хостинг. Преместих всички файлове и базата данни и на пръв поглед всичко работеше, но се оказа, че не могат да се пишат мнения, да се пускат теми, нито лични съобщения.
Стигнах до извода, че в базата данни, когато се записват темите, след това се взема id-то на темата и се връзва мнението към нея, но функцията, която се грижи за това връща 0, вместо id-то. Функцията е:
Код:
function sql_nextid(){
var_dump($this->db_connect_id);
		if($this->db_connect_id)
		{
			$result = @mysql_insert_id($this->db_connect_id);
			var_dump($result);
return $result;
		}
		else
		{
			return false;
		}
	}
Първият var_dump() връща resource(12) of type (mysql link), а вторият - int(0). Къде може да е проблемът? Къде да търся? Съмнявам се, че нещо в базата не е съвсем както трябва, защото файловете пък съвсем не съм ги пипал. :?
 
А защо потискаш грешките ? Махни го това маймунско "А" и виж дали няма да ти изкара грешка.

Плюс това, въобще не ти трябват такива гимнастики, за да изкараш последното ID. Чисто и просто можеш да си извикаш без аргументи оригиналната функция, след заявката(заявката трябва да е от тип INSERT).

Не знам как се опитваш да я викаш, но според документацията, функцията връща 0, когато заявката преди нея не генерира AUTO_INCREMENT стойност.
 
Това си е кода на phpBB2 форум, който ползвам вече повече от 5 години и проблемът стана след преместването. Това ме кара да мисля, че проблемът е в преместването на базата данни. Версията на php е 5.2, което означава, че mysql_insert_id() би трябвало да работи.
Махнах @, но не се появи нищо допълнително освен грешката, която форума си генерира:
Код:
Error in posting

DEBUG MODE

INSERT INTO phpbb_posts_text (post_id, post_subject, bbcode_uid, post_text) VALUES (0, 'ПРОБА', 'a3db1e4ad9', 'ПРБАОАОА')

Line : 252
File : functions_post.php


В документацията пише, че ако типа на полето AUTO_INCREMENT е BIGINT може да връща некоректни стойности. При мен типът е точно такъв. Но как мога да го променя? :lol:

Пробвах да изпълня директно в phpmyadmin една insert заявка и веднага след нея LAST_INSERT_ID() и последната върна 0. :!:
Какво точно имаш предвид като казваш да извикам същата заявка без аргументи?
 
Да, когато изпълня SELECT LAST_INSERT_ID() заедно с INSERT-а връща правилен резултат. Защо обаче кода на phpbb2 форума не работи!? Кое го бърка? Години наред вървеше и нищо по него не е пипано. Изобщо не ми се ще да пренаписвам функционалности на форума. Във всеки случай не е от там проблема. Единствено базата данни е местена и сървъра е друг. :?
 
INSERT INTO phpbb_posts_text (post_id, post_subject, bbcode_uid, post_text) VALUES (0, 'ПРОБА', 'a3db1e4ad9', 'ПРБАОАОА')

Виж какво става тука. Я дай самата заявка да видя от къде идва тази 0. Защото при местенето на базата данни(при експорт), ако не е записана крайната точка на AUTO_INCREMENT, то тогава ще се мъчи да записва отначало стойностите.

Дай също от експорта на базата данни тази заявка, която създава phpbb_posts_text (CREATE TABLE phpbb_posts_text).
 
Проблемът е точно с тази 0. Ето накратко как стават нещата:
- първо се прави запис в таблицата phpbb_topics за новосъздадената тема:
Код:
INSERT INTO " . TOPICS_TABLE . " (topic_title, topic_poster, topic_time, forum_id, topic_status, topic_type, topic_vote) VALUES ('$post_subject', " . $userdata['user_id'] . ", $current_time, $forum_id, " . TOPIC_UNLOCKED . ", $topic_type, $topic_vote)
- след това се взема id-то на току що направения запис чрез:
Код:
$topic_id = $db->sql_nextid();
sql_nextid() е функцията, чието съдържание показах по-горе. Точно тук идва проблемът, защото връща 0 и всичко нататък по веригата се проваля.
- после се прави запис в phpbb_posts на мнението, което се свързва с темата чрез id-то (в случая се записва 0).
- следващата стъпка е да се запише текста на мнението в phpbb_posts_text, където се записва id-то на мнението (от phpbb_posts). Това id се взема по същия начин и също се получава 0.
Както вече казах в information_chema.tables има записи за AUTO_INCREMENT за тези таблици и се обновяват правилно при всеки INSERT.

Ето и съответните sql-и:
Код:
--
-- Структура на таблица `phpbb_posts`
--

CREATE TABLE IF NOT EXISTS `phpbb_posts` (
  `post_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `topic_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `forum_id` smallint(5) unsigned NOT NULL DEFAULT '0',
  `poster_id` mediumint(8) NOT NULL DEFAULT '0',
  `post_time` int(11) NOT NULL DEFAULT '0',
  `poster_ip` varchar(8) COLLATE cp1251_bulgarian_ci NOT NULL DEFAULT '',
  `post_username` varchar(25) COLLATE cp1251_bulgarian_ci DEFAULT NULL,
  `enable_bbcode` tinyint(1) NOT NULL DEFAULT '1',
  `enable_html` tinyint(1) NOT NULL DEFAULT '0',
  `enable_smilies` tinyint(1) NOT NULL DEFAULT '1',
  `enable_sig` tinyint(1) NOT NULL DEFAULT '1',
  `post_edit_time` int(11) DEFAULT NULL,
  `post_edit_count` smallint(5) unsigned NOT NULL DEFAULT '0',
  `helpful_points` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`post_id`),
  KEY `forum_id` (`forum_id`),
  KEY `topic_id` (`topic_id`),
  KEY `poster_id` (`poster_id`),
  KEY `post_time` (`post_time`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 COLLATE=cp1251_bulgarian_ci AUTO_INCREMENT=10703 ;

--
-- Структура на таблица `phpbb_posts_text`
--

CREATE TABLE IF NOT EXISTS `phpbb_posts_text` (
  `post_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `bbcode_uid` varchar(10) COLLATE cp1251_bulgarian_ci NOT NULL DEFAULT '',
  `post_subject` varchar(60) COLLATE cp1251_bulgarian_ci DEFAULT NULL,
  `post_text` text COLLATE cp1251_bulgarian_ci,
  PRIMARY KEY (`post_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bulgarian_ci;

--
-- Структура на таблица `phpbb_topics`
--

CREATE TABLE IF NOT EXISTS `phpbb_topics` (
  `topic_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `forum_id` smallint(8) unsigned NOT NULL DEFAULT '0',
  `topic_title` char(60) NOT NULL DEFAULT '',
  `topic_poster` mediumint(8) NOT NULL DEFAULT '0',
  `topic_time` int(11) NOT NULL DEFAULT '0',
  `topic_views` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `topic_replies` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `topic_status` tinyint(3) NOT NULL DEFAULT '0',
  `topic_vote` tinyint(1) NOT NULL DEFAULT '0',
  `topic_type` tinyint(3) NOT NULL DEFAULT '0',
  `topic_first_post_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `topic_last_post_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `topic_moved_id` mediumint(8) unsigned NOT NULL DEFAULT '0',
  `topic_helpfulpoints` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`topic_id`),
  KEY `forum_id` (`forum_id`),
  KEY `topic_moved_id` (`topic_moved_id`),
  KEY `topic_status` (`topic_status`),
  KEY `topic_type` (`topic_type`),
  KEY `topic_last_post_id` (`topic_last_post_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1744 ;
 
Хм, интересно. Наистина би трябвало да няма проблем.

Но все пак за пробата замести

PHP:
$topic_id = $db->sql_nextid();

с

PHP:
$topic_id = mysql_insert_id();

(Ако е нужно сложи линк към връзката).
 
misho каза:
За жалост нищо не промени това. :?
От кой хост към кой се прехвърли?
Питам това защото всеки си има косури,и различно конфигурирани сървъри
 
uphero каза:
misho каза:
За жалост нищо не промени това. :?
От кой хост към кой се прехвърли?
Питам това защото всеки си има косури,и различно конфигурирани сървъри
От ICN към Jump (php: 5.2.17, mysql: 5.5.30-MariaDB-log).
 
Не би трябвало да има проблем. В краен случай правиш още една заявка за LAST_INSERT_ID() и взимаш, което не е най-прекрасния решаващ проблема начин.
 
В крайна сметка измайсторих едно не много добро решение, но поне закърпва положението. Просто правя следната заявка след INSERT-а:
Код:
SELECT topic_id FROM phpbb_topics ORDER BY topic_id DESC LIMIT 1
...и вземам id-то на последния запис. Теоретично има шанс двама души почти едновременно да пуснат тема и нещата да се омажат сериозно (ако заявките не са в транзакция, ама май не са), но имайки предвид активността във форума ми... :D
Иначе ще е добре да се разбере от къде дойде всичко. :lol:
 

Back
Горе