Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Petrivs

[Resolvido] Organizar "fila" em mysql

Recommended Posts

Boa tarde pessoas!

Comecei a estudar PHP há mais ou menos uma semana, e venho tendo certo sucesso em meu projeto de aprendizado (um CMS).

Porém, existe uma coisa que está me travando.

 

 

Eu desenvolvi um sistema de gerenciamento dos links dos menus por MySQL bem simples. A página puxa os registros da tabela, ordena pelo valor de posição (QUE NÃO É O ID!) e joga no HTML.

O meu problema é que se eu decido adicionar um link no lugar de um, ambos ficam com o mesmo valor de posição.

O que eu precisava é que ele adicionasse +1 no valor de posição do link antigo e também nos registros subsequentes.

Explicando melhor,

eu tenho:

1- principal

2- conteudo

3- portfolio

4- contato

 

 

Eu decido adicionar o link FORUM, no segundo lugar do menu - então eu jogo o valor 2.

Ficaria assim:

1- principal

2- conteudo

2- forum

3- portfolio

4- contato

 

Conquanto, eu quero obter este resultado:

1- principal

2- forum

3- conteudo

4- portfolio

5- contato

 

Eu pensei no seguinte algoritmo:

- O que eu quero fazer?
Organização de posições
-Fluxograma
- Definir variável com array total das posições do mysql
- SE existir um registro na var definida que seja igual ao da atualizada, ir para procedimento (organizacao)
- Caso contrário, adicionar registro do novo link


Organização:
- atualizar todos os registros que sejam >= ao numero igual ao da atualizada com um pos +1
- adicionar registro do novo link
Porém, não consigo pensar em como desenvolvê-lo!

 

Aqui vai meu arquivo de LISTAGEM dos links, que cria uma tabela com os links atuais:

 



<h1>Listagem de links</h1>
<?php
	//Seleção e execução de variáveis SQL
	include ("../connect.php");
	$sql_links = "SELECT * FROM menu order by pos";
	$query_links = mysql_query($sql_links);
	//Dá início à tabela

		$quebra = "</td><td class='quebra'>";
		echo "<table><tr><td class='quebra'>" . "Editar" . $quebra . "Deletar" . $quebra . "Posição" . $quebra . "Nome" . $quebra . "Link" . $quebra . "Link Show" . $quebra . "Alt Text" . $quebra . "Menu ID" . "</td></tr>";
	//Dá início ao loop de preenchimento
		while ($elink = mysql_fetch_array($query_links)) {
			echo "<tr><td class='quebra'>" . "<a href=?l=editlink&t=menu&id=" .$elink['menuid'] . "><img src='img/edit.png' class='nb' /></a>" . $quebra .
			"<a href=?l=deletelink&t=menu&id=" .$elink['menuid'] . "><img src='img/delete.png' class='nb' /></a>"  . $quebra . $elink['pos'] . $quebra . $elink['nome'] . $quebra . $elink['link'] . $quebra . $elink['linkShow'] . $quebra . $elink['alt'] . $quebra . $elink['menuid'] . "</td></tr>";
		}
		echo "</table>";
	?>
	<br />
	<br />
<h1>Adição de links</h1>
<?php 
	//Definição de vars
	$pos_ins = $_POST['pos'];
	$nome_ins = $_POST['nome'];
	$link_ins = $_POST['link'];
	$linkShow_ins = $_POST['linkShow'];
	$alt = $_POST['alt'];
	if (isset($pos_ins,$nome_ins,$link_ins,$linkShow_ins,$alt)) {
	//SQLs
			$sql_adicao_links = "INSERT INTO menu (`pos`,`nome`,`link`,`linkShow`,`alt`) VALUES ('$pos_ins','$nome_ins','$link_ins','$linkShow_ins','$alt')";
			$sql_adicao_query = mysql_query($sql_adicao_links);
			header("Location: ?l=links");
        }
?>
<?php
	$num = mysql_num_rows($query_links);
	$pos_m = $num + 1;
?>
<form method="post" action="<? $PHP_SELF  ?>">
<table>
	<tr>
		<td>Posição</td>
		<td>Nome</td>
		<td>Link</td>
		<td>Link Visível</td>
		<td>Texto Alt</td>
	</tr>
	<tr>
		<td><input type="text" name="pos" maxlenght="3"  size="3" value="<? echo $pos_m; ?>"></td>
		<td><input type="text" 	name="nome" maxlenght="50" size="20"></td>
		<td><input type="text" name="link" maxlenght="50" size="20"></td>
		<td><input type="text" name="linkShow" maxlenght="50" size="20"></td>
		<td><input type="text" name="alt" maxlenght="100" size="20"></td>
	</tr>
	<tr>
		<td><input type="submit" value="Adicionar Link"></td>
		<td><input type="reset" value="Apagar"></td>
	</tr>
</table>
</form>

Aqui vai a página de edição dos links:

<?php
//Definindo variáveis
$tipo = $_GET['t'];
$menuid = $_GET['id'];
//SQL
$sql_recebe = "SELECT * FROM $tipo WHERE menuid = $menuid";
$sql_atualiza = "";
//QUERIES
$query_recebe = mysql_query($sql_recebe);
$query_atualiza = mysql_query($sql_atualiza);
while ($reg = mysql_fetch_array($query_recebe)){
    $a_pos = $reg['pos'];
    $a_nome = $reg['nome'];
    $a_link = $reg['link'];
    $a_linkshow = $reg['linkShow'];
    $a_alt = $reg['alt'];
}
//SQL DELETE
$sql_delete = "DELETE * FROM $tipo WHERE menuid = $menuid";


?>
<?
//Atribuição de valores novos
    	$pos_ins = $_POST['pos'];
	$nome_ins = $_POST['nome'];
	$link_ins = $_POST['link'];
	$linkShow_ins = $_POST['linkShow'];
	$alt = $_POST['alt'];

	if (isset($pos_ins,$nome_ins,$link_ins,$linkShow_ins,$alt)) {
	//SQLs
			$sql_atualizacao_links = "UPDATE $tipo SET pos='$pos_ins', nome='$nome_ins', link='$link_ins', linkShow='$linkShow_ins', alt='$alt' WHERE menuid='$menuid'";
			$sql_atualizacao_query = mysql_query($sql_atualizacao_links) or die(mysql_error());;
                        echo "<script>window.alert('Registro atualizado com sucesso.'); document.location('?l=principal');</script>";

        }
?>
<form method="post" action="<? $PHP_SELF  ?>">
<table>
	<tr>
		<td>Posição</td>
		<td>Nome</td>
		<td>Link</td>
		<td>Link Visível</td>
		<td>Texto Alt</td>
	</tr>
	<tr>
		<td><input type="text" name="pos" maxlenght="3"  size="3" value="<? echo $a_pos; ?>"></td>
		<td><input type="text" 	name="nome" maxlenght="50" size="20" value="<?echo $a_nome; ?>"></td>
		<td><input type="text" name="link" maxlenght="50" size="20" value="<?echo $a_link;?>"></td>
		<td><input type="text" name="linkShow" maxlenght="50" size="20" value="<?echo $a_linkshow;?>"></td>
		<td><input type="text" name="alt" maxlenght="100" size="20 value="<?echo $a_alt;?>"></td>
	</tr>
	<tr>
		<td><input type="submit" value="Atualizar"></td>
	</tr>
</table>

Basicamente, o primeiro arquivo cria um link com o ID e POSIÇÃO do registro que eu quero alterar e me joga para a página de edição. Esta, recebe os valores, joga em variáveis e me dá o formulário de alteração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para fazer uma coisa parecida eu utilizei JS: http://jqueryui.com/demos/sortable/

Mas caso você queira fazer assim mesmo, faça o seguinte.

Antes de cadastrar, veja se não tem nenhum registro com esta posição já. Se tiver, você pega o ID desde registro e faz um UPDATE para adicionar +1 na sua posição. Fazendo isso, você precisará fazer UPDATE em todos os proximos também, criando um loop/recursividade.

Veja a logica:

atuliza_registros_para_se_adequar_a_esta_posicao($registro['posicao']));
cadastra($registro);
Isso foi só para explicar a logica.

Dentro da função "atuliza_registros_para_se_adequar_a_esta_posicao" (um pouco grande, vamos chamada de "update_regs()" =P), vai chamar ela mesma se precisar. Assim, criando uma espécie de efeito dominó.

[EDIT]

Veja um exemplo de função:

function update_regs($pos){
   $q = mysql_query('SELECT * FROM minha_tabela WHERE posicao = ' . $pos);
   $res = mysql_fetch_assoc($q);
   $num = mysql_num_rows($q);
   if($num > 0){
       $nova_posicao = ++$res['posicao'];
       update_regs($nova_posicao); // chama ela mesma
       mysql_query('UPDATE minha_tabela SET posicao = ' . $nova_posicao . ' WHERE id = ' . $id);
   }
}
Bom, esta bem mal feita, e provavelmente com erro (não testei). Mas é só para você sacar a logica :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu tentei... mas... falhei!

 

Bem, primeira falha - o isset que usei acusava sempre a var de existir. Não sei checar se a consulta foi (Y) ou ":(".

Fora isso, ele devia ao menos ajustar os outros registros quando eu joguei a posicao pra outra igual!

E... ele não fez nada.

<?php
//Definindo variáveis
$tipo = $_GET['t'];
$menuid = $_GET['id'];
//SQL
$sql_recebe = "SELECT * FROM $tipo WHERE menuid = $menuid";
//QUERIES
$query_recebe = mysql_query($sql_recebe);

while ($reg = mysql_fetch_array($query_recebe)){
    $a_pos = $reg['pos'];
    $a_nome = $reg['nome'];
    $a_link = $reg['link'];
    $a_linkshow = $reg['linkShow'];
    $a_alt = $reg['alt'];
}

function update_regs($pos){
   $q = mysql_query("SELECT * FROM $tipo WHERE pos = '$pos_ins'");
   $res = mysql_fetch_assoc($q);
   $num = mysql_num_rows($q);
   if($num > 0){
       $nova_posicao = ++$res['pos'];
       mysql_query('UPDATE links SET pos = ' . $nova_posicao . ' WHERE menuid = ' . $menuid);
       update_regs($nova_posicao); // chama ela mesma
   }
}
?>
<?
//Atribuição de valores novos
    	$pos_ins = $_POST['pos'];
	$nome_ins = $_POST['nome'];
	$link_ins = $_POST['link'];
	$linkShow_ins = $_POST['linkShow'];
	$alt = $_POST['alt'];

	if (isset($pos_ins,$nome_ins,$link_ins,$linkShow_ins,$alt)) {
            $sql_checa = "SELECT menuid FROM" . $tipo . "WHERE $pos_ins =" . $reg['pos'];
            $query_checa = mysql_query($sql_checa);
             
            if (isset($query_checa)) {
                echo "<script>window.alert('OPAAAAAA.');</script>";
                update_regs($pos_ins);
                } else {

	//SQLs
			$sql_atualizacao_links = "UPDATE $tipo SET pos='$pos_ins', nome='$nome_ins', link='$link_ins', linkShow='$linkShow_ins', alt='$alt' WHERE menuid='$menuid'";
			$sql_atualizacao_query = mysql_query($sql_atualizacao_links) or die(mysql_error());;
                        echo "<script>window.alert('Registro atualizado com sucesso.'); document.location('?l=principal');</script>";
                }

        }
?>
<form method="post" action="<? $PHP_SELF  ?>">
<table>
	<tr>
		<td>Posição</td>
		<td>Nome</td>
		<td>Link</td>
		<td>Link Visível</td>
		<td>Texto Alt</td>
	</tr>
	<tr>
		<td><input type="text" name="pos" maxlenght="3"  size="3" value="<? echo $a_pos; ?>"></td>
		<td><input type="text" 	name="nome" maxlenght="50" size="20" value="<?echo $a_nome; ?>"></td>
		<td><input type="text" name="link" maxlenght="50" size="20" value="<?echo $a_link;?>"></td>
		<td><input type="text" name="linkShow" maxlenght="50" size="20" value="<?echo $a_linkshow;?>"></td>
		<td><input type="text" name="alt" maxlenght="100" size="20 value="<?echo $a_alt;?>"></td>
	</tr>
	<tr>
		<td><input type="submit" value="Atualizar"></td>
	</tr>
</table>

Erros:

 

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /home/pedro/Documentos/www/cms/admin/editlink.php on line 20

 

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /home/pedro/Documentos/www/cms/admin/editlink.php on line 21

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os erros tão ali no final do post, não sei se viu.

Acho que meu problema mesmo é fazendo o if simples pra ver se a consulta deu certo ou não (a de ver se tem algum valor igual de posicao pra ativar a funcao).

[edit]

ACHO que descobri o problema.

Dentro da função ele não está pegando os valores passados pra página de edit.

echo "<script>window.alert('" . $tipo . "');</script>"; ele retorna vazio

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim sim, estou. tanto que a parte de edição dos links está funcionando perfeito.

Eu sei, mas usei ela como base já. tanto que fiz umas alteraçõeszinhas aqui e ali, porém, estou tendo problemas nas seguintes partes:

1- If para checar se a consulta feita com o intuito de descobrir se já existe algum registro com o mesmo valor de posição do que está para ser alterado

2- A função em sí não está pegando as variáveis anteriormente definidas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilize mysql_num_rows() para ver se a consulta retornou algum registro.

Coloque o echo mysql_error() ao final do script, para o caso de houver algum erro SQL (acho que este esta sendo o problema).

Uma função só usará variável definidas em seu escope, exceto se voce usar variavel globais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

function update_regs($pos) {
   include"../connect.php";
   $pos_ins = $pos;
   $curry = "SELECT * FROM menuadm WHERE pos = ". $pos_ins;
   $q = mysql_query($curry) or die (mysql_error());
   $res = mysql_fetch_assoc($q);
   $num = mysql_num_rows($q);
   if($num > 0){
       $nova_posicao = ++$res['pos'];
       mysql_query('UPDATE menuadm SET pos = ' . $nova_posicao . ' WHERE pos = ' . $pos_ins);
       update_regs($nova_posicao); // chama ela mesma
   }
}

Tá quase!!

Agora o que falta é fazer ele atualizar os outros links. Porque ele só está detectando... Dei um echo na posição, e vejam:

http://img715.imageshack.us/img715/3223/teta1.png

http://img411.imageshack.us/img411/2074/teta2.png

 

[Edit 2]

Consegui fazer ele alterar as colunas subsequentes.. Só que até 3453...

ahahahha

Compartilhar este post


Link para o post
Compartilhar em outros sites

<?php	
	if ($eh_um_insert) {
		$link = $_POST['link'];
		$pos = $_POST['posicao'];

		$jaexiste = mysql_fetch_array(mysql_query("SELECT Id_Link FROM Links WHERE Posicao = $pos"));
		
		$insert = mysql_query("INSERT INTO Links (Nome,Posicao) VALUES ('$link',$pos)");
		$novoId = mysql_insert_id();
		
		if ($jaexiste['Id_Link']) {
			$update = mysql_query("UPDATE Links SET Posicao = Posicao+1 WHERE Posicao >= $pos AND Id_Link != $novoId");
		}	
	}
	
	if ($eh_um_update) {
		$meuId = $_POST['id'];
		$link = $_POST['link'];
		$pos = $_POST['posicao'];
		
		$jaexiste = mysql_fetch_array(mysql_query("SELECT Id_Link FROM Links WHERE Posicao = $pos"));
		
		$update = mysql_query("UPDATE Links SET Nome = '$link', Posicao = $pos WHERE Id_Link = $meuId");
		
		if ($jaexiste['Id_Link']) {
			$update = mysql_query("UPDATE Links SET Posicao = Posicao+1 WHERE Posicao >= $pos AND Id_Link != $meuId");
		}	
	}
?>

<?php
	if ($quero_tirar_buracos_nas_posicoes) {
		$posreal = 0;
		$busca = mysql_query("SELECT * FROM Links ORDER BY Posicao");
		while ($x = mysql_fetch_array($busca)) {
			$posreal++;
			$update = mysql_query("UPDATE Links SET Posicao = $posreal WHERE Id_Link = $x[Id_Link]");
		}	
	}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então está ocorrendo tudo certinho, só nao está atualizando no DB?

Mude a linha para:

mysql_query('UPDATE menuadm SET pos = ' . $nova_posicao . ' WHERE pos = ' . $pos_ins) or exit(mysql_error());
E veja se aparece algum erro SQL.

OBS: oque e o ultimo codigo que você passou?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não foi ele que passou, fui eu. Ele me pediu help no msn e postei a (possível) solução aqui, assim fica disponível pra qualquer um com dúvida semelhante =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lucas e Fiote,

MUITO obrigado!

Consegui no final com uma ajuda pessoal do fiote, foi pelo esquema dele mesmo! Mas aprendi pacas com isso hehehe

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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