Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bateraman

[Resolvido] Array + Explode + Insert

Recommended Posts

Tenho um formulário (com uma textarea - multi-linha) onde o usuário digita vários nomes (1 nome por linha)

 

 

Esse form joga para o php:

<?php
$textarea = mysql_real_escape_string($_POST['textarea']);
$array = explode("\\n", $textarea);

$i=0;
$value = trim($array[$i]);
if (!empty($value)) {
foreach ($array as $value) {
   mysql_query("INSERT INTO clientes (nome_cliente,email_cliente) VALUES ('{$array[$i]}','teste')") or die(mysql_error());
   $i++;
}
}
?>
O código acima funciona, ou seja este código está inserindo os dados assim na minha tabela clientes:

 

id | nome_cliente | email_cliente

id1 | Felipe | teste

id2 | Marcos | teste

id3 | Rivaldo | teste

 

Eu preciso então acertar esses códigos para que o cara escreva no textarea do formulário (por linha):

 

Felipe, felipe@felipe.com

marcos, marcos@marcos.com

rivaldo, rivaldo@rivaldo.com

 

e então ele insira certo no banco de dados os 2 campos.

 

id | nome_cliente | email_cliente

id1 | Felipe | felipe@felipe.com

id2 | Marcos | marcos@marcos.com

id3 | Rivaldo | rivaldo@rivaldo.com

 

 

O código está praticamente pronto, mas eu sinceramente não sei como proceder.

 

Fico no urgente aguardo.

 

Um abraço,

 

FELIPE

Compartilhar este post


Link para o post
Compartilhar em outros sites

dentro daquele foreach, use explode() em $value para separar os valores:

 

list($nome, $email) = explode(",", $value);

Pessoal,

Não consegui fazer. Valeu beraldo,

 

Segue o meu código:

 

 

<?php
$textarea = mysql_real_escape_string($_POST['textarea']);
$array = explode("\\n", $textarea);

$i=0;
$value = trim($array[$i]);
if (!empty($value)) {
foreach ($array as $value) {
	list($nome, $email) = explode(",", $value);
   mysql_query("INSERT INTO clientes (nome_cliente,email_cliente) VALUES ('{$nome[$i]}','{$email[$i]}')") or die(mysql_error());
   $i++;
}
}
?>

Dá uma olhada no meu código, eu alterei tb já o insert (que antes estava 'teste' por '{$email[$i]}')") no banco de dados. Mas tá salvando errado nos campos lá...

E agora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

$textarea = "Nome1, email1

Nome2, email2

Nome3, email3";

 

$array = explode("\n", $textarea);

 

 

foreach ($array as $value)

{

list($nome, $email) = explode(",", $value);

echo $nome . " , " . $email . "<br />";

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

$textarea = "Nome1, email1
			Nome2, email2
			Nome3, email3";

$array = explode("\n", $textarea);


foreach ($array as $value)
{
	list($nome, $email) = explode(",", $value);
	echo $nome . " , " . $email . "<br />";
}

 

Problema no output, usei teu código dessa forma:

<?php
$textarea = mysql_real_escape_string($_POST['textarea']);
$array = explode("\\n", $textarea);

foreach ($array as $value)
{
	list($nome, $email) = explode(",", $value);
	echo $nome . " , " . $email . "<br />";
}
?>

o output no browser:

 

teste , teste@teste.com\r

falando , falando@falando.com\r

titando , titando@titando.com

 

 

(está ficando com um \r esquisito no final dos registros, e o último não!)

 

Estranho...

 

Mas pra completar, eu precisava do código pra inserir nos 2 campos diferentes do meu banco. Como eu postei, eu já tava conseguindo inserir em 1, se o outro fosse estático (no caso: 'teste').

 

Como fazer esse insert no meu banco de dados nos 2 campos diferentes, rapá?

 

Grande abraço e desculpe-me a ignorância.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É que em Windows o separador de linha é \r\n, enquanto em Linux é somente \n. Pode usar \r\n no explode

 

 

Quanto ao INSERT, pode usar $nome e $email.

 

INSERT INTO tabela(nome, email) VALUES('$nome', '$email');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa Beraldo,

 

Obrigado pelos posts.

 

Entendi certinho e funfou (mesmo usando //n). Mas o problema agora é o seguinte, pois estou importando dados do yahoo, gmail etc, e geralmente os e-mails vem assim:

 

"Teste n1" <teste1@teste1.com>, "Teste 2" <teste2@teste2.com>, ...

 

Então isso estaria escrito na minha caixa de texto (textarea). Entao acho q nao é preciso o explode em linhas (/n) e sim em ','.

 

Entao isso muda um pouco meu código original.

Mas to imaginando, que pra fazer isso, seria um explode em cima de explode?

 

Necessariamente os nomes e emails virão dessa forma " " < >, " " < >, ...

cada um desses vou inserir no banco de dados, campos nome e email.

 

 

Tem como você me ajudar, pq agora estou perdido.

 

Grande abraço,

 

FELIPE

Compartilhar este post


Link para o post
Compartilhar em outros sites

uma ótima saída é usar Expressões Regulares

 

Opa Beraldo,

 

Essas expressões são o bicho mesmo haha... comecei a fazer uma caca aqui, queria que você desse uma olhada:

 

<?php

ob_start();

$textarea = mysql_real_escape_string($_POST['textarea']);
$array = explode(",", $textarea);

foreach ($array as $value) {
	list($nome, $email) = explode(',', $value);
	
	//ESSAS SAO AS LINHAS QUE EU ADICIONEI

	preg_match('/"(\w+)"/', $nome, $np);
	preg_match('/<(\w+)>/', $email, $ep);
  
  
  mysql_query("INSERT INTO clientes(nome_cliente,email_cliente,idcliente) VALUES ('$np','$ep','$idecliente')") or die(mysql_error());
   header ("Location:../home/index.php");  
   
}
?>

O problema é que tá inserindo assim no banco:

 

ID | NOME | EMAIL

1| Array | Array

 

 

Grande abraço,

 

FELIPE

Compartilhar este post


Link para o post
Compartilhar em outros sites

TO QUASE ACABANDO, preciso do último help de vcs!!!

 

 

$idcliente = $_POST['idcliente'];
$textarea = mysql_real_escape_string($_POST['textarea']);


$array = explode(',', $textarea);

foreach ($array as $value) {

// Let's perform the regex
$do = preg_match('/"(.*)\\\" <(.*)>/', $value, $matches);

mysql_query("INSERT INTO clientes (nome_cliente,email_cliente,idcliente) VALUES ('{$matches['1']}','{$matches['2']}','$idcliente')") or die(mysql_error());
 //  header ("Location:../home/index.php");  
   
}
?>

Seguinte, o código tá inserindo QUASE certinho no meu banco.

 

Os dados vêm pela textarea dessa forma:

"Felipe" <felipe@felipe.com>, "Fabio" <fabio@fabio.com>, etc...

 

 

 

Vejam o OUTPUT do banco de dados:

 

ID | Nome | Email

1 | Felipe\ | felipe@felipe.com

2 | Fabio\ | fabio@fabio.com

 

 

Essa barrinha "\" maldita (do lado do nome), não consigo tirá-la. Como eu faço? Só falta isso!

 

VALEUUU!

Compartilhar este post


Link para o post
Compartilhar em outros sites

troque \\\" por \\"

 

Opa Beraldo,

 

Entao, eu já havia tentado.

 

se eu deixo "\\" ou mesmo somente "\" dá esse erro:

 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'titi@titi.com','')' at line 1

 

 

Alguma idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma variável para conter a string da query. Dê um echo nela para ver como está saindo.

 

 

E use .*? em vez de .* nesse caso

Opa Beraldo,

 

Continua igual.

com o maldito traço do lado nome\

 

Usei também a "?" (interrogação, como você falou), mas nao mudou. Tentei algumas vertentes, com mais barras e menos barras e também não deu certo.

 

Tem mais alguma idéia?

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

falei para vocÊ dar um echo na string e postar o resultado, para ver por que o MySQL gera o erro

 

Opa, vamos lá.

 

 

Vou digitar na caixa de texto o seguinte: "Felipe" <felipe@felipe.com>

 

Seguem códigos:

 

echo $matches['1'];

$array = explode(',', $textarea2);

foreach ($array as $value) {

// Let's perform the regex
$do = preg_match('/"(.*)\" <(.*?)>/', $value, $matches);



echo $matches['1'];

RESULTADO:

Felipe\\\

 

Para echo $matches['2'];

$array = explode(',', $textarea2);

foreach ($array as $value) {

// Let's perform the regex
$do = preg_match('/"(.*)\" <(.*?)>/', $value, $matches);



echo $matches['2'];

RESULTADO:

felipe@felipe.com

 

 

Para echo $matches;

$array = explode(',', $textarea2);

foreach ($array as $value) {

// Let's perform the regex
$do = preg_match('/"(.*)\" <(.*?)>/', $value, $matches);



echo $matches;

Resultado:

Array

 

 

 

Fiz isto também em todas as tentativas: preg_match('/"(.*?)\" <(.*?)>/', $value, $matches);

Ou com mais barras invertidas: preg_match('/"(.*?)\\\" <(.*?)>/', $value, $matches);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preste atenção nas aspas que está usando e no caractere de escape.

 

Faça algo assim:

$str = '"Beraldo" <beraldo@email.com>';
preg_match('/"(.*?)"\s*<(.*?)>/', $str, $matches);
print_r($matches);

Se aparecer barra invertida, use stripslashes() no conteúdo vindo do formulário

Compartilhar este post


Link para o post
Compartilhar em outros sites

Preste atenção nas aspas que está usando e no caractere de escape.

 

Faça algo assim:

$str = '"Beraldo" <beraldo@email.com>';
preg_match('/"(.*?)"\s*<(.*?)>/', $str, $matches);
print_r($matches);

Se aparecer barra invertida, use stripslashes() no conteúdo vindo do formulário

 

BERALLLLDAOOO!! VALEU RAPÁ!! ERA ISSO MESMO!!!!

Eu acabei fazendo 2 stripslashes, pq 1 só não foi suficiente haha!

 

segue o código + gambiarra:

$textarea = mysql_real_escape_string($_POST['textarea']);
$textareastrip = stripslashes($textarea);
$textareastrip2 = stripslashes($textareastrip);

$array = explode(',', $textareastrip2);

foreach ($array as $value) {

// Let's perform the regex
$do = preg_match('/"(.*?)"\s*<(.*?)>/', $value, $matches);

print_r($matches);

Perfeito! Beraldo, muito obrigado mesmo rapá pela atenção! VALEU, sem a sua ajuda não ia rolar!!!

Parabéns ae!

Abraços e até a próxima!

 

Felipe

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.