如何在不使用数据库的情况下存储少量属性?

时间:2014-12-03 10:08:20

标签: php

我有一个用标准PHP(没有框架或CMS)编写的网站,我有一些可以配置的信息,我想要存储,我要么不想要,要么可以& #39; t将它们存储在数据库中。

有:

  • 全局属性,如数据库用户名和密码。
  • 联系电话号码和地址等内容。

我知道我可以"硬编码"这样的事情,但我想把它们放在一个严格意义上不是文件的文件中。#34;代码"。

存储哪些选项适用于哪些?

1 个答案:

答案 0 :(得分:2)

在相当标准的PHP中有很多选项,选择主要取决于存储的信息类型以及编辑它的人。

<强>&#34;包含&#34;另一个设置变量的PHP文件

您可以使用includerequire关键字来包含设置一系列变量的文件,然后可以在该文件之外引用这些变量。

E.g。

database_configuration.php

<?
  $dbConfig['host']     = 'myhost';
  $dbConfig['username'] = 'myuser';
  $dbConfig['password'] = 'mypassword';
  $dbConfig['database'] = 'mydatabase';

用法:

<?

  include( 'database_configuration.php' );
  $connection = new mysqli( $dbConfig['host']    , $dbConfig['username']
                          , $dbConfig['password'], $dbConfig['database']);

这是一所非常古老的学校&#39;并且是很多人在很长一段时间内会遇到这种问题的方式。

优点是使用代码设置配置 - 您可以通过这种方式创建任何您想要的任何内容,以及任意数量的配置变量/数组/对象;它非常灵活。

但是,确实鼓励将变量放在本质上是全局范围内,这对于未来的可维护性来说不是一个好主意。

此外,由于这是代码,如果期望非编码器在任何时候改变配置,则是不合适的。它有效,但并不好。

在运行时更改配置并再次写出文件也很困难。与其他一些选项相比,这使它基本上是只读的。

然而,这是无处不在,它实际上是关于函数include的PHP文档中给出的第一个示例:http://php.net/manual/en/function.include.php

<强>&#34;包含&#34;另一个返回配置的PHP文件

这种技术几乎与上述相同,但它解决了引入全球范围的问题。

它不是配置一系列变量,而是设置一个返回包含脚本的局部变量。

database_configuration.php

<?
  return array( 'host'     => 'myhost'
              , 'username' => 'myuser'
              , 'password' => 'mypassword'
              , 'database' => 'mydatabase' );

用法:

<?

  $dbConfig = include( 'database_configuration.php' );
  $connection = new mysqli( $dbConfig['host']    , $dbConfig['username']
                          , $dbConfig['password'], $dbConfig['database']);

需要考虑与第一个例子相同的考虑因素。

它是PHP,所以它非常灵活,但交给非编码人员也很危险。

而且你无法绕过它 - 你可能已经将配置移动到另一个文件中,但严格来说它仍然是“硬编码”。

这也包含在include的文档中,例如#5:http://php.net/manual/en/function.include.php

请注意,上述两种解决方案也可以使用requirehttp://php.net/manual/en/function.require.php

这通常是可取的,因为如果找不到该文件,您将收到编译错误。

使用ini文件

PHP内置了处理ini文件的功能。最有用的可能是parse_ini_filehttp://php.net/manual/en/function.parse-ini-file.php

这允许您以标准格式创建ini文件,并使用它来填充数组。

E.g。

database_configuration.ini

[database]
host=myhost
username=myusername
password=mypassword
database=mydatabase

用法:

<?

  $dbConfig = parse_ini_file( 'database_configuration.ini' );
  $connection = new mysqli( $dbConfig['host']    , $dbConfig['username']
                          , $dbConfig['password'], $dbConfig['database']);

或者,如果您想使用文件中的部分:

<?

  $dbConfig = parse_ini_file( 'database_configuration.ini', true );
  $connection = new mysqli( $dbConfig['database']['host']    , $dbConfig['database']['username']
                          , $dbConfig['database']['password'], $dbConfig['database']['database']);

这具有易于阅读和维护的优点。它不是PHP代码,因此非代码管理起来要容易得多。您仍然需要有人可以访问Web服务器上的文件系统,但至少他们无法编写任意PHP。

缺点是它只能真正处理原始类型。您可以配置数组,但不能创建对象(如设置数据库连接本身)。

最后,与上面列出的其他示例一样,它基本上是单向的。您无法以编程方式更改内容并存储结果,而无需以ini文件格式输出内容。

所有的说法和完成,但它是配置,所以不是&#39;硬编码&#39; /

使用存储在文件中的序列化格式

您可以使用其他格式生成更复杂的对象,并且可以在运行时更轻松地生成这些格式。

示例是简单的一对serialize / unserializehttp://php.net/manual/en/function.serialize.php

您可以通过配置变量然后输出文件来生成输出:

E.g。

<?
  $configuration = array( 'host'     => 'myhost'
                        , 'username' => 'myuser'
                        , 'password' => 'mypassword'
                        , 'database' => 'mydatabase' );

  file_put_contents( 'database_configuration.txt', serialize( $configuration ) );

用法:

  $dbConfig = unserialize( file_get_contents( 'database_configuration.txt' ) );
  $connection = new mysqli( $dbConfig['host']    , $dbConfig['username']
                          , $dbConfig['password'], $dbConfig['database']);

结果是最终用户几乎无法读取的文件,但可以轻松地重新生成。这样可以让您轻松创建一个管理屏幕,允许在不访问文件系统的情况下设置此类配置。

PHP支持不同的格式,有些格式比其他格式更具人性化。

<强>结论

有许多不同的选项,选择取决于存储的数据/配置的类型,谁可能更改配置以及可能发生的频率。

我的建议是,无论选择哪个选项,您都会将其隐藏在课程后面,以便您可以在需求发生变化时更改机制。

有些事情:

 $sUsername = ConfigurationManager::getConfig( 'database', 'username' );

如果您有大量内容存储,我强烈建议您查看标准CMS框架(Drupal,Joomla等),或者至少考虑一个数据库。 ..