我是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中的操作
(如果有人能帮我,我会很高兴的,谢谢你的时间;)
正如您提到的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,因为我想允许用户更改他们的电子邮件地址,但我想确保电子邮件地址是两个独特的和。 我正在使用数据存储区交易。这是一个代码片段: 该字段已建立索引。作为交易的一部分,有什么方法可以在实体中搜索当前用户的电子邮件地址? 没有方法,所以我无法运行这样的查询: 恐怕使用 不能保证交易内的隔离。 问题答案: 简短的回答是“否”,除非您要查询特定的实体组