Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Aula 2 - mysqli_query($conexao, $query); - Ainda nao entendi pra que serve...

Pra mim esta um pouco dificil esse curso de php, e estou achando meio complicado o funcionamento de banco de dados (fiz o curso de banco aqui do alura e entendi um pouco, mas ainda tenho dificuldade). Fiz esse curso de php até a aula 5 e voltei para rever pq alguns codigos ja estao ficando meio complicado pra mim e nao to afim de decorar e sim entender cada coisa que esta sendo colocada. O que esta me pegando bastante é o uso de -- mysqli_query($conexao, $query); e tambem o -- $query = "insert into produtos (nome, preco) values ('{$nome}', {$preco})"; este segundo comando eu nao entendi pq tem que estar entre aspas e nem mto o pq de usa-lo...

4 respostas

Fala Ivan,

Tranquilo?

Então, infelizmente algumas coisas a gente acaba aprendendo na decoreba, mas é muito bom no seu caso de tentar entender o motivo de tal linha estar lá, vamos lá:

$query = "insert into produtos (nome, preco) values ('{$nome}', {$preco})";

No PHP é possível incluir variáveis dentro de uma string sem precisar concatenar, para economizar código, segue o mesmo exemplo se tivéssemos que concatenar a string com as variáveis.

$query = "insert into produtos (nome, preco) values ('"
 . $nome . "', " . $preco . ")";

Note que ela ficou maior, e até mais confusa com um monte de aspas duplas e aspas simples, por isso no PHP existe um atalho, as chaves {}, por isso no código está apenas {$nome} ao invés de " . $nome . "

Agora sobre o {$nome} estar entre aspas simples, isso já é uma necessidade do SQL, os campos das tabelas que são texto precisam estar entre aspas simples, assim na hora de ler o comando SQL ele sabe onde começa e termina o campo, pois como é um campo texto, pode haver comandos e caracteres dentro dele que são usados no SQL, como a virgula, se ele não tivesse aspas, e no seu nome tivesse uma vírgula, o SQL não saberia quando termina o nome e quando começa o preço, como no exemplo abaixo:

INSERT INTO PRODUTOS (NOME, PRECO) VALUES ('NOME DO PRODUTO, E SEU COMPLEMENTO',  200.00)

INSERT INTO PRODUTOS (NOME, PRECO) VALUES (NOME DO PRODUTO, E SEU COMPLEMENTO,  200.00)

Na primeira linha o SQL vai saber que o nome é NOME DO PRODUTO, E SEU COMPLEMENTO, já na segunda linha, sem aspas ele vai achar que o nome é apenas NOME DO PRODUTO, e que o preço é E SEU COMPLEMENTO, e além de dar erro por não ser do tipo do campo do preço (está indo um texto no lugar de um valor), o SQL vai acusar um outro erro, falando que você está passando 200.00 e não está falando qual é o campo à que ele se refere.

Espero ter ajudado!

Abraços!

Legal, ajudou um pouco sim, mas ainda estou em duvida de o por que usar $query, o que é essa variavel e o que ela faz? a outra duvida é da aspas dupla no $query = "insert into produtos (nome, preco) values ('{$nome}', {$preco})"; Por que toda a variavel tem que ficar entre aspas alem das aspas simples do $nome ?

O que eu cheguei a pensar na função dessa variavel é que Query é algo que sera digitado no banco de dados e que essas aspas é exatamente isso que voce digitaria la na parque SQL, aí no caso dessa variavel voce nao esta digitando nada, ja esta gravada essa variavel para ir automatico essa frase toda ( $query = "insert into produtos (nome, preco) values ('{$nome}', {$preco})"; ) para o campo de sql...

E aí Ivan,

Vamos por partes:

$query: a $query é uma variável que você criou no PHP, ela está armazenando um comando SQL, e é exatamente o que você disse, você está armazenando esse comando nessa variável pois você pode utilizar ela em outros lugares, e não precisa ficar digitando tudo de novo, eu poderia fazer o seguinte comando:

mysqli_query($conexao, "insert into produtos (nome, preco) values ('{$nome}', {$preco})");

É a mesma coisa, a única diferença é que assim eu estou colocando diretamente o comando, e não armazenando em uma variável, a gente armazena em variáveis para ficar mais legível e também para deixar o código reutilizável, por exemplo, eu poderia criar uma função no PHP de executar comandos SQLs (se eu me lembro desse curso ele vai fazer exatamente isso), dai eu passaria para ela somente a variável de conexão e a variável com o comando SQL.

solução!

Só um ponto sobre o motivo de estar em aspas duplas, no PHP quando você quer armazenar um comando SQL, você grava ele em formato texto, e o padrão para definir um conteúdo texto é envolve-lo entre aspas, seja simples ou duplas, nesse caso está dupla pois dentro dela estamos utilizando aspas simples, daí não poderia ser aspas simples para englobar o comando SQL e ter aspas simples dentro:


$query = "insert into produtos (nome, preco) values ('{$nome}', {$preco})";

$query = 'insert into produtos (nome, preco) values ('{$nome}', {$preco})';

No primeiro caso é o correto, pois você engloba tudo com aspas duplas e no comando SQL você tem aspas simples, no segundo caso o PHP entenderia 'insert into produtos (nome, preco) values (' como um bloco de texto e ', {$preco})' como outro bloco de texto, e acusaria um erro pois não há concatenação entre eles, e há uma variável entre eles também, a {$nome}.

Note que até na demonstração dos códigos o segundo ficou quebrado, ele também achou que a primeira aspas simples dentro do comando fosse o final do texto.