Php 从字符串解析数据行并插入数据库
如果这是一个超凡脱俗的问题,我是新来道歉的。我正在tcp/ip套接字上接收动态长度的数据包。数据包如下所示:Php 从字符串解析数据行并插入数据库,php,regex,sql-insert,explode,preg-split,Php,Regex,Sql Insert,Explode,Preg Split,如果这是一个超凡脱俗的问题,我是新来道歉的。我正在tcp/ip套接字上接收动态长度的数据包。数据包如下所示: Palace1,radio,location1,location2,location3,location4,GSMId:Palace2,radio,location1,location2,location3,location4,GSMId:Palace3,radio,location1,location2,location3,location4,GSMId 您可以在GSMId之后看到我
Palace1,radio,location1,location2,location3,location4,GSMId:Palace2,radio,location1,location2,location3,location4,GSMId:Palace3,radio,location1,location2,location3,location4,GSMId
您可以在GSMId
之后看到我有一个冒号来分隔一个报告。包的长度可以是任意长度
我的任务是在每个冒号(:)后切掉这个数据包,并将每个报告保存到数据库中
现在我要做的是切掉每一个包:
$string = "Palace1,radio,location1,location2,location3,location4,GSMId:Palace2,radio,location1,location2,location3,location4,GSMId:Palace3,radio,location1,location2,location3,location4,GSMId";
$countString = substr_count($string, ":");
$NumberOfReports = $countString + 1;
echo $NumberOfReports."\n";
echo $countString."\n";
$chopPacket = explode(':' , $string);
foreach($chopPacket as $value)
{
$Report = $value;
echo $Report."\n";
writeToDataBase($Report);
}
数据库代码:
function writeToDataBase($Report)
{
date_default_timezone_set("Europe/London");
$date = date('Y-m-d H:i:s');
$counter = 0;
$DecodingData = explode("," , $Report);
if ($DecodingData > 0) {
$username = "user";
$password = "password";
$host = "localhost";
$connector = @mysql_connect($host, $username, $password) or die("Unable to connect");
$selected = @mysql_select_db("gsmdb", $connector) or die("Unable to connect");
$importSQL = "INSERT INTO gsmclient_test VALUES('".$counter."','".$DecodingData[0]."','".$DecodingData[1]."','".$DecodingData[2]."','".$DecodingData[3]."','".$DecodingData[4]."', '".$DecodingData[5]."','".$DecodingData[6]."','".$date."')";
mysql_query($importSQL) or die(mysql_error());
mysql_close($connector);
}
}
上面的代码只保存数据库中的第一个报告。您需要执行两个单独的步骤来准备数据 使用一条准备好的语句来确保您的查询是稳定和安全的 这里有一个比较 我不喜欢那个
$计数器的外观。数据库的行标识符应为自动递增主键,date
列的默认值应为CURRENT\u TIMESTAMP
,以便在插入查询期间不需要声明该列
我不知道你的列名是什么,所以我无法将它们添加到我的sql中
我们不应该再看到mysql\uu
函数;使用mysqli\uu
或pdo函数
代码:
你的数据库代码在哪里?一般来说,您的代码是正确的,您必须将插入foreach
循环。请查看代码。我正在为另一个文件中的数据库使用单独的函数。通常可以,只需在函数中执行if(count($DecodingData)>0)
,因为这是explode()之后的数组。还有一个建议-开始使用mysqli_*函数而不是mysql_*还有一件事-$counter
变量的用途是什么?每次调用该函数时,该值都将为0,因此您将尝试插入具有此0的每条记录。如果这是数据库中唯一的rowID,则将其设置为自动增量并从SQL查询中删除,或者在PHP脚本中设置为全局变量。最有可能的问题是,应该删除的内容列表从数据库代码开始<代码>mysql*
函数在当前版本的PHP中不存在,并且在5年前就被弃用了。别用了。
$string = "Palace1,radio,location1,location2,location3,location4,GSMId:Palace2,radio,location1,location2,location3,location4,GSMId:Palace3,radio,location1,location2,location3,location4,GSMId";
$stmt = $mysqli->prepare("INSERT INTO gsmclient_test VALUES(?,?,?,?,?,?)";
$stmt->bind_param('ssssss', $pal, $rad, $loc1, $loc2, $loc3, $loc4);
foreach (preg_split('/,GSMId:?/', $string, -1, PREG_SPLIT_NO_EMPTY) as $rowString) {
[$pal, $rad, $loc1, $loc2, $loc3, $loc4] = explode(',', $rowString, 6);
$stmt->execute();
}