Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal,
Passei três dias quebrando a cabeça para resolver a seguinte situação:
Tenho um arquivo usr.php que abre um formulário. O número de linhas (itens/produtos) que aparece para cada usuário é definido previamente em uma tabela, junto com outras informações do usuário.
Como inicialmente cada usuário poderia preencher apenas a lista de produtos em andamento, eu tinha uma tabela pra cada um, com o número de inserções já definidas. Ao salvar, na realidade o usuário apenas fazia um UPDATE nas linhas do banco.
Pra exibir os campos de cada usuário (para que ele editasse até a data do envio final) eu usava o for($i=1; $i<=$qtd; $i++).
Funcionou bem por bastante tempo. Mas agora, estou programando para a edição de múltiplos trabalhos.
Assim, no TRABALHO01, o usuário edita 20 itens. No TRABALHO02, outros 20.
Parece simples, mas estou usando apenas uma tabela para cada usuário. Então os itens são armazenados em sequência. Na primeira vez que o usuário edita o trabalho, ele faz um INSERT. Na segnda, faz um UPDATE. Normal.
Meu SQL fica assim
$sql = "SELECT * FROM 'users' WHERE TRABALHO='trabalho01' AND ID='$i'";
E aí mora o problema: como uso o $i++ no for() esse $sql só funciona nos primeiros 20 produtos
Já que o id do trabalho 02 começa no 21.
Então fiz assim:
$sql_define_inicio = "SELECT * FROM 'users' WHERE TRABALHO='trabalho01' LIMIT 1";
(...)
$inicio = $row['ID'];
$fim = $inicio+$qtd-1;
No for() mudei pra $i=$inicio; $i<=fim; $i++
Mas NÃO FUNCIONA!!!!
Na verdade, funciona parcialmente, mas só que salva no banco a partir da linha 2.
No arquivo save.php possui um sistema semelhante.
Abraçoooo galeraaa
Não tenho certeza, mas acho que seu problema de cara não é no for/while e sim na sua consulta e, possivelmente, na estrutura do SGBD.
Veja bem, você que o usuário edite 20 linhas do seu trabalho, mas está fazendo 20 consultas retornando um registro por consulta.
$sql = "SELECT * FROM 'users' WHERE TRABALHO='trabalho01' AND ID='$i'";
Para essa consulta, que eu não vejo sentido nenhum nela, você utilizar um for para incrementar o ID, sem ao menos saber se é o ID correto.
Não seria melhor fazer ao contrário, uma consulta que retorne 20 registros, indiferente o id selecionado? Apenas em ordem crescente?
$sql = "SELECT * FROM 'users' WHERE trabalho = 'trabalho01' ORDER BY id ASC LIMIT 20";Valeu pelas respostas galera.
Então, esqueço o for() e uso o while()?
Acho que vai dar certo, pq posso usar o $qtd como definidor do LIMIT
Vou tentar ao 12h quando chegar em casa.
Acho que fiquei tão imerso nesse negócio... que não consegui ver o óbvio.
Qualquer coisa volto a tarde.
Dedos cruzados ;)
for, while, foreach. A implementação da estrutura de controle não deve afetar o resultado.
Resolvido com relação à montagem do formulário.
Ele insere a primeira vez e, ao abrir para edição, aparecem os itens nas posições corretas.
No entanto, ainda não resolvi o problema com relação à atualização dos mesmos.
Por que para gravar, utilizo um for() (neste caso).
O sql é
$sql_update = "UPDATE 'users' SET $usertable.CODIGO='$codigo[$i]', $usertable.DESCRICAO='$descricao[$i]' WHERE $usertable.TRABALHO='$trabalho'";
ok?
Mas isso fica dentro do for(). E em cada loop atualiza o mesmo registro, pq não tem um $i++ que passa ao próximo registro (próximo ID).
Pensei assim:
$sql_update = "UPDATE 'users' SET CODIGO='$codigo[$i]', DESCRICAO='$descricao[$i]' WHERE TRABALHO='$trabalho' AND ID BETWEEN '$id_inicial' AND '$id_final'";
Muita viagem?
Não deu tempo de testar ainda =P
Resolvido!
Fiz da seguinte forma:
//Localizando o ID do primeiro registro
$sql = "SELECT ID FROM $usrtbl WHERE TRABALHO='$trabalho' AND DATE_I='$datainicio' AND DATE_F='$datafim' LIMIT 1";
$qry = mysql_query($sql, $con) or die(mysql_error());
$fetch = mysql_fetch_array($qry_request_initial_id);
$start = $fetch['ID'];
$end = $start+$qtd-1;
$id = $start;
$i = '1';
while ($i<=$end) {
//Aqui tá o segredo!!! Ele busca o resultado inicial, mas a cada loop faz +1
$new_id = $id-1+$i;
//Vou adiantar as coisas
$COD_PAI_[$i] = mysql_real_escape_string($_POST['COD-PAI-'.$i]);
$GRUPO_[$i] = mysql_real_escape_string($_POST['GRUPO-'.$i]);
$qry_form = "UPDATE $usrtbl SET
$usrtbl.TRABALHO='$trabalho',
$usrtbl.DATE_I='$datainicio',
$usrtbl.DATE_F='$datafim',
$usrtbl.CODPAI='$COD_PAI_[$i]',
$usrtbl.GRUPO='$GRUPO_[$i]'
WHERE TRABALHO='$trabalho' AND DATE_I='$datainicio' AND DATE_F='$datafim' AND ID ='$new_id'";
mysql_query($qry_form, $con) or die(mysql_error());
$i++;
}
não entendi, você quer zerar o id e deixar algo assim
USUARIO 1
ITEM 1, 2, 3, 4, 5...
USUARIO 2
ITEM 1, 2, 3, 4, 5...
?