【问题标题】:PHP Best practice for saving/storing very small amounts of dataPHP 保存/存储极少量数据的最佳实践
【发布时间】:2018-03-11 11:38:54
【问题描述】:

我目前正在做的事情行得通,但我只是觉得有更好的方法,或者可能是更专业的方法。我说的是非常少量的数据,例如保存的一个数字(或几个数字),以便将所做的选择存储在下拉列表中,以便每次重新打开页面时都会记住它。我根本没有使用 mysql 数据库,所以它只保存到文件中。

现在我只需将数字保存到文本文件以保存选定的文件夹,然后在其下方有几个其他数字以保存选定的文件。全部从下拉列表中选择,如下所示:

<form method="POST" action="index.php">
<select onchange="this.form.submit();" name="text">
<option>Select</option>
<option value="first">first</option>
<option value="second">second</option>
<option value="etc">etc</option>
</select>
</form>

然后将它们存储在一个文本文件中,如下所示:

7
4
3

当文件夹或文件被更改时,使用以下代码进行更改:

function saveFile($line,$data,$savepath) {
$trace=file($savepath);$trace[$line]=$data;
file_put_contents($savepath,$trace);
}

if(isset($_POST['text'])) {
$changed=$_POST['text'];
saveFile($selected,$changed."\n",$savepath);
}

代码选择保存到文本文件的哪一行。也许有更好的方法或完全不同的方法?虽然我不想使用 sql 或类似的东西。

【问题讨论】:

  • 如果它适合你,那为什么不呢?通常你应该将数据存储到数据库中
  • 最佳实践是 DB/SQL。
  • 您有什么特别的原因不想使用 SQL 或类似的东西吗?这是数据库的重点
  • 我想你可以试试 mongoDB 之类的东西。
  • @bub 是的,它可以工作,但最近我问了一个关于某事的问题,并被告知我做错了,所以最终完全改变了我的代码。通常有更好的方法来做事。虽然只有大约 10 个左右的数字,但设置数据库似乎有点麻烦和不必要。我对 sql 的想法是至少有 100 条但通常有数千条或更多条数据,每个粒子中有许多元素,例如每个元素的名称、地址、电话号码等。我只需要单个数字,总共只有大约 10 个......

标签: php storage store


【解决方案1】:

看看Rocket-Store...

【讨论】:

    【解决方案2】:

    要将这样的少量数据保存到文件中,我建议将数据作为键/值对存储在数组中,然后序列化数组(或将其转换为 JSON),然后保存。

    例如

    $folderValue = 5;
    $file1Value = 6;
    $file2Value = 7;
    
    /**
      * Saving data
      */
    $data = array(
        'folder' => $folderValue,
        'file1' => $file1Value,
        'file2' => $file2Value,
    );
    
    file_put_contents($filename , serialize(data));
    
    
    /**
      * Getting data (this will be the same array you
      * saved to file at an earlier point) which you can
      * iterate over or grab values via key.
      */
    
    $data = unserialize(file_get_contents($filename));
    
    foreach ($data as $key => $value) {
        echo "key {$key} is {$value}\n";
        // e.g. "key folderValue is 5";
    }
    
    echo $data['folder'] . "\n";
    // e.g. "5";
    

    SQL 仍然是存储应用程序状态的更好选择。平面文件很差,因为随着时间的推移它们变得难以管理,但如果您确实使用文件,键=>值映射对于可读性很重要。

    如果您需要低开销 SQL(低配置,不运行后台服务器),SQLite 可能是一个不错的选择,但它有其自身的局限性(性能低,无法扩展)。

    PHP 有关于序列化数据的良好文档: http://php.net/manual/en/function.serialize.php http://php.net/manual/en/function.unserialize.php

    Json 是另一种很好的数据序列化格式。另请参阅 json_encode 和 json_decode。

    【讨论】:

    • serialize 好像把数据弄得一团糟?都是 i:8;s:3:"Name";i:9;等等你如何存储任何单个项目的价值呢?我的意思是与相关文件夹关联的数字?
    • 谢谢,你给了我一些好主意。我最终使用了 var_export,这种方式确实更好,并且总体上使用的代码更少。
    • 您总是对序列化数据使用反序列化函数。序列化数据并不意味着直接使用。我建议首先将所有值放入一个数组数组中,以便您可以将一个键应用于每个值(即标签),这样您的代码就更具可读性。 serialize 函数是一种将复杂数据结构(例如数组、对象)转换为字符串的方法,以便可以轻松地存储或传输它们。反序列化将采用该字符串并重建以前存在的数据。
    • 好的,我明白了。是的,我先将其转换为数组,但有时如果出现问题,建议直接查看保存的数据文件。使用序列化它太乱了,看不出有什么问题。使用 var_export 它可以非常整齐地存储数据,如果数据保存不正确并且需要直接更改,我可以通过打开保存的文件并查看它来轻松找到它。 var_export 似乎与 serialize 做的事情完全相同,只是它只存储了数组数据本身,而没有添加各种其他垃圾。
    【解决方案3】:

    另一个想法是将解析的数据保存为 Json、序列化(关联)数组或类似文件。这样,您就可以命名值,并且如果您在两年后再次打开该文件,您就会知道哪个值属于系统中的哪个函数。

    但同样,如果这极大地增加了您的项目的复杂性,或者它开始不再有效(因为存储的值很多),那么像其他已经推荐的那样优化数据库将是唯一的方法。

    【讨论】:

      【解决方案4】:

      在我看来,您正在尝试从页面加载到页面加载保留几个值。如果仅在 UI 中而不是在服务器端需要这,我会将数据保存在 cookie 中,但这是一个相当过时的问题解决方案,使用本地存储也应该为您解决问题。抱歉 JavaScript 解决方案而不是 PHP。示例代码:

      localStorage.setItem("attr", "value");

      alert("attr:" + localStorage.getItem("attr"));

      【讨论】:

      • 抱歉是 JavaScript 解决方案而不是 PHP... 抱歉,OP 要求的是 php 而不是 JavaScript
      • 是的,我通常将本地存储与 javascript 一起使用,但我认为 PHP 没有。
      【解决方案5】:

      可能会因忽略以下几点而被否决:

      虽然我不想使用 sql 或类似的东西

      您无需为此运行庞大的数据库系统。类似于SQLite 的东西可以让您拥有数据库的功能,而无需大量开销。 SQLite 数据库本质上是一种特定类型的文件,其中包含您配置的所有关系,但比您正在使用的平面文件结构提供了更多的灵活性。

      【讨论】:

      • 我认为你不应该投反对票,因为这个解决方案不使用常规数据库,SQLite 是一个平面文件数据库,与 mysql 等常规数据库不在同一级别,它非常有效非常适合小型应用程序。
      • 是否值得建立一个仅用于存储大约 10 个数字的数据库?
      • @Hasen 如果这些数字可以更改,因此无法编码到您的应用程序中,那么可以。您永远不知道何时可能想要存储更多信息,或以不同的方式使用它。
      猜你喜欢
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      相关资源
      最近更新 更多