Ir para conteúdo

POWERED BY:

Arquivado

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

girotto000

variável definida como 'null' ocupando espaço?

Recommended Posts

Boa tarde. Estou com um problem estranho no meu PHP

Eu tenho uma textarea em meu formulário, e no meu PHP, eu executei o código que caso essa área não fosse preenchida, ele atribuiria a tag NULL a ela.

Porém, no resultado final, o local onde está esta textarea, parece ter um conteúdo invisível, pois não tem nada, mas o espaço caso algo fosse digitado existe!

Alguém sabe como ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se entendi bem, não tem nada a ver com PHP, o que está acontecendo é que no momento em que você define as tags você deixa espaços entre elas.. por exemplo:

<textarea>

</textarea>

Mesmo que não haja nenhum texto esses espaços entre a abertura e o fechamento da tag é interpretado como valor. Portanto ela deve estar assim:

<textarea></textarea>

Se necessário atribuir algum valor a ela:

<textarea><?php echo $var ?></textarea>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, vou mostrar parte do código para ficar mais simples

 

 

[tag]
' . $servers1 . '
' . $links . '
' . $servers2 . '
' . $links2 . '
' . $servers3 . '
' . $links3 . '
' . $servers4 . '
' . $links4 . '[/tag]
Então, no código acima, as únicas variáveis obrigatórias são as variáveis $servers1 e $links. As outras são opcionais para o membro preencher.
Então, nas outras eu usei o seguinte código:

if(empty($_POST['links2'])) {
$links2 = null;
}
else {
$links2 = '[tag]' . $links2 . '[/tag]';
}

Ou seja, para quando elas estiverem vazias, atribuir a variavel null a elas, para ficarem sem valor
Porém, quando eu preencho somente os dois primeiros campos que são obrigatórios e deixo os opcionais em branco, acontece isso:

[tag]
Valor da variavel $servers1
Valor da variavel $links
[/tag]

 

Entende? Não aparece valor nenhum, mas o espaço da variável está ali!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quem será que teve a "brilhante" idéia de definir que um <TEXTAREA> teria uma contraparte </TEXTAREA> e que a atribuição de valores à eles seria feita dentro desses pares ao invés de pelo atributo value como todos os outros elementos de formulário? JyaXRwW.gif

[EDIT]

O seu problema é que da forma como você está concatenando as variáveis, digo, separando tudo pelo caractere invísivel de nova linha (\n, \r ou ambos), ao atribuir como valor do <TEXTAREA> eles são mantidos.

Agora, se você fizer tudo numa linha só:

$str = '[tag]' . $servers1 . '' . $links . '' . $servers2 . '' . $links2 . '' . $servers3 . '' . $links3 . '' . $servers4 . '' . $links4 . '[/tag]';

Tanto visualizando essa string num var_dump() quanto usando ela num <TEXTAREA> vai ficar do jeito que você espera.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Me perdi nessa parte:

 

Tanto visualizando essa string num var_dump() quanto usando ela num <TEXTAREA> vai ficar do jeito que você espera.

 

Adicionando as variáveis uma ao lado da outra, até o momento, fez os valores ficarem uns ao lado dos outros. Qual o próximo passo além de manter as variáveis uma ao lado da outra?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quem será que teve a "brilhante" idéia de definir que um <TEXTAREA> teria uma contraparte </TEXTAREA> e que a atribuição de valores à eles seria feita dentro desses pares ao invés de pelo atributo value como todos os outros elementos de formulário? JyaXRwW.gif

Bruno sempre que uso essa m**da penso nisso, seria tão mais fácil definir os valores dentro de um atributo e poder usar delimitadores (") pra isso.. :closedeyes:

<input type="textarea" value="muito melhor">

Já bastaria.

 

 

@girotto000, confesso que li, reli, li de novo e acho que quem está perdido no que você disse sou eu :huh:

Me perdi nessa parte:

 

Tanto visualizando essa string num var_dump() quanto usando ela num <TEXTAREA> vai ficar do jeito que você espera.

Você conferiu o que eu disse no post #4? Você disse que debugou o valor do textarea com um var_dump() o que foi mostrado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno sempre que uso essa m**da penso nisso, seria tão mais fácil definir os valores dentro de um atributo e poder usar delimitadores (") pra isso.. :closedeyes:

<input type="textarea" value="muito melhor">

Já bastaria.

 

 

@girotto000, confesso que li, reli, li de novo e acho que quem está perdido no que você disse sou eu :huh:

Você conferiu o que eu disse no post #4? Você disse que debugou o valor do textarea com um var_dump() o que foi mostrado?

 

Então, eu li o seu post, e a minha textarea está como você mesmo disse:

 

 

<textarea>conteudo</textarea>

 

Sem espaço nenhum..

 

Quanto ao comentário do Bruno, eu entendi a parte de alinhar as variáveis umas ao lado das outras, mas isso só faz com que os valores também fiquem uns ao lado dos outros, e não um abaixo do outro, como deveria ser.

Eu não sei o que é var_dump() por isso me perdi.

 

OBS: vale lembrar, que esse código das variáveis, está dentro de uma variável maior que será postada na textarea:

 

 

$VARIAVELMAIOR='[tag]
' . $servers1 . '
' . $links . '
' . $servers2 . '
' . $links2 . '
' . $servers3 . '
' . $links3 . '
' . $servers4 . '
' . $links4 . '
[/tag]';

 

Então na textarea eu chamo:

 

 

<textarea>$VARIAVELMAIOR</textarea>

Compartilhar este post


Link para o post
Compartilhar em outros sites

@girotto000, confesso que li, reli, li de novo e acho que quem está perdido no que você disse sou eu :huh:

Sorry, a janela estava aberta aqui e não tinha carregado o post do Bruno editado, portanto não tinha visto ^_^

 

O Bruno disse certo, é que há um "\n", "\r\n" ou "\r" aí quando você faz:

$str = '
valor
';

Na verdade literal isso estaria assim:

$str = "\nvalor\n";

Então o caso sua variável não contenha um valor como neste caso:

$var = null;

$str = "
" . $var;

O \n estará ali presente, pois você está concatenando-o mesmo que não esteja visível para você.

 

No caso, você quer que haja quebra de linha no seu textearea somente quando houver um valor para a variável, então você poderia fazer assim:

$var = null;

if (!empty($_POST['my_textarea'])) {
    $var = sprintf("[tag]%s[/tag]\n", $_POST['my_textarea']);
}

Ou simplesmente concatenar o \n ao final do texto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faltou complementar um pouco mais o outro post. O que eu editei pra responder resolve o problema de estar havendo espaço mesmo que a variável seja nula. Ponto!

Agora pra você criar uma variável com os valores separados por uma nova linha apenas se houver valor:

Servidor
Valor
Servidor
Valor

Muito mais fácil seria você ao invés de setar o valor como nulo caso não haja valor, concatenar uma nova variável direto. E como eu imagino que servidor e link sejam pares de informações, uma verificação pelos dois, em conjunto, seria mais adequado:

$var = NULL;
 
if( ! empty( $_POST['servers1'] ) && ! empty( $_POST['link1'] ) ) {
 
    if( ! is_null( $var ) ) {
 
        $var .= "\n";
    }
 
    $var .= $_POST['servers1'] . "\n" . $_POST['link1']
}

Apesar de mais fácil, não é a melhor opção. Trabalhando com arrays você faria isso de forma muito mais bacana.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Bruno e Marcielo, testei os códigos que os dois postaram.

 

Substitui:

 

if(empty($_POST['links2'])) {
$links2 = null;
}
else {
$links2 = '[tag]' . $links2 . '[/tag]';
}

 

Por:

 

if( ! empty( $_POST['servers2'] ) && ! empty( $_POST['links2'] ) ) {
 
    if( ! is_null( $nulo ) ) {
 
        $nulo .= "\n";
    }
 
    $nulo .= $_POST['servers2'] . "\n" . $_POST['links2'];
}

 

E obtive o mesmo resultado! Mesmo sem nenhum valor, o espaço da variavel está ali...

Uma coisa eu não entendi. O \n não é usado justamente para dar este espaço? então porque estamos trabalhando com ele se queremos o contrário?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá... Eu não havia testado quando escrevi, mas ainda assim, está funcionando:

$var = NULL;
 
$servers1 = 'Server 1';
$links1 = 'Link 1';
$servers2 = 'Server 2';
$links2 = 'Link 2';
 
if( ! empty( $servers1 ) && ! empty( $links1 ) ) {
 
    if( ! is_null( $var ) ) {
 
        $var .= "\n";
    }
 
    $var .= $servers1 . "\n" . $links1;
}
 
if( ! empty( $servers2 ) && ! empty( $links2 ) ) {
 
    if( ! is_null( $var ) ) {
 
        $var .= "\n";
    }
 
    $var .= $servers2 . "\n" . $links2;
}
 
var_dump( $var );

Saída:

string 'Server 1
Link 1
Server 2
Link 2' (length=31)

Se eu deixar $servers1 e $links1 vazios:

string 'Server 2
Link 2' (length=15)

Porém, eu testei com variáveis simples, sem interação com um formulário. Sendo assim, poste o seu formulário e nos diga se há alguma coisa antes desse código que possa estar afetando o resultado.

 

Sobre a estar usando o \n quando o objetivo é não ter as linhas em branco, perceba que existe uma condição maior que só concatenará à variável se os campos não estiverem vazios, assim os dados ficam um embaixo do outro como me pareceu ser o que procura, mas sem espaços em branco entre eles.

 

Lembrando também que empty() considera algumas possibilidades para que numa condição retorne TRUE, porém nenhuma delas considera, or exemplo, um espaço em branco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

aplicativo.hmtl

 

 

 

<html>
<body>
<form method="post" action="aplicativo.php" target="popup">
        <td height="23" colspan="2"><strong>Servidor:</strong>
 <input type='radio' name="servers1" value="1"> 
opcap1
          <input type='radio' name="servers1" value="2"> 
opcao2  
          <input type='radio' name="servers1" value="3">
  opcao3
    </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          Links:<br />
            <textarea name="links" id="links" cols="45" rows="5"/></textarea>   
            <span class="r">*</span></p></div>
       </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          <h3>2º Mirror</h3>
        </div></td>
      </tr>
      <tr>
        <td height="23" colspan="2"><strong>Servidor:</strong>
 <input type='radio' name="servers2" value="11"> 
opcap11
          <input type='radio' name="servers2" value="22"> 
opcao22
          <input type='radio' name="servers2" value="33">
  opcao33
    </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          Links:<br />
            <textarea name="links2" id="links2" cols="45" rows="5"></textarea></p></div>
       </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          <input type="submit" name="button" id="button" value="Gerar Codigo" />
        </div></td>
      </tr>
    </table></td>
  </tr>
  </table>
</form>
</body>
</html>

 

 

 

aplicativo.php

 

 

 

<?php
$servers1 = isset($_POST['servers1']) ? $_POST['servers1'] : '';
$servers2 = isset($_POST['servers2']) ? $_POST['servers2'] : '';
$links = $_POST['links'];
$links2 = $_POST['links2'];
$var = null;
 
if( ! isset( $servers1 ) && ! empty( $links ) ) {
 
    if( ! is_null( $var ) ) {
 
        $var .= "\n";
    }
 
    $var .= $servers1 . "\n" . $links;
}
 
if( ! isset( $servers2 ) && ! empty( $links2 ) ) {
 
    if( ! is_null( $var ) ) {
 
        $var .= "\n";
    }
 
    $var .= $servers2 . "\n" . $links2;
}
 
var_dump( $var );
$bbcode='
' . $servers1 . '
' . $links . '
' . $servers2 . '
' . $links2 . '[/quadrado][/center]';
//CONFIGURAÇÕES DA MENSAGEM DE RESPOSTA
echo "<textarea rows='23' cols='100' readonly='readonly'>$bbcode</textarea>";
?>

 

 

 

Simplifiquei ao máximo o sistema do formulário e continua com o problema!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu troquei o isset() dos dois últimos IFs por empty() como eu havia descrito nos posts #11 e #13 e testei deixando os dados do primeiro grupo de informações sem preencher e funcionou, o var_dump() retornou:

string '22
http://localhost/test2.html'>http://localhost/test2.html
http://localhost/test2.html'>http://localhost/test2.html
http://localhost/test2.html'>http://localhost/test2.html' (length=88)

Já o echo dentro do <textarea> continuou bagunçado, mas também você usou outra variável que não o $var que estava limpo e estruurado do jeito certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno eu estou tentando de tudo aqui mas não consigo o mesmo resultado que você!

Tu testou os arquivos que eu postei? Eu estruturei eles da maneira que você me guiou e retorna com espaço em branco...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sou um cara tão bacana que até iniciei o Apache pra testar (coisa que não fazia há dias :P)

Mas sim, copiei os arquivos e testei. Mas, como eu disse, eu troquei isso:

if( ! isset( $servers1 ) && ! empty( $links ) ) {

Por isso:

if( ! empty( $servers1 ) && ! empty( $links ) ) {

Deixa eu explicar o porquê. Quando você faz:

$servers1 = isset($_POST['servers1']) ? $_POST['servers1'] : '';

Você define que caso o valor de $_POST não esteja presente a variável seja vazia. Porém, mesmo vazia, ela está setada, ou seja, ela existe de uma forma ou de outra.

Quando você repete o isset() no IF debaixo, mas como o sinal de negação, você testa se a variável não existe. Mas, como visto, ela existe. Pode estar vazia, mas existe.

E talvez por isso você não esteja tendo o mesmo retorno que eu.

Isso porque o isset() verifica se uma variável existe e se ela tem valor. Mas diferente de empty() que considera alguns outros valores como sendo vazios, isset() só leva em conta se a variável é NULL.

Ou seja, se o seu ternário estivesse assim:

$servers1 = isset($_POST['servers1']) ? $_POST['servers1'] : NULL;

Funcionaria, pois apesar de variável existir, ela seria nula o que é avaliado como TRU pelo isset().

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Bruno.

Cara eu agradeço muito a sua ajuda de coração mesmo, mas continuo tendo como resposta do PHP o mesmo problema!

Por favor analise:

 

html:

 

 

 

<html>
<body>
<form method="post" action="aplicativo.php" target="popup">
        <td height="23" colspan="2"><strong>Servidor:</strong>
 <input type='radio' name="servers1" value="1"> 
opcap1
          <input type='radio' name="servers1" value="2"> 
opcao2  
          <input type='radio' name="servers1" value="3">
  opcao3
    </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          Links:<br />
            <textarea name="links" id="links" cols="45" rows="5"/></textarea>   
            <span class="r">*</span></p></div>
       </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          <h3>2º Mirror</h3>
        </div></td>
      </tr>
      <tr>
        <td height="23" colspan="2"><strong>Servidor:</strong>
 <input type='radio' name="servers2" value="11"> 
opcap11
          <input type='radio' name="servers2" value="22"> 
opcao22
          <input type='radio' name="servers2" value="33">
  opcao33
    </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          Links:<br />
            <textarea name="links2" id="links2" cols="45" rows="5"></textarea></p></div>
       </td>
      </tr>
      <tr>
        <td colspan="2"><div align="center">
          <input type="submit" name="button" id="button" value="Gerar Codigo" />
        </div></td>
      </tr>
    </table></td>
  </tr>
  </table>
</form>
</body>
</html>

 

 

 

aplicativo.php

 

 

 

<?php
$servers1 = isset($_POST['servers1']) ? $_POST['servers1'] : NULL;
$servers2 = isset($_POST['servers2']) ? $_POST['servers2'] : NULL;
$links = $_POST['links'];
$links2 = $_POST['links2'];
$var = null;
 
if( ! empty( $servers1 ) && ! empty( $links ) ) {
 
    if( ! is_null( $var ) ) {
 
        $var .= "\n";
    }
 
    $var .= $servers1 . "\n" . $links;
}
 
if( ! empty( $servers2 ) && ! empty( $links2 ) ) {
 
    if( ! is_null( $var ) ) {
 
        $var .= "\n";
    }
 
    $var .= $servers2 . "\n" . $links2;
}
 
var_dump( $var );
$bbcode='
' . $servers1 . '
' . $links . '
' . $servers2 . '
' . $links2 . '';
//CONFIGURAÇÕES DA MENSAGEM DE RESPOSTA
echo "<textarea rows='23' cols='100' readonly='readonly'>$bbcode</textarea>";
?>

 

 

 

Eu deixei idêntico ao que você explicou, e mesmo assim continuo encontrando isto:

 

 

 

6EOnE.png

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei exatamente do jeito que você postou e, de fato, está errado. mas releia o post #15 que você vai entender o porquê.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Excelente Bruno! Você conseguiu!

Porém agora temos outro problema...

Por exemplo, se eu boto um valor em links e não colo nenhum em servers1, a variavel $val retorna como vazia, em vez de mandar o que eu botei pelo menos em links...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso porque a condição que monta o $var leva em consideração dois testes: Se o campo do servidor está preenchido E se o campo dos links está preenchido.

 

Se pra você tanto faz, ao invés de && (e) use || (ou).

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.