当前位置: 首页 > 知识库问答 >
问题:

用条件存储mysql中的子数组

宋涵忍
2023-03-14

我是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个答案

阎德业
2023-03-14

正如您提到的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。

 类似资料:
  • 问题内容: 我有一个带参数的SQL Server 2005存储proc :。 我想根据此参数控制一个子句。 我想获取所有项目(不包括where子句),何时。否则,请包含where子句。 问题答案:

  • 问题内容: 我正在尝试制作一个可为特定类别递归构建路径的函数 当我尝试使用没有父项的类别(parent_id = 0)运行此函数时,它可以正常工作,但是当我尝试使用parent_id> 0的类别时,我得到1424递归存储的函数和触发器是不允许的。 我该如何解决?我将在常规的Web托管服务上托管此代码,该服务至少应具有MySQL服务器版本5.1。 在Ike Walker的帮助下,我做了一个程序,但是

  • 存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。存储函数可以通过 return 语句返回函数值,主要用于计算并返回一个值。而存储过程没有直接返回值,主要用于执行操作。 在 MySQL 中,使用 CREATE FUNCTION 语句来创建存储函数,其语法形式如下: CREATE FUNCTION sp_name ([func_parameter[...]]) RETURNS ty

  • 问题内容: 我在MySQL中有两个表。表人具有以下列: 该列可以包含null或字符串数​​组,例如(’apple’,’orange’,’banana’)或(’strawberry’)等。第二个表是Table Fruit,具有以下三列: 那么,我应该如何设计第一个表中的列,以便它可以容纳从第二个表中的列获取值的字符串数组?由于MySQL中没有数组数据类型,该怎么办? 问题答案: 正确的方法是在查询中

  • 我在MySQL中有两个表。Table Person具有以下列: 水果列可以包含null或字符串数组,如('apple','orange','banana')或('草莓')等。第二个表是水果表,有以下三列: 那么,我应该如何设计第一个表中的水果列,以便它可以容纳从第二个表中的水果名称列获取值的字符串数组?既然MySQL中没有数组数据类型,我应该怎么做?

  • 问题内容: 我有一个包含字段的实体。该实体ID是ULID,因为我想允许用户更改他们的电子邮件地址,但我想确保电子邮件地址是两个独特的和。 我正在使用数据存储区交易。这是一个代码片段: 该字段已建立索引。作为交易的一部分,有什么方法可以在实体中搜索当前用户的电子邮件地址? 没有方法,所以我无法运行这样的查询: 恐怕使用 不能保证交易内的隔离。 问题答案: 简短的回答是“否”,除非您要查询特定的实体组