Записи в базу данных не добавляются, хотя запрос успешен.

Поздавьте меня, я набыдлокодил до нетривиальной ошибки.
Когда я пытаюсь добавить записи в таблицу, запрос никаких ошибок не возвращает, однако в базе данных записи отсутствуют. Но так бывает не со всеми INSERT'ами — на некоторых страницах INSERT'ы работают. Также, если в PHPMyAdmin принудительно ввести любой запрос, он выполнится без нареканий. Запросы выборки работают. Проблема в PHP.
//... класс ответственный за запросы к БД ...
	public function testInsertion ( ) {
		if ($this->link) {
			$stmt = $this->prepareStatement('isrtPrdct', "INSERT INTO `test` (`entry`) VALUES ('test');#");
			if ($stmt->execute( )) {
				printf('Success.');
			} else {
				printf('Failure.');
			}
		} else {
			printf('Failure.');
		}
	}
	
	public function checkInsertion ( ) {
		if ($this->link) {
			$stmt = $this->prepareStatement('checkIsrt', "SELECT * FROM `test` WHERE `entry`='test';#");
			if ($stmt->execute( )) {
				$stmt->bind_result($result);
				do {
					printf('result: \''.$result.'\'');
				} while ($stmt->fetch( ));
			} else {
				printf('Failure.');
			}
		} else {
			printf('Failure.');
		}
	}
//...
Если на одной странице выполнить обе функции, то они вернут 'Success' и 'result: 'test'' соответсвенно. Если функции будут вызваны на разных страницах, то checkInsertion вернёт пустую строку, т. к. в БД ничего не добавляется (хотя по задумке должно).
Я так себе думаю, что проблема в подключении к БД, в закрытии подготовленных запросов или чём-то в подобном. Конечно, я пробовал и непараметизированные запросы $mysqli->query($sql).
Что на Denver'е, что на сервере проблема одинаковая.
В сети встречаются подобные вопросы , но внятного решения я не отыскал. Большинство пишет, что проблема решилась сама собой.

Ответ

В общем вижу 2 причины. Это либо ты открываешь соединение не с основной базой, а какой нибудь внутренней и он все данные пишет в память (поэтому на одной странице и работает). Либо что-то типа отложенной записи. Возможно надо просто подтвердить изменения с помощью commit. Например, на оракле можно делать подтверждение и откат изменений.


Views: 1 477

Mihahail #1 - 7 years ago 0
Голосов: +0 / -0
Если вызывать на разных страницах, то разумеется создадутся два экземпляра класса, которые ну вообще ничем никак не связанны. связать их можно только post|get'ами.
Скрипт, когда пхп его начинает выполнять, ничего о других скриптах не знает.
Zahanc #2 - 7 years ago (изм. ) 0
Голосов: +0 / -0
Перешел с MySQLi на PDO вместе с постоянным соединением. Работает. Работает из-за того, что постоянне соединение, или из-за того, что PDO?
Mihahail #3 - 7 years ago (изм. ) 0
Голосов: +0 / -0
Я сказал глупость в первом сообщении. Точнее вещь, не относящуюся к теме.
С пдо не работал, только с mysql, но по-видимому из-за постоянного соединения. Могу и ошибаться, так вот: www.php.net/manual/ru/pdo.connections.php
По сабжу, да, во-первых, надо закрывать соединение(хотя само должно), во вторых, может кеширование?
alexprey #4 - 7 years ago 0
Голосов: +0 / -0
Нет коннекшен закрывать не надо, он сам закроется когда скрипт закончит выполнени.
INSERT INTO `test` (`entry`) VALUES ('test');#
Попробуй без ;#. Обычно в таких штуках не требуется завершающий символ
Zahanc #5 - 7 years ago 0
Голосов: +0 / -0
Уже не раз перечитывал. Мало знать основы, чтобы оптимально работать с БД.
Пробовал.
alexprey #6 - 7 years ago 0
Голосов: +0 / -0

В общем вижу 2 причины. Это либо ты открываешь соединение не с основной базой, а какой нибудь внутренней и он все данные пишет в память (поэтому на одной странице и работает). Либо что-то типа отложенной записи. Возможно надо просто подтвердить изменения с помощью commit. Например, на оракле можно делать подтверждение и откат изменений.
Zahanc #7 - 7 years ago 0
Голосов: +0 / -0
Вероятно Вы правы на счет фиксации. У меня была отключена автоматическая фиксация.
Транзакций в MySQLi вроде бы нет, зато есть в PDO.