Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从字符串解析数据行并插入数据库_Php_Regex_Sql Insert_Explode_Preg Split - Fatal编程技术网

Php 从字符串解析数据行并插入数据库

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之后看到我

如果这是一个超凡脱俗的问题,我是新来道歉的。我正在tcp/ip套接字上接收动态长度的数据包。数据包如下所示:

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();
}