Ir para conteúdo
biakelly

Regra do if

Recommended Posts

Me ajudem com uma situação?

 

tenho uma regra de um IF para exibir resultado a partir de uma tabela.

 

Tabela usuário tenho 4 colunas: ID, userid , status e idade

estou fazendo assim na regra:

 

<?php if ($row['status'] == 0) {
echo "<spam>usuário ok ;)</spam>";
echo "$row[idade)";
} else {
echo "<spam>usuário inexistente ;)</spam>";
} ?>

Essa regra até funciona se o usuário existir nesta tabela, mas se o usuário não esta nesta tabela gera erro:

 

Notice: Trying to access array offset on value of type null

 

Tem como adicionar uma regra extra nesta onde mesmo se não houver ninguém com 0 não gerar erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou quase lá, estou fazendo assim e esta trazendo o usuário inexistente

 

if ($id == $userid && $status == 0) {
echo "<spam>usuário ok ;)</spam>";
echo "$row[idade)";
} else {
echo "<spam>usuário inexistente ;)</spam>";
} 
?>

porém estou recebendo o erro:

Notice: Undefined variable: id in C:\xampp\htdocs\user\usuarios.php on line 200

 

essa é alinha do erro: 

if ($id == $userid && $status == 0) {

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @biakelly, tudo bem?

 

Vou tentar ajudar você.

12 horas atrás, biakelly disse:

Essa regra até funciona se o usuário existir nesta tabela, mas se o usuário não esta nesta tabela gera erro:

 

O erro se dá pelo fato de que você executou uma consulta no banco, mas essa consulta retornou nulo (vazio / sem registros).

Quando você tenta acessar a chave 'status' com $row[ 'status' ], você está tratanto $row como um array (um conjunto de dados), quando na verdade ele é nulo, justamente por não ter encontrado registros.

 

O seu if, então, poderia ser algo como:

if ( empty( $row ) ) { // $row está vazia? Neste caso o usuário não foi encontrado

 

Utilizando o if dessa maneira você deve conseguir resolver o problema da sua pergunta, mas se você me permitir, vou fazer algumas sugestões adicionais:

 

1 - Quando acessamos uma chave de um array, como em $row[ 'idade' ], 'idade é uma string, ou seja, uma cadeia de caracteres. Sempre que inserimos uma cadeia de caracteres no PHP devemos colocá-la entre aspas. Pode ser aspas duplas ( " ) ou simples ( ' ). A diferença entre as duas é que as aspas simples não vão tentar interpretar metacaracteres (como \n, \t, \r...) ou variáveis, e portanto é o que geralmente faz mais sentido ser utilizado.

 

Portanto:

// idade não está entre aspas. O PHP é esperto o bastante para tentar
// entender suas intenções aqui, mas ele pode se atrapalhar em algumas situações,
// se confundir com uma constante e exibir mensagens indesejáveis de erro:
$row[idade]

// já aqui estamos utilizando corretamente, mas particularmente acho desnecessário dizermos
// ao PHP: cara, se esforce para interpretar variáveis e metacaracteres nessa string "idade" que lhe passei
// Nós sabemos que é literalmente apenas "idade" e nada mais, mas o PHP não sabe disso.
$row["idade"]

// Portanto, a melhor opção seria:
$row['idade']

 

2 - Quando mandamos uma variável para o echo imprimir na tela ou para uma função, não precisamos das aspas ao redor de toda a informação, então:

// Tomemos agora este exemplo:
echo "$row[idade]";
// Vamos aprimorá-lo...

// Não precisamos das aspas ao redor de tudo, pois estamos querendo imprimir apenas uma variável:
echo $row[idade];
// Quase lá, mas lembra do que eu disse antes sobre o uso de aspas na chave dos arrays?
echo $row['idade'];// Opa, agora sim!

// Mas e se você quisesse inserir essa variável junto a algum texto?
// Daí sim as aspas ao redor fazem total sentido. Isso poderia ser feito assim:
echo "A variável possui o valor: {$row['idade']}";
// Observe que coloquei a variável entre chaves, "{" e "}". Isso explicita que trata-se de uma variável
// e que o PHP deve interpretá-lo como tal, evitando alertas ou erros.

// Outra forma de se chegar ao mesmo resultado seria unindo uma string (cadeira de caracteres) a uma variável, assim:
echo 'A variável possui o valor: ' . $row['idade'];// Mesmo efeito do exemplo anterior
// Outro exemplo:
echo 'CARACTERES' . $variavel . 'MAIS CARACTERES' . $outra_var . 'BLA BLA';

 

Veja mais:

https://www.php.net/manual/pt_BR/language.types.string.php

https://www.php.net/manual/pt_BR/language.types.array.php

 

Talvez você já saiba de tudo isso e eu esteja apenas chovendo no molhado, mas eu particularmente demorei tempo demais para entender esses detalhes quando estava começando a programar e gostaria que alguém tivesse me explicado. Teria me poupado umas boas dores de cabeça. Espero que lhe seja útil.

 

3 - E apenas um detalhe bobo que você com certeza sabe, mas se confundiu. A tag que você tentou inserir no exemplo é <span> e não <spam>. Vem do termo em inglês, que significa "vão" / "extensão" / "intervalo".

 

4 - Achei um pouco estranho você ter uma coluna chamada ID e outra userid na mesma tabela, que se chama "usuario". Parece que são dois valores para o mesmo dado. Talvez você possa dar uma atenção nesse ponto do seu código também.

Esse material pode ser util nesse sentido: https://medium.com/@diegobmachado/normaliza%C3%A7%C3%A3o-em-banco-de-dados-5647cdf84a12

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares comigo tudo bem e você como esta?

 

Sinceramente, amei seu post e quero agradecer imensamente o tempo que você separou para dar atenção a minha pergunta/duvida. Consegui rodar essa parte do usuário que funcionou certinho e entendi a regra.

 

Estou aplicando as mesmas regras em outra página, desta vez tenho um script e imagem no meio dela, veja como estou fazendo:

 

echo "<script";
echo "src='https://checkout.stripe.com/checkout.js' class='stripe-button'";
echo "data-key='" . $publishablekey . "";
echo "data-amount='{$row['totalbrl']*100;}'";
echo "data-name='bxb'";
echo "data-quantity={$row['total']}'";
echo "data-description='buy cryptocurrency'";
echo "data-image='../assets/images/logo/bianet.png'";
echo "data-currency='brl'";
echo "data-email='" .$email . "' ";
echo ">";
echo "</script>";

Cheguei perto ou to errando muito? o botão não aparece desse jeito

Compartilhar este post


Link para o post
Compartilhar em outros sites

@biakelly como o methus já disse o uso dessas chaves "{ }" são para mostrar algo que já existe.

Portanto nessa linha:

4 horas atrás, biakelly disse:

echo "data-amount='{$row['totalbrl']*100;}'";

Você não está mostrando e sim criando algo o que foge da regra dessas chaves, e nesse caso você pode concatenar..

echo "data-amount='" . $row['totalbrl']*100 . "'";

Além do mais você pode está escapando...

<?php
//echo " "cometendo um erro de escape" "; isso gera erro porque uma áspa fecha outra
echo ' \'escapando com áspas simples\' ';
echo " \"escapando com áspas duplas\" ";

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Omar~ tudo bem?

 

Eu tinha alterado, mas ainda não descobri porque o botão não aparece, veja:

echo "<script";
echo "src='https://checkout.stripe.com/checkout.js' class='stripe-button'";
echo "data-key='" . $publishablekey . "'";
echo "data-amount='" . $row['totalbrl']*100 . "'";
echo "data-name='bxb'";
echo "data-quantity='" .$row['total'] . "'";
echo "data-description='buy cryptocurrency'";
echo "data-image='../assets/images/logo/bianet.png'";
echo "data-currency='brl'";
echo "data-email='" . $email . "'";
echo ">";
echo "</script>";

Agora parou de dar erro, mas o danado do botão não aparece. Os valores aparecem, menos o botão

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que botão?

O contexto PHP é para renderizar um script e não um botão.

A propósito isso é inconsistente na renderização pois uma linha independente é gerada após a outra devido as várias repetições da função echo, seria ideal só usar uma vez a função e ir inserindo contexto por contexto para que exista somente uma renderização.

 

Sei lá digamos que esse checkout.js irá criar algum botão no documento, isso não é problema PHP (back-end) e sim Javascript (Front-End).

Se for esse o caso sugiro que busque a documentação ou contate o(s) desenvolvedor(es) do mesmo para esclarecimento como utilizar-lo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Omar~ Sim imaginei isso, mas achei que eu podia resolver essa parte com PHP,  vou postar o código completo para entendimento:

 

<?php
if (isset($row['userid']) && $row['status'] == 0) {
//if ($userid == $userid && $status == 0) {
echo "<div class='table-responsive data-table table-striped'>";
echo "<table id='activetrontbl' class='table vertical-align' style='width:100%'>";
echo "<thead>";
echo "<tr class='text-center'>";
echo "<th>";
echo "<Label>Tokens</Label><br>";
echo "</th>";
echo "<th>";
echo "<label>Quantity</label>";
echo "</th>";
echo "<th>";
echo "<label>Total price</label>";
echo "</th>";
echo "</tr>";
echo "</thead>";
echo "<tbody>";
echo "<tr class='text-center'>";
echo "<td class='align-middle'>";
echo "<img src='../assets/images/logo/bianet.png' width='42' alt='pricebo'>";
echo "<br><small>pricebo - price</small>";
echo "</td>";
echo "<td class='align-middle'>";
echo "<h4>$row[total] price</h4>";
echo "</td>";
echo "<td class='align-middle'>";
echo "<h4>U$ $row[totalinusdamount]</h4>";
echo "<small>R$ ($row[totalbrl])</small>";
echo "</td>";
echo "</tr>";
echo "</tbody>";
echo "</table>";
echo "</div>";
echo "<form action='submit.php' method='post'>";
echo "<input type='hidden' name='amount' value='<?php echo $row[totalbrl] * 100; ?>'>";
echo "<input type='hidden' name='total' value='<?php echo $row[total]; ?>'>";
echo "<input type='hidden' name='userid' value='<?php echo $userid; ?>'>";
echo "<input type='hidden' name='updateid' value='<?php echo $row[id]; ?>'>";
echo "<input type='hidden' name='name' value='<?php echo $fullname; ?>'>";
echo "<input type='hidden' name='email' value='<?php echo $email; ?>'>";
echo "<div class='d-flex justify-content-end'>";

echo "<script";
echo "src='https://checkout.stripe.com/checkout.js' class='stripe-button'";
echo "data-key='" . $publishablekey . "'";
echo "data-amount='" . $row['totalbrl']*100 . "'";
echo "data-name='bxb'";
echo "data-quantity='" .$row['total'] . "'";
echo "data-description='currency'";
echo "data-image='../assets/images/logo/bianet.png'";
echo "data-currency='brl'";
echo "data-email='" . $email . "'";
echo ">";
echo "</script>";

echo "</div>";
echo "</form>";
echo "</div>";
                } else {
echo "<div class='row'>";
echo "<div class='col text-center'>";
echo "<p><i class='text-orange h1'></i></p>";
echo "<p><spam class='h5'>Your cart is empty!</spam></p>";
echo "<p><spam>Add something to make me happy ;)</spam></p>";
echo "</div>";
echo "</div>";
} ?>

 

Esse código é uma espécie de carrinho.
Ele segue um fluxo até chegar nesta tela.

 

Quando o usuário chega nesta tela após realizar a adição inicial o sistema mostra a quantidade comprada, preço e e-mail.

 

Como uso uma função de pagamento Stripe, ele fica no meio desse código e explico por que: Até posso deixar o botão fora desse echo, porém ele seria apresentado ao usuário que não tem nada no carrinho (neste caso seria errado pois ele ficaria estático.)

 

Tentei resolver apresentando esse botão que esta em um Script desta forma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @biakelly, bom dia! Por aqui tudo bem, obrigado por perguntar.

Vamos lá:

 

1 - Você precisa separar as camadas de interface (HTML) da lógica (PHP), pois dessa forma seu código será mais legível, seu editor vai colorir as palavras-chaves para você e você terá maior domínio sobre o que está acontecendo no seu código. Outro ponto fundamental é indentar corretamente (aplicar os devidos espaços ou tabs de forma a organizar a hierarquia de tags e instruções do código).

Este trecho, por exemplo:

echo "<div class='table-responsive data-table table-striped'>";
echo "<table id='activetrontbl' class='table vertical-align' style='width:100%'>";

Poderia ser escrito dessa forma:

    // estamos com a tag PHP aberta aqui. Vamos fechá-la para escrever HTML
    ?>
    <div class="table-responsive data-table table-striped">
        <table id="activetrontbl" class="table vertical-align" style="width:100%">

Perceba que aqui mesmo no fórum nós já temos uma clareza maior do código, já que ele foi colorido, uma vez que o interpretador tem certeza de que não é uma mera cadeia de caracteres (string), como antes, mas um código HTML.

 

Note ainda que eu troquei as aspas dos atributos HTML, conforme o exemplo:

<img src='arquivo.jpg' alt=''> <!-- Errado -->
<img src="arquivo.jpg" alt=""> <!-- Certo -->

 

 

2 - Avançando um pouco no código, encontramos este trecho:

echo "<h4>$row[total] price</h4>";

Essa linha estaria mais correta conforme as explicações do meu post anterior, assim:

// Chaves ao redor das variáveis.
// Aspas simples na chave do array.
echo "<h4>{$row['total']} price</h4>";

Mas como estamos com a tag do PHP fechada, dando continuidade ao que foi dito no item anterior, não poderíamos fazer esse echo, ao menos que a tag PHP fosse reaberta. Portanto, nesse caso, poderíamos escrever assim:

//tag PHP foi fechada lá em cima...
?>
<!-- Depois inserimos algum HTML por aqui... -->
	<h4><?php echo $row['total']; ?> price</h4>

Veja que abrimos a tag PHP onde bem entendemos, chamamos o echo para imprimir uma string na tela e depois fechamos, para dar continuidade ao HTML. Também poderíamos utilizar a sintaxe reduzida da abertura de tag com echo, que torna nosso código mais sucinto:

<h4><?= $row['total'] ?> price</h4>

O efeito é o mesmo.

 

 

3 - Avançando mais um pouco, encontramos essa linha:

echo "<input type='hidden' name='amount' value='<?php echo $row[totalbrl] * 100; ?>'>";

Perceba que já estamos dentro do contexto do PHP (entre <?php e ?>), então você corretamente chamou o echo, mas dentro do atributo value você abriu novamente a tag PHP, e isso acabou sendo enviado junto ao navegador. Se você analisar pelo código-fonte da página gerada no seu navegador vai encontrar algo como um cru "value='<?php echo ... ; ?>'", que não faz muito sentido, certo?

 

 

Corrigindo esses pontos chegaríamos em um código parecido com esse, que se ainda não estiver funcionando, pelo menos está no caminho:

<?php
if (isset($row['userid']) && $row['status'] == 0) {
    ?>
    <div class="table-responsive data-table table-striped">
        <table id="activetrontbl" class="table vertical-align" style="width:100%">
            <thead>
                <tr class="text-center">
                    <th>
                        <label>Tokens</label><br>
                        <!-- Esse <br> deveria ser reproduzido com CSS. Talvez um padding no label ou th? -->
                    </th>
                    <th>
                        <label>Quantity</label>
                    </th>
                    <th>
                        <label>Total price</label>
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr class="text-center">
                    <td class="align-middle">
                        <img src="../assets/images/logo/bianet.png" width="42" alt="pricebo">
                        <br><small>pricebo - price</small>
                    </td>
                    <td class="align-middle">
                        <h4><?= $row['total'] ?> price</h4>
                    </td>
                    <td class="align-middle">
                        <h4>U$ <?= $row['totalinusdamount'] ?></h4>
                        <small>R$ <?= $row['totalbrl'] ?></small>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <form action="submit.php" method="post">
        <input type="hidden" name="amount" value="<?= $row['totalbrl'] * 100 ?>">
        <input type="hidden" name="total" value="<?= $row['total'] ?>">
        <input type="hidden" name="userid" value="<?= $userid ?>">
        <input type="hidden" name="updateid" value="<?= $row['id'] ?>">
        <input type="hidden" name="name" value="<?= $fullname ?>">
        <input type="hidden" name="email" value="<?= $email ?>">
        
        <div class="d-flex justify-content-end">
            <script src="https://checkout.stripe.com/checkout.js" class="stripe-button"
                data-key="<?= $publishablekey ?>"
                data-amount="<?= $row['totalbrl'] * 100 ?>"
                data-name="bxb"
                data-quantity="<?= $row['total'] ?>"
                data-description="currency"
                data-image="../assets/images/logo/bianet.png"
                data-currency="brl"
                data-email="<?= $email ?>"
            ></script>
        </div>
    </form>
    
    </div><!-- Essa div parece não ter abertura nesse código. Talvez seja melhor removê-la -->
    <?php
} else {
    ?>
    <div class="row">
        <div class="col text-center">
            <p><i class="text-orange h1"></i></p>
            <p><span class="h5">Your cart is empty!</span></p><!-- span no lugar de spam -->
            <p><span>Add something to make me happy ;)</span></p>
        </div>
    </div>
    <?php
}
// não há necessidade de fechar a tag PHP aberta anteriormente, pois trata-se do final do arquivo

 

Acesse o código-fonte no seu navegador para ver se todos os atributos no HTML estão recebendo os valores corretos. Isso é fundamental para termos clareza acerca do funcionamento do botão.

Lembre-se de que nem tudo que aparece no navegador é o que foi processado pelo PHP. Atributos como data-* aparecem apenas no código-fonte.

Espero que consiga resolver o problema agora :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi @Matheus Tavares Que aula!!  Eu sempre fiz da maneira errada e com suas explicações tudo faz sentido e agora vou rever todo meu código (e isso é muito positivo pois tenho muito a melhorar e estou muito feliz com isso).

 

Você não ideia do quanto me ajudou, muito obrigada mesmo! Eu estava muito limitada a algo que aprendi mas posso melhorar.

 

Muito muito obrigada :smiley: !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

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