Jump to content
Sign in to follow this  
BMCouto

Dúvida na query

Recommended Posts

BMCouto

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!

Share this post


Link to post
Share on other sites
softklin

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


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
BMCouto

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!

Share this post


Link to post
Share on other sites
softklin

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.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
BMCouto

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]'";
   }

Share this post


Link to post
Share on other sites
softklin

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.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
BMCouto

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!

Share this post


Link to post
Share on other sites
softklin

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


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
BMCouto

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?

Share this post


Link to post
Share on other sites
softklin

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.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
djthyrax

Se é para parar quando tiver no 3, é && e não ||.


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
softklin

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


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
djthyrax

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


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
BMCouto

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?

Share this post


Link to post
Share on other sites
softklin

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.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
BMCouto

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!

Share this post


Link to post
Share on other sites
softklin

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


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
BMCouto

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

Share this post


Link to post
Share on other sites
Battousai

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'] ) )

Share this post


Link to post
Share on other sites
BMCouto

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?

Share this post


Link to post
Share on other sites
softklin

<?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...


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
BMCouto

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?

Share this post


Link to post
Share on other sites
Battousai

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....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.