2013-08-07 5 views
1

Я использую PHP PDO с MySQL для создания веб-приложения. Я хочу поместить веб-приложение в режим «demo». Это означает, что все записи (обновления, вставки, удаления) отключены, а применимые продолжают без каких-либо ошибок. Для аргументов, приложение находится в демонстрационном режиме, если $ _SESSION ['demo_mode'] = 1. Не устанавливая условности вокруг каждого оператора записи, как это можно сделать.Глобально отключить все записи MySQL

$dbh->exec("INSERT INTO t1(c1, c2) VALUES ('v1', 'v2')"); 
$dbh->lastInsertId(); 
$q=$dbh->query("SELECT c1 FROM t2 WHERE c2=123"); 
$v=$q->fetchColumn(); 
+0

Какую реакцию вы ожидаете от кода в случае запроса DML, вызванного в демонстрационном режиме? –

+1

Как насчет использования базы данных «demo» вместо живого? – dbf

+2

Если это основано на веб-интерфейсе, обычный подход к этому состоит в том, чтобы просто иметь демонстрационную базу данных, которая возвращается назад в исходное состояние через определенный промежуток времени, скажем, час или около того. –

ответ

3

Вы можете изменить права пользователя приложение подключается, как, так что он получает только SELECT и аналогичные права.

Адрес: comprehensive list of individual rights, которого вы можете дать пользователю.

Пример (адаптируются к вашей потребности, конечно):

REVOKE ALL PRIVILEGES ON yourdatabase.* FROM 'application_user'@'host'; 
GRANT SELECT ON yourdatabase.* TO 'application_user'@'host'; 

Очевидно, что это приведет к ошибкам, когда приложение пытается написать что-нибудь. Ваше приложение должно быть готово терпеть неудачу, если вы планируете использовать это для демонстрации;)

2

Простейшая вещь, о которой я могу думать, это просто начать транзакцию в начале запроса, не совершая ее. (В Mysql это не работает с таблицами MyISAM, и вы не можете изменить структуру таблицы, так как он будет Autocommit.)

if (isset($_SESSION['demo_mode'])) $dbh->beginTransaction(); 

// Do whatever you want, never committing 

// If you are using transactions and do want to commit, checkt the flag first 
if (!isset($_SESSION['demo_mode'])) $dbh->commit(); // Same for rollbacks 

уборщик решением было бы обернуть класс PDO, так что вы можете перехватить и совершить откат вызовов , Самое приятное в этой идее заключается в том, что последующие запросы во время одного и того же запроса будут отражать изменения. Они просто не будут настаивать на запросах. Потенциальный недостаток заключается в том, что он может не работать, потому что я его никогда не пробовал :-)