Jump to content

Erro em Array


Labroskas
 Share

Recommended Posts

Boas, tenho um pequeno código onde estou a ir buscar valores a um ficheiro de texto para gravar numa tabela,mas estou a ter problemas e já perdi imenso tempo nisto em vão, vou mostrar o código para vocês verem:

<?php

$chemin = "D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt";

$ponteiro = fopen ($chemin, "r");

$strtxt = "";

while (false !== ($char = fgetc($ponteiro)))

{

if ($char == ";")

{

if ($i == 1)

{

$valor[$i] = $strtxt;

//Aqui vou meter o INSERT para a Tabela

echo $valor[0]."-->".$valor[1]."<br>";

$strtxt = "";

}

else

{

$valor[$i] = $strtxt;

echo $valor[$i]."-->".$i." SS"."<br>";

$strtxt = "";

$i++;

}

}

else

{

$strtxt = $strtxt.$char;

}

}

fclose ($ponteiro);

?>

/*AQUI ESTÁ O FORMATO DO FICHEIRO*/

01;Aveiro

02;Beja

03;Braga

04;Bragança

05;Castelo Branco

06;Coimbra

07;Évora

08;Faro

09;Guarda

/*APAREÇE ASSIM*/

01-->2 SS

Aveiro 02-->3 SS

Beja 03-->4 SS

Braga 04-->5 SS

Bragan�a 05-->6 SS

Castelo Branco 06-->7 SS

Coimbra 07-->8 SS

Nota:

A minha ideia é ir buscar linha a linha, e depois separar os valores que estão delimitados com " ; ", para poder gravar na tabela, o Codigo = Valor[0] e a Designacao = Valor[1]

Uma ajudinha era 5 estrelas, cumps

Link to comment
Share on other sites

Já, e já vi que não dá erro, foi lapso, mas tenho igual problema em depois extrair os valores dos campos

aparece assim:

Array ( [0] => Array ( [0] => 01 [1] => Aveiro ) [1] => Array ( [0] => 02 [1] => Beja ) [2] => Array ( [0] => 03 [1] => Braga ) [3]

)

Como faço para extrair os dois campos que necessito

INSERT INTO TblXPTO (Codigo, Designacao) VALUES ( ?, ?)

Sou um pouco leigo na matéria ainda 😞

Link to comment
Share on other sites

$content = file("D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt"));
array_walk($content, function(&$item) { $item = "('".str_replace(";", "','", $item)."')"; });
$sql = "insert into TblXPTO (Codigo, Designacao) values ".implode(",", $content);

echo $sql;
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Porreiro, só mais uma pergunta, se for possivel responder, e se tiver por ex, uma estrutura do TXT com 4 campos (01;Aveiro;;Rua X), mas a tabela só tem três campos e só kero gravar INSERT INTO TblXPTO (Codigo, Designacao, Rua) VALUES ( 01, Aveiro, Rua X), hà maneira de resolver, eu tou a tentar perceber, para o caso de me surgir essa situação, até pq vai surgir.

Nota: Tem um parenteses a mais aqui

"$content = file("D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt"));"

daí eu tar com um erro ao início.

Cumps

Link to comment
Share on other sites

$content = file("D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt");
array_walk($content, function(&$item) {
 $item = explode(";", $item);
 unset($item[2]);
 $item = "('".implode("','", $item)."')";
});
$sql = "insert into TblXPTO (Codigo, Designacao, Rua) values ".implode(",", $content);

echo $sql;
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Funcionou HappyHippyHippo, mas temo que não consiga em alguns ficheiros, porque por exemplo kero fazer uma comparação na tabela a ver se existe e assim não consigo com esta maneira de fazer tudo apenas num INSERT, e depois o outro problema é que posso ter campos no TXT vazios ex:

TXT: (01;Aveiro;;Rua X)

QUERY: INSERT INTO TblXPTO (Codigo, Designacao, Rua) VALUES ( 01, Aveiro, Rua X)

TXT: (02;Viseu;;)

QUERY: INSERT INTO TblXPTO (Codigo, Designacao, Rua) VALUES ( 02, Viseu)

O segundo INSERT vai dar erro pq só traz dois registos para três campos 😞

Link to comment
Share on other sites

... tens a noção que não estas a dar toda a informação da tabela destino e, portanto, as respostas são, quanto muito, limitadas ao espectro do problema apresentado : minimalista.

$content = file("D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt");
array_walk($content, function(&$item) {
 $item = explode(";", $item);
 $item = "(".implode(",", ($item == "" ? "null", "'$item'")).")";
});
$sql = "insert into TblXPTO (Codigo, Designacao, Rua) values ".implode(",", $content);

echo $sql;

nota : o número de campos no ficheiro (número de ; por linha +1) tem de ser exactamente igual ao número de campos declarados no sql (e pela mesma ordem que ...)

Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

$content = file("D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt");
array_walk($content, function(&$item) {
 $item = explode(";", $item);
 $item = "(".implode(",", ($item == "" ? "null" : "'$item'")).")";
});
$sql = "insert into TblXPTO (Codigo, Designacao, Rua) values ".implode(",", $content);

echo $sql;

código corrigido

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Tenho a noção que tou a ser chato, mas o comando continua a não funcionar assim:

$item = "(".implode(",", ($item == "" ? "null" : "'$item'")).")";

ERROS:

Notice

: Array to string conversion in

D:\Xampp\htdocs\xampp\Final_SupneT\mod_gerais\ger_codpost.php

on line

166

Warning

: implode(): Invalid arguments passed in

D:\Xampp\htdocs\xampp\Final_SupneT\mod_gerais\ger_codpost.php

on line

166

Eu fiz testes com a linha assim:

$item = "(".implode(",", ($item == "" ? "null" : $item)).")";

ele mostra o INSERT, mas nos campos vazios faz

(04,Braga, ), (05,Lisboa, )....

Link to comment
Share on other sites

ups ... é o que dá fazer código sem pensar ...

$content = file("D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt");
array_walk($content, function(&$record) {
 $record = explode(";", $record);
 array_walk($record, function(&$field) { $field == "" ? "null", "'$field'"; });
 $item = "(".implode(",", $record.")";
});
$sql = "insert into TblXPTO (Codigo, Designacao, Rua) values ".implode(",", $content);

echo $sql;
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Boas, apenas corrigi duas linhas k tavam a dar erro:

array_walk($record, function(&$field) { $field == "" ? "null", "'$field'"; });

$item = "(".implode(",", $record.")";

Alterei o virgula e meti os dois pontos na 1ª linha, na segunda meti um parenteses:

array_walk($record, function(&$field) { $field == "" ? "null" : "'$field'"; });

$item = "(".implode(",", $record).")";

Tenho apenas este código:

$content = file("D:\\Xampp\\htdocs\\xampp\\Final\\distritos.txt");

array_walk($content, function(&$record) {

$record = explode(";", $record);

array_walk($record, function(&$field) { $field == "" ? "null": "'$field'"; });

$item = "(".implode(",", $record).")";

});

$sql = "insert into TblXPTO (Codigo, Designacao, Rua) values ".implode(",", $content);

echo $sql;

Cumps, e obrigado.

Link to comment
Share on other sites

a linha que apresentas não apresenta nenhuma possibilidade de dar o erro apresentado

olha bem para o que a linha de código espera :

// $sql = [string]<sql> . [string]implode([string]<",">, [array]<$contant>);
$sql = "insert into TblXPTO (Codigo, Designacao, Rua) values ".implode(",", $content);

como vês, todo o que é esperado (o que se encontra dentro dos []) é dado no código como dados válidos:

- <sql> é uma string

- o resultado da função implode é uma string

- o primeiro parâmetro da função implode é uma string

- o segundo parâmetro da função implode é previsível ser um array, no entanto se o erro fosse ai, a mensagem de erro seria o inverso (X to array conversion)

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.