Записи в базу данных не добавляются, хотя запрос успешен.
Поздавьте меня, я набыдлокодил до нетривиальной ошибки.
Когда я пытаюсь добавить записи в таблицу, запрос никаких ошибок не возвращает, однако в базе данных записи отсутствуют. Но так бывает не со всеми 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. Например, на оракле можно делать подтверждение и откат изменений.
Смотрите также:
Комментарии
Если вызывать на разных страницах, то разумеется создадутся два экземпляра класса, которые ну вообще ничем никак не связанны. связать их можно _только_ post|get'ами.
Скрипт, когда пхп его начинает выполнять, ничего о других скриптах не знает.
Перешел с MySQLi на PDO вместе с постоянным соединением. Работает. Работает из-за того, что постоянне соединение, или из-за того, что PDO?
Я сказал глупость в первом сообщении. Точнее вещь, не относящуюся к теме.
С пдо не работал, только с mysql, но по-видимому из-за постоянного соединения. Могу и ошибаться, так вот: http://www.php.net/manual/ru/pdo.connections.php
По сабжу, да, во-первых, надо закрывать соединение(хотя само должно), во вторых, может кеширование?
Нет коннекшен закрывать не надо, он сам закроется когда скрипт закончит выполнени.
INSERT INTO `test` (`entry`) VALUES ('test');#Попробуй без ;#. Обычно в таких штуках не требуется завершающий символ
В общем вижу 2 причины. Это либо ты открываешь соединение не с основной базой, а какой нибудь внутренней и он все данные пишет в память (поэтому на одной странице и работает). Либо что-то типа отложенной записи. Возможно надо просто подтвердить изменения с помощью commit. Например, на оракле можно делать подтверждение и откат изменений.
Вероятно Вы правы на счет фиксации. У меня была отключена автоматическая фиксация.
Транзакций в MySQLi вроде бы нет, зато есть в PDO.
Возможность добавлять комментарии была ограничена


<a href= http://mosros.flybb.ru/viewtopic.php?f=2&t=635>Процесс получения диплома стоматолога: реально ли это сделать быстро?</a>