全局禁用所有MySQL写入

时间:2013-08-07 13:57:44

标签: php mysql pdo

我正在使用PHP的PDO和MySQL来创建一个Web应用程序。我希望将Web应用程序置于“演示”模式。这意味着所有写入(更新,插入,删除)都被禁用,并且适用的继续没有任何错误。为了论证,如果$ _SESSION ['demo_mode'] = 1,应用程序处于演示模式。如果不在每个写语句周围放置条件,那么如何做到这一点。

$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();

2 个答案:

答案 0 :(得分:3)

您可以修改应用程序连接的用户的权限,以便它只获得SELECT和类似的权限。

以下是您可以授予用户的comprehensive list of individual rights

示例(当然要适应您的需要):

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

显然,当您的应用程序尝试编写任何内容时,这将产生错误。如果您计划将此用于演示,您的应用应该准备好失败;)

答案 1 :(得分:2)

我能想到的最简单的事情就是在请求开始时启动一个事务,从不提交它。 (在Mysql中,这不适用于Myisam表,并且您无法更改表结构,因为它将自动提交。)

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类,以便拦截提交和回滚调用。关于这个想法的好处是在同一请求期间的后续查询将反映更改。他们只是不会坚持要求。一个潜在的缺点是它可能不起作用,因为我从未尝试过: - )