【问题标题】:Using PHP to replace a line in a flat-file database使用 PHP 替换平面文件数据库中的一行
【发布时间】:2012-09-25 20:16:37
【问题描述】:

关于这个类似的主题有很多不同的主题,但我还没有完全理解我的问题的解决方案。

我想做的很简单,我有一个平面文件数据库,数据存储如下 -

$username:$worldLocation:$resources

问题是我想要一个提交数据 html 页面,该页面将根据使用 php 搜索术语来更新这一行

search db for - $worldLocation

if $worldLocation found

replace entire line with $username:$worldLocation:$updatedResources

我知道应该有一个相当简单的方法来完成这项工作,但我目前无法弄清楚,随着这篇文章的发布,我会继续尝试,但如果你知道我可以使用的方法,我会非常感谢您的帮助。

谢谢

【问题讨论】:

  • 像往常一样...为什么不使用真正的数据库呢?然后阅读PHP手册:php.net/filephp.net/implodephp.net/file_put_contents
  • 这听起来效率极低。
  • 这是一个非常简单的应用程序,可能只有 100 个条目。我写它是为了了解更多关于基本 php 的知识,并且想知道是否有办法完成它。这可能不是最有效的方法,但现在我只是使用 html 输入页面并使用 php 将数据写入平面文件。

标签: php replace flat-file


【解决方案1】:

我一直很喜欢 c,以及从 c 进入 php 的函数。

查看fscanf 和fprintf。

这些将使您在阅读某种格式的作品时生活更轻松。就像说:

$filehandle = fopen("file.txt", "c");
while($values = fscanf($filehandle, "%s\t%s\t%s\n")){
    list($a, $b, $c) = $values;
    // do something with a,b,c
}

此外,没有避免reading the entire file into memory -> changing one line -> writing the entire file 的性能变通方法。你必须这样做。

这是尽可能高效的。因为您很可能使用本机 c 代码,因为我读过一些在这些情况下 php 只是包装 c 函数的地方。

【讨论】:

    【解决方案2】:
    1. 你喜欢艰难的路,就这样吧....
    2. 使每行的长度相同。添加空格、制表符、大写 X 等以填补空白
    3. 当你想替换行时,找到它,因为每行都是固定长度的,你可以替换它。
    4. 为了提高速度和减少麻烦,请使用数据库(甚至 SQLLite)

    【讨论】:

    • 所以我可能应该寻找一个不同的解决方案,只学习基本的 SQL 吧?
    • @user1707616 - 它会很好地帮助你学习 SQL。如果您掌握了集合论和笛卡尔积,那并不难。
    • 我认为可能有一种方法可以使用 preg_replace 或类似的东西来完成它?
    【解决方案3】:

    如果您致力于平面文件,最简单的方法是遍历每一行,编写一个新文件并更改匹配的文件。

    是的,很糟糕。

    我强烈建议切换到“合适的”数据库。如果您担心资源或运行服务器的复杂性,可以查看 SQLite 或 Berkeley DB。这两者都使用“只是一个文件”的数据库,消除了安装和维护数据库服务器的问题,但您仍然能够快速轻松地搜索、替换和删除单个记录。如果您出于其他原因仍然需要平面文件,您可以轻松编写一些导入/导出例程。

    另一个有趣的可能性是,如果您想发挥创造力,可以将您的 文件系统 视为一个数据库。给每个用户一个目录。在每个目录中,都有一个位置文件。在每个文件中,更新资源。这意味着,要插入一行,您只需写入一个新文件。要更新文件,只需重写一个文件。删除用户只是对目录进行核对。当然,将整个内容存储到内存中会产生更多开销。

    解决问题的其他方法可能是使您的平面文件只写,因为附加到文件末尾是一个微不足道的操作。然后,您创建第二个文件,其中列出了在读取平面文件时应忽略的“死”行号。同样,您可以轻松地“X”掉现有的行(同样,这比尝试更新可能不同长度的文件中的行要容易得多)并将新数据附加到末尾。

    后两个想法并不是真正的实用解决方案,而是向您展示解决问题的方法总是不止一种。

    【讨论】:

      【解决方案4】:

      好的....经过几个小时的工作..这个例子对我来说很好...... 我打算编写一个编辑工具......并将其用于密码更新......它做到了 诡计! 此页面不仅向用户发送和发送电子邮件(对不起......地址被硬编码以避免 使用新密码发布附加代码)...但它也为 w 用户编辑条目 并在新文件中重新写入所有文件信息...... 完成后,它显然会交换文件名,将旧文件存储为 usuarios_old.txt。

      在此处获取代码(抱歉,stackoverflow 对代码发布非常挑剔)

      https://www.iot-argentina.xyz/edit_flat_databse.txt

      【讨论】:

      • 虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。
      • 不明白你的意思......我的帖子解决了这个问题......我提供了实际工作代码的链接(因为stackoverflow已经把它变得太复杂了......4个空格缩进......等等)
      • StackOverflow 不能这样工作。单独发布解决方案的链接是不可接受的。请参阅上面的链接。
      • 使用 ctrl+K 缩进代码。此外,代码中充满了非英语 cmets,这将使其无法成为英语 StackOverflow 上的有用答案。
      【解决方案5】:

      这就是你的位置吗:

      update `field` from `table` set `field to replace` = '$username:$worldlocation:$updatesResources' where `field` = '$worldLocation';
      

      【讨论】:

      • 能否将其用作 if($worldLocationInput == $worlLocation) 然后从table 更新field 设置field to replace....
      • 不幸的是,我只有一个基本的 php 课程,并且正在努力学习。请原谅我的奇怪问题。
      • 我认为可能有一种方法可以使用 preg_replace 或类似的东西来完成它?
      • 你可以加载整个文件,用preg_replace 做夹具然后写回来。比较低效。只需使用数据库,周五下午就可以休息了!
      • 如果您正在寻找平面文件数据库。只需选择一个常用字符来分隔值(如 | ),您可以逐行读取文件,在 '|' 上逐行读取用 trim() 删除多余的空白。但我建议学习基本的 SQL
      猜你喜欢
      • 2011-02-26
      • 1970-01-01
      • 2010-12-10
      • 2015-12-24
      • 2016-05-03
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多