gpt4 book ai didi

PHP - 当行不一致时如何从文本文件插入 MySQL 中的行

转载 作者:可可西里 更新时间:2023-11-01 08:52:13 24 4
gpt4 key购买 nike

我有一个代理应用程序,它在一个文本文件中生成日志文件,该文件的行与行之间不一致。根据该行报告的内容,某些数据可能存在或缺失。这是一个例子:

2012-08-05 10:48:59 Login.Failure   [ip address]    12312191391921
2012-08-05 10:49:05 Login.Success [ip address] 19919292912912 IQi8CaVGiXoPXGy
2012-08-05 12:50:57 Logout 19919292912912 IQi8CaVGiXoPXGy Expired

有七个可能的值,但如您所见,它们并非始终都存在。

我想在数据库中输入这些值,以便创建统计信息。到目前为止,我猜我需要查看位置 2 (0,1,2) 的数组,如果它与某个字符串匹配,则只期望 these 项目在那里,如果它匹配另一个字符串,只需要这些项,等等。

到目前为止,我的想法已经到了中断数组并根据找到的值添加新条件的地步。这行不通,我知道,但这是我的想法:

$output = explode("\n", $output);
foreach($output as $var) {
$tmp = explode(" ", $var);
$dateentered = $tmp[0];
$timeentered = $tmp[1];
$event = $tmp[3];

if $tmp[3]="Login.Failure" then

$IP = $tmp[4];
$username = $tmp[5];

$connection = mysql_connect("localhost", "user", "pass") or die('unable to connect');

mysql_select_db('dbname') or die('unable to select database');

$sql = "INSERT INTO table SET dateentered='$dateentered', timeentered='$timeentered', event='$event', IP ='$IP ', username='$username'";

$result=mysql_query($sql,$connection) or die('Error in query: $query. ' .mysql_error());


else if $tmp[3]="Login.Success" then

$IP = $tmp[4];
$username = $tmp[5];
$session = $tmp[6];

……等等……

我希望能够提取所有成功的数据并对其求和,然后对失败的数据进行同样的计算,依此类推。

你会如何处理这个问题?如果有人只是对合理的工作流程有想法,我可以从那里开始构建。我显然只是一个初学者,尽管我确实有好几页。

感谢所有回复。

最佳答案

为什么你的数据库结构不是这样的:

2012-08-05 10:48:59 Login.Failure   [ip address]    12312191391921  NULL            NULL
2012-08-05 10:49:05 Login.Success [ip address] 19919292912912 IQi8CaVGiXoPXGy NULL
2012-08-05 12:50:57 Logout NULL 19919292912912 IQi8CaVGiXoPXGy Expired

或者像这样:

2012-08-05 10:48:59 Login.Failure   [ip address]    12312191391921  ""              ""
2012-08-05 10:49:05 Login.Success [ip address] 19919292912912 IQi8CaVGiXoPXGy ""
2012-08-05 12:50:57 Logout "" 19919292912912 IQi8CaVGiXoPXGy Expired

应优先维护正确列中的正确数据,或者更确切地说,维护同一列中的关联数据。

为了解决您的代码问题,我相信这个解决方案会奏效:

$output;                            // data gotten from file
$connection = mysql_connect("localhost", "user", "pass")
or die('unable to connect'); // connect to DB
mysql_select_db('dbname') // select DB
or die('unable to select database');
$output = explode("\n", $output); // tokenize input by lines
for($i=0; $i<count($output); $i++) {// for each line
$tmp = explode(" ", $output[i]); // tokenize lines by spaces
$dateentered = $tmp[0]; // set required data
$timeentered = $tmp[1]; // set required data
$event = $tmp[3]; //i think this should be [2]
$IP = ""; // set default value of possible data
$username = ""; // set default value of possible data
$session = ""; // set default value of possible data
$expired = ""; // set default value of possible data

if ($event=="Login.Failure") {
$IP = $tmp[4]; //i think this should be [3]
$username = $tmp[5]; //i think this should be [4]
}
else if ($event=="Login.Success") {
$IP = $tmp[4]; //i think this should be [3]
$username = $tmp[5]; //i think this should be [4]
$session = $tmp[6]; //i think this should be [5]
}
else if ($event=="Logout") {
$username = $tmp[5]; //i think this should be [4]
$session = $tmp[6]; //i think this should be [5]
$expired = $tmp[7]; //i think this should be [6]
}
/*
* Update DB:
*/
$sql = "INSERT INTO table SET "
."dateentered='$dateentered', "
."timeentered='$timeentered', "
."event='$event', "
."IP ='$IP', "
."username='$username', "
."session='$session', "
."expired='$expired'";
$result=mysql_query($sql,$connection)
or die('Error in query: $query. ' .mysql_error()
.'\n\nWhile Processing line $i');
} // closing brace of for loop
mysql_close($connection); // close connection to DB

关于您的代码的问题:

  • 哪里/什么是$tmp[2];我认为您的索引可能会减少 1

另外请务必检查我的代码以确保它的行为符合您的预期,以便将其盲目插入您的数据库。我想我正确地解释了您的问题并提供了一个有效的解决方案,但只有您可以确定。

关于PHP - 当行不一致时如何从文本文件插入 MySQL 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11855085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com