提问者:小点点

用条件存储mysql中的子数组


我是PHP的初学者,我需要一些帮助来优化我巨大的代码...

我有这样的阵列:

Array
(
    [OD583091439BR] => Array
        (
            [0] => Array
                (
                    [date] => 25/11/2020
                    [hour] => 13:38
                    [location] => FLORIANOPOLIS/SC
                    [action] => Objeto entregue ao destinatário
                    [message] => Objeto entregue ao destinatário 
                    [change] => há 152 dias
                )

            [1] => Array
                (
                    [date] => 25/11/2020
                    [hour] => 11:48
                    [location] => FLORIANOPOLIS/SC
                    [action] => Objeto saiu para entrega ao destinatário
                    [message] => Objeto saiu para entrega ao destinatário 
                    [change] => há 152 dias
                )

            [2] => Array
                (
                    [date] => 24/11/2020
                    [hour] => 07:34
                    [location] => SAO JOSE / SC
                    [action] => Objeto em trânsito - por favor aguarde
                    [message] => Objeto em trânsito - por favor aguarde  de Unidade de Tratamento em SAO JOSE / SC para Unidade de Distribuição em FLORIANOPOLIS / SC
                    [change] => há 153 dias
                )

            [3] => Array
                (
                    [date] => 23/11/2020
                    [hour] => 21:14
                    [location] => PORTO ALEGRE / RS
                    [action] => Objeto em trânsito - por favor aguarde
                    [message] => Objeto em trânsito - por favor aguarde  de Unidade de Tratamento em PORTO ALEGRE / RS para Unidade de Tratamento em SAO JOSE / SC
                    [change] => há 154 dias
                )

            [4] => Array
                (
                    [date] => 23/11/2020
                    [hour] => 16:36
                    [location] => NOVO HAMBURGO / RS
                    [action] => Objeto em trânsito - por favor aguarde
                    [message] => Objeto em trânsito - por favor aguarde  de Agência dos Correios em NOVO HAMBURGO / RS para Unidade de Tratamento em PORTO ALEGRE / RS
                    [change] => há 154 dias
                )

            [5] => Array
                (
                    [date] => 23/11/2020
                    [hour] => 09:35
                    [location] => NOVO HAMBURGO/RS
                    [action] => Objeto postado
                    [message] => Objeto postado 
                    [change] => há 154 dias
                )

        )

)

实际上,我验证了数组的数量,并以此来决定是否存储在mysql中,如果不存在,我就编写存储的代码,如下所示:

$resultados = count($resultado["$objeto"]);

if ($resultados == 1) {
    $data_evento_0 = $resultado["$objeto"]['0']['date'];
    $hora_evento_0 = $resultado["$objeto"]['0']['hour'];
    $pre_localizacao_evento_0 = $resultado["$objeto"]['0']['location'];
    $localizacao_evento_0 = substr(strtolower($pre_localizacao_evento_0), 0, strlen($pre_localizacao_evento_0)-3);
    $estado_evento_0 = substr(strtoupper($pre_localizacao_evento_0), -2);
    $acao_evento_0 = $resultado["$objeto"]['0']['action'];
    $mensagem_evento_0 = $resultado["$objeto"]['0']['message'];
    $alteracao_dias_evento_0 = filter_var($resultado["$objeto"]['0']['change'], FILTER_SANITIZE_NUMBER_INT);

    $sql_verifica_0="SELECT * FROM eventos WHERE objeto='$objeto' AND posicao='0' LIMIT 1";
    $resultado_verifica_0 = mysqli_query($conn,$sql_verifica_0) or die("erro ao tentar verificar");
    $num_rows_verifica_0 = mysqli_num_rows($resultado_verifica_0);
    
    if ($num_rows_verifica_0 == 0) {
        
        $sql0 = "INSERT INTO eventos 
                        (id, objeto, data, hora, localizacao, estado, 
                        acao, mensagem, alteracao_dias, posicao) 
                VALUES (NULL, '$objeto', '$data_evento_0', '$hora_evento_0',
                        '$localizacao_evento_0', '$estado_evento_0', 
                        '$acao_evento_0', '$mensagem_evento_0', 
                        '$alteracao_dias_evento_0', '0')";
        $resultado0 = mysqli_query($conn,$sql0) or die("erro ao tentar cadastrar pedido0");
        
    }

重点是..我的代码太大了,而且我很难使用各种子数组,我试图学习whiles和foreachs来帮助我,但是我不理解使用它们的逻辑...

所以我需要计算子数组的个数,并验证个数组的结果是否存在,然后执行将其存储在mysql中的操作

(如果有人能帮我,我会很高兴的,谢谢你的时间;)


共1个答案

匿名用户

正如您提到的foreach对此很有帮助,下面是一个简单的示例:

foreach($resultado as $key => $item) {
     // following line could cause bug, look at your #1 and #2 array data, better to use explode or regexp
    // $localizacao_evento = substr(strtolower($item['location']), 0, strlen($item['location'])-3);
    // use explode as simple and safer replacement
    $location = explode('/', $item['location']);
    if(count($location != 2) { die('bad location format: '.$item['location']); /* deal with this situaction */ }
    
    $stmt = mysqli_prepare("SELECT * FROM eventos WHERE objeto=? AND posicao='0' LIMIT 1");
    $stmt->bind_parram('s', $key); // objecto
    if(!$stmt->execute()) die("erro ao tentar verificar");

    if ($stmt->num_rows) {
        
        // id removed, put primary key and auto increment column property to DB
        $stmt = mysqli_prepare("INSERT INTO eventos 
                        (objeto, data, hora, localizacao, estado, 
                        acao, mensagem, alteracao_dias, posicao) 
                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, '0')");
        
        $stmt->bind_parram('s', $key);              // objecto
        $stmt->bind_parram('s', $item['date']);     // data
        $stmt->bind_parram('s', $item['hour']);     // hora
        $stmt->bind_parram('s', $location[0]);      // localizacao
        $stmt->bind_parram('s', $location[1]);      // estado
        $stmt->bind_parram('s', $item['action']);   // acao
        $stmt->bind_parram('s', $item['message']);  // mensagem
        $stmt->bind_parram('i', filter_var($item['change'], FILTER_SANITIZE_NUMBER_INT); // alteracao_dias
        
        if(!$stmt->execute()) die("erro ao tentar cadastrar pedido0");    
    }
}

我强烈建议您使用准备好的语句来防止sql注入,并且对数据库中的列ID使用key和auto increment for ID。