1

我将尝试以最好的方式解释这一点。

我的数据库中存储了一组日志。我需要处理那些存储不太好的日志(以一种非常低效的方式)。

我先给你看表:

桌子

因此,value列中的这些句子需要分成可用的部分,以便我可以分别向我的用户列出适当的信息。

我需要从该列中收集的信息:

  • 行动类型(禁止、警告、踢、监禁和罚款)
  • 发出行动的人(即 Scotty)
  • 罚款金额
  • 行动的原因

有了这些收集到的信息,我需要在表格中单独向用户显示。禁令应列在一个单独的表格中,单独发出警告,依此类推。

每种情况下的表格看起来如何:

<h2>Bans</h2>
<table>
    <tr>
        <th>Issued by</th>
        <th>Time</th>
        <th>Reason</th>
    </tr>

    <tr>
        <td>THE NAME OF THE ISSUER</td>
        <td>DATE AND TIME</td>
        <td>THE REASON</td>
    </tr>
</table>

<h2>Fines</h2>
<table>
    <tr>
        <th>Issued by</th>
        <th>Time</th>
        <th>Reason</th>
        <th>Amount</th>
    </tr>

    <tr>
        <td>THE NAME OF THE ISSUER</td>
        <td>DATE AND TIME</td>
        <td>THE REASON</td>
        <td>THE AMOUNT</td>
    </tr>
</table>

禁令、警告和监狱应该具有相同的表结构,只是罚款与金额列略有不同。

我如何收集信息

好吧,我正在以一种简单的方式从数据库中获取信息,使用这种方法:

public function obtain_player_adminlog($player_id)
{
    global $samp_db;

    $player_name = $this->get_pname_by_id($player_id);

    $sql = "SELECT * FROM adminlog 
        WHERE value LIKE '%" . $player_name . "%'";
    $result = $samp_db->sql_query($sql);

    return $samp_db->sql_fetchrowset($result);
}

我知道这个功能不是万无一失的功能,但这是我能得到的最好的。查询中使用的方法来自与问题无关的 phpBB DBAL。

包含此数据的返回数组如下所示:

Array
(
    [0] => Array
        (
            [entryID] => 5
            [value] => AdmWarn: {FFFFFF}Scott_Parker has unbanned player Dave_Meniketti.
            [entryTime] => 2013-10-24 00:49:56
            [tickcount] => 4577394
        )

    [1] => Array
        (
            [entryID] => 11
            [value] => Fine: Scott_Parker has been fined $25039 by Scotty, reason: test test
            [entryTime] => 2013-10-24 00:52:02
            [tickcount] => 4703416
        )

    [2] => Array
        (
            [entryID] => 12
            [value] => Ban: Scott_Parker has been banned, reason: Third warning (last from Scott_Parker)
            [entryTime] => 2013-10-24 00:52:11
            [tickcount] => 4712439
        )

)

总结一下

  1. LIKE我需要一种万无一失的方法来从数据库中获取信息,因为如果名称重复两次(即。Array[2])很容易被 MySQL 子句愚弄。
  2. 我需要一种方法来根据操作拆分信息并将其列在不同的表上。

对我来说,这看起来是一项非常复杂的任务,我想不出办法来解决这个问题。几天来,我一直在思考如何实现这一目标——没有运气。

任何帮助将不胜感激。

4

1 回答 1

1

从你所说的,我只会使用正则表达式!我将引导您完成这些部分,但您应该真正考虑更多地了解它们

  1. 首先,我们应该使用第一个单词来分解列表(.+?):preg_match("/^(.+?):/", $input_line, $output_array)会给你一个数组,其中第二个值是你的第一个单词。
  2. 然后你将它放入switch基于第一个单词的语句中,引导它进行进一步处理。
  3. 然后根据表达式制作正则表达式。如果没问题(我选择这个是因为它看起来最复杂),你会做这样的事情:preg_match("/^.+?: (.+?) has been fined (\$\d+) by (.+?), reason: (.+)$/", $input_line, $output_array). 这会给你一个看起来像这样的数组:([0] => Fine: Scott_Parker has been fined $25039 by Scotty, reason: test test, [1] => Scott_Parker, [2] => $25039, [3] => Scotty, [4] => test test出于某种原因,SO 不喜欢这个作为普通代码)。
  4. 您可以使用 将您的数组按类型转储到父数组中array_push,然后您只需循环使用它们foreach即可生成您的页面!
  5. 您实际上可以只处理在该开关中生成 html。既然你知道即将出现的数组,那就让你的模板发生。因此,对于 #3 中的示例(以及您的评论),您可以执行类似$fineHTML = <tr><td><?=fineArray[3]?></td><td><?=fineArray[5]?></td><td><?=fineArray[4]?></td><td><?=fineArray[2]?></td></tr>. 然后你只需推$fineHTML送到一个数组,然后循环foreach显示在页面上。

另外对于您的 MySQL 问题,您也可以在那里使用正则表达式

于 2013-10-28T15:02:24.143 回答