• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

BMCouto

Dúvida na query

31 mensagens neste tópico

Boas,

Então é o seguinte, tenho entre outras coisas uma secção do backoffice onde se lista os produtos, edita-se, etc, e uma zona para ter 3 produtos em destaque. Assim sendo tenho as 3 inputs, mas agora a dúvida é que o campo highlight na BD tem os valor 0 quando não está em destaque e 1 para destacar. Ou seja, quando muda os valores tenho que mudar o campo highlight dos id's que lá estavam para zero e por os novos introduzidos para 1.

Com tudo isto, estou-me a atrapalhar na query, se puderem dar uma ajuda agradeço Smile

<?php
$query = "SELECT id_product FROM store_products WHERE highlight='1'";
$result = mysql_query($query) or die("Erro ao obter produtos em destaque: ".mysql_error());
$highlight = array();
while($highlight = mysql_fetch_array($result)) { }
?>
<div id="produto-destaque">
  <span style="font-size: 14px;">Produtos em Destaque:</span><br />
  ID's: <form name="ProdsDestaque" action="main_admin.php" method="POST">
  <input type="text" name="ID1" class="prod-id" value="<?php echo $highlight[0]; ?>" /> 
  <input type="text" name="ID2" class="prod-id" /> 
  <input type="text" name="ID3" class="prod-id" /> <br />
  <input type="submit" name="valida_ids" value="Validar">
</form>
</div>
<?php
if(isset($_POST['valida_ids'])) {
  $oldID1 = $_POST['ID1'];
  $oldID2 = $_POST['ID2'];
  $oldID3 = $_POST['ID3'];
  
  $query = "UPDATE store_products SET /*what?*/ "
}

?>

Não liguem à array, isto foi um copy-paste de várias tentativas que estou a fazer agora mesmo.

Cumps!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não consegui perceber bem, mas vê lá se é isto:

<?php
if(isset($_POST['valida_ids'])) {
  $oldID1 = $_POST['ID1'];
  $oldID2 = $_POST['ID2'];
  $oldID3 = $_POST['ID3'];

  // Limpar a variavel
  $oldID1 = mysql_real_escape_string($oldID1);
  if ($oldID1 > 0) {
      $query = "UPDATE store_products SET highlight='1' WHERE product_id='$oldID1'";
  }
}

?>

Ou seja, recebe o ID do produto que se pretende pôr o highligth. Se os ID's pretendidos forem diferentes de 0, isto é, se corresponderem a id's de produtos, então actualizamos o valor do highligth correspondente a esse produto (id).

Seria isto?

EDIT: apenas fiz para o 1º ID

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem vamos lá ver se me consigo explicar melhor. Na tabela de produtos (store_products) tenho o campo que por defeito está sempre a 0.

Depois como mostrei acima tenho três inputs para inserir três id's de produtos que irão estar em destaque, ou seja ao inserir os id's naqueles campo o highlight passará na base de dados de 0 para 1. Mas depois quando lá for alterar, os id's que estão actualmente em destaque têm que passar (o campo highlight) de 1 para 0, e os novos id's que vou inserir passarem de 0 para 1, tudo isto no momento que valido claro. Conseguiram perceber melhor agora onde quero chegar?

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então, na alteração fazes assim:

* Alteras todos os highligths de produtos para 0, independentemente se vão ser depois seleccionados ou não, isto será algo do género:

UPDATE store_products SET highlight='0'

* Depois é só alterar os ids pretendidos, algo do género:

<?php
if(isset($_POST['valida_ids'])) {
   $oldIDs = array($_POST['ID1'], $_POST['ID2'], $_POST['ID3']);

   for ($i = 0; $i < count($oldIDs); $i++) {
      $oldIDs[$i] = mysql_real_escape_string($oldIDs[$i]);
      $query = "UPDATE store_products SET highlight='1' WHERE product_id='$oldIDs[$i]'";
   }
}
?>

Assim, apagas primeiro todos os atributos de destaque da BD. Depois, aplicas nos que pretendes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado, podes-me explicar esta parte que não percebi:

for ($i = 0; $i < count($oldIDs); $i++) {
      $oldIDs[$i] = mysql_real_escape_string($oldIDs[$i]);
      $query = "UPDATE store_products SET highlight='1' WHERE product_id='$oldIDs[$i]'";
   }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

em cima, se reparares eu passo os ids para um array. O for é para percorrê-los.

O mysql_real_escape_string é para escapar alguns caracteres, de modo a obter mais segurança na query. Podes ver o que faz no site do PHP, por exemplo, ou numa rápida pesquisa no fórum.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, percebi e funciona tudo, agora só a parte inicial é que falha, ou seja:

$query = "SELECT id_product FROM store_products WHERE highlight='1'";
$result = mysql_query($query) or die("Erro ao obter produtos em destaque: ".mysql_error());
while($getHighlight = mysql_fetch_array($result)) { $highlight = $getHighlight }
?>
<div id="produto-destaque">
   <span style="font-size: 14px;">Produtos em Destaque:</span><br />
   ID's: <form name="ProdsDestaque" action="main_admin.php" method="POST">
   <input type="text" name="ID1" class="prod-id" value="<?php echo $highlight[0]; ?>" /> 
   <input type="text" name="ID2" class="prod-id" /> 
   <input type="text" name="ID3" class="prod-id" /> <br />
   <input type="submit" name="valida_ids" value="Validar">
</form>
</div>

Tentei isto assim, mas estou a fazer algo mal para que a array seja ldia fora do while.

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta assim...

$query = "SELECT id_product FROM store_products WHERE highlight='1' limit 3";
$result = mysql_query($query) or die("Erro ao obter produtos em destaque: ".mysql_error());
$i = 1;
?>
<div id="produto-destaque">
   <span style="font-size: 14px;">Produtos em Destaque:</span><br />
   IDs: <form name="ProdsDestaque" action="main_admin.php" method="POST">
<?php
while($getHighlight = mysql_fetch_array($result)) {
?>
   <input type="text" name="ID<?php echo $i; ?>" class="prod-id" value="<?php echo $getHighlight[0]; ?>" /> 
<?php 
$i++;
}
?>
<br />
   <input type="submit" name="valida_ids" value="Validar">
</form>
</div>

Fiz ali no meio uma pequena alteração para fazer dinamicamente os inputs, não testei o código, vê se funciona, sff

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois eu pensei nisso, mas como acho que disse acima, não o fiz porque só quero mesmo 3 inputs, daí estar a tentar usar a array fora do while e meter la o value "manualmente". Mais alguma sugestão?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Queres ter três inputbox certas, não é? Então, dependendo podes alterar o while

while($getHighlight = mysql_fetch_array($result) || $i <= 3) {

Para continuar a gerar inputs até 3... Se só houver 2 highligths por exemplo, vai fazer os 3 inputs na mesma, sendo o último vazio.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas então, se forem duas linhas de resultados, aquilo retorna false e com && iria parar antes de fazer as três.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, eu estava a pensar é que o fetch na bd ia retornar mais de 3 linhas e que querias parar quando tivesses 3 feitos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu quero que mostre sempre 3 inputs, pois posso ter só dois destaque e a qualquer momento por o terceiro, mas nunca mais que três. E pelo que percebi isto assim com o while a mandar as inputs não vai acontecer. Não seria melhor conseguir mostrar o valor daquela array fora do while e depois fazer o echo no value de cada uma das 3 inputs?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há 1001 formas de fazer isto, e penso que o while de cima faça o seu trabalho, porque mesmo que não tenhas nenhum highligth, vai sempre fazer as 3 inputs.

Falo deste while

while($getHighlight = mysql_fetch_array($result) || $i <= 3) {

Mas aqui vai a minha sugestão da forma como dizes:

$query = "SELECT id_product FROM store_products WHERE highlight='1' limit 3";
$result = mysql_query($query) or die("Erro ao obter produtos em destaque: ".mysql_error());
$i = 1;
?>
<div id="produto-destaque">
   <span style="font-size: 14px;">Produtos em Destaque:</span><br />
   IDs: <form name="ProdsDestaque" action="main_admin.php" method="POST">
<?php
$produtos = new Array();
$i = 0;
while($getHighlight = mysql_fetch_array($result)) {
   $produtos[$i] = $getHighlight[0];
   $i++;
}
?>
   <input type="text" name="ID1" class="prod-id" value="<?php echo $produtos[0]; ?>" /> 
   <input type="text" name="ID2" class="prod-id" value="<?php echo $produtos[1]; ?>" /> 
   <input type="text" name="ID3" class="prod-id" value="<?php echo $produtos[2]; ?>" /> 
<br />
   <input type="submit" name="valida_ids" value="Validar">
</form>
</div>

Acho que agora é que está como pretendes, tens sempre três inputs, e cada um deles vai receber o id do produto em destaque. No caso, por exemplo de só haver 1 produto em destaque, a primeira input tem o id respectivo, e as outras 2 inputs estão vazias.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado, agora está a dar este erro:

Parse error: syntax error, unexpected T_ARRAY, expecting T_STRING or T_VARIABLE or '$'

na seguinte linha:

$produtos = new Array();

Não é assim que se declarar a array?

Cumps!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tira o new

$produtos = array(
  'id' => 1,
  'titulo' => 'bla'
);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem visto Battousai, acho que já estou a misturar tudo...  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas, ainda proveniente deste código, tenho na página principal um include pra mostrar os produtos em destaque, então fiz:

<?php

$queryLoja = "SELECT * FROM store_products WHERE highlight='1'";
$resultLoja = mysql_query($queryLoja) or die("Erro ao obter destaques da Loja: ".mysql_error());
while($destaqueArray = mysql_fetch_array($resultLoja) !== false) {
$destaque[] = $destaqueArray;
}
if($destaque[0]['id'] !== '') {
print ($destaque[0]['title']."<br>");
} elseif($destaque[1]['id']) {
print ($destaque[1]['title']."<br>");
} elseif($destaque[2]['id']) {
print ($destaque[2]['title']."<br>");
} else {
echo "De momento não existem produtos em destaque!";
}

?>

Já verifiquei ele entra no while, existem campos com highlight='1', mas depois não mostra nada, alguém percebe o que se possa está a passar?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pra que é que é esse !==false e o !=='' ?

Não tenho a certeza se o erro é daí, mas não tens necessidades de condições absolutas aí.


while( $destaqueArray = mysql_fetch_array($resultLoja) )
...
if ( ! empty( $destaque[0]['id'] ) )

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mesmo assim não dá, agora dá a mensagem do else "De momento nao existem produtos em destaque, mas existem!

Alguém está a ver o que possa ser?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

<?php

$queryLoja = "SELECT * FROM store_products WHERE highlight='1'";
$resultLoja = mysql_query($queryLoja) or die("Erro ao obter destaques da Loja: ".mysql_error());

$i=0;
while($destaqueArray = mysql_fetch_array($resultLoja)) {
$destaque[$i] = $destaqueArray[];
$i++;
}

// debug
echo "inicia debug";
print_r($destaque);
echo "fim debug";

if(!empty($destaque[0]['id'])) {
print ($destaque[0]['title']."<br>");
} elseif(!empty($destaque[1]['id'])) {
print ($destaque[1]['title']."<br>");
} elseif(!empty($destaque[2]['id'])) {
print ($destaque[2]['title']."<br>");
} else {
echo "De momento não existem produtos em destaque!";
}

?>

Se este código funcionar, significa que tens de prestar mais atenção à forma como copias os arrays. Fiz mudanças no while, e outras leves mudanças nos if's.

Pus ainda uma função print_r que te permite ver o que está no array. No caso de não funcionar, coloca aqui o conteúdo que isso te dá, sff...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, obrigado, antes demais tinhas um pequeno erro:

$destaque[$i] = $destaqueArray[]; // é só $destaque[$i] = $destaqueArray; sem o []

Agora o debug funciona e prova que tenho produtos com highlight='1', mas também mostra que depois as condições continuam mal porque não mostra poduto nenhum, aqui está o resultado:

inicia debugArray ( [0] => Array ( [0] => 2 [id_product] => 2 [1] => prod teste2 [name] => prod teste2 [2] => vsdv s sdfsdfsdfsd sdfs [description] => vsdv s sdfsdfsdfsd sdfs [3] => 999.99 [price] => 999.99 [4] => [image] => [5] => [thumb] => [6] => 1 [highlight] => 1 ) [1] => Array ( [0] => 4 [id_product] => 4 [1] => ggfh [name] => ggfh [2] => fghgh [description] => fghgh [3] => 454.00 [price] => 454.00 [4] => upload/loja/0ffd2c420e37f552d6a7882e0d3ca399_original.jpg [image] => upload/loja/0ffd2c420e37f552d6a7882e0d3ca399_original.jpg [5] => upload/loja/thumbs/0ffd2c420e37f552d6a7882e0d3ca399_thumb.jpg [thumb] => upload/loja/thumbs/0ffd2c420e37f552d6a7882e0d3ca399_thumb.jpg [6] => 1 [highlight] => 1 ) [2] => Array ( [0] => 6 [id_product] => 6 [1] => dfdsfdsf [name] => dfdsfdsf [2] => dsfdsfdsfsdfds [description] => dsfdsfdsfsdfds [3] => 999.99 [price] => 999.99 [4] => upload/loja/ea20a30016019c536fddaaee35d22d98_original.jpg [image] => upload/loja/ea20a30016019c536fddaaee35d22d98_original.jpg [5] => upload/loja/thumbs/ea20a30016019c536fddaaee35d22d98_thumb.jpg [thumb] => upload/loja/thumbs/ea20a30016019c536fddaaee35d22d98_thumb.jpg [6] => 1 [highlight] => 1 ) ) fim debugDe momento não existem produtos em destaque!

Mais alguma sugestão?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como estavas a declarar a array estava correcto. Não é por aí. O contador vai fazer exactamente a mesma coisa do que $destaque[] = $destaqueArray.

Isso de não mostrar produtos é porque esses ifs estão todos mal. Os campos 'id' e 'title' não existem na base de dados.... logo não estão na array....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora