1

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

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

2 回答 2

3

您可以修改应用程序连接的用户的权限,使其仅获得SELECT和类似的权限。

以下是您可以授予用户的个人权利的完整列表。

示例(当然要根据您的需要进行调整):

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

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

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

于 2013-08-07T14:25:21.720 回答