Ir para conteúdo
Fórum Script Brasil
  • 0

Código PHP com dois WHILES


Mario Mendes

Pergunta

Bom dia, estou a tentar fazer um sistema de pastas da seguinte forma:

 

Tabela Folders : id_folder / id_utilizador / nome_folder - Nesta tabela tenho 3 registos

Tabela Sub_folder : id_sub_folder / id_folder / id_utilizador / nome sub_folder - Nesta tabela tenho 1 registo

 

Quando faço o while para obter todas as folders ocorre tdo mt bem, ou seja no meu exemplo as 3 folders são apresentadas ex: X / Y e Z

mas no entanto quando repito o while dentro do primeiro para me dar as sub_folders daquela folder especifica as sub folders aparecem-me em todas as folders e não somente naquela especifica, isto pk o segundo while (sub_folders) esta a apanhar toda a extensao da tabela folders que esta dentro das chaves { } do primeiro while. 

Queria obter isto por exemplo: X - X1 e X2 / Y / Z e da-me isto X - X1 e X2 / Y - X1 e X2 / Z - X1 e X2

 

Soluções para resolver o problema?

 

Saudações a todos 

Editado por Mario Mendes
Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Posta o código que fica muito mais fácil de te ajudar.

Mas se você tem uma consulta de todas as folders, faz um loop nelas e dentro do loop faz um select pelas sub_folders, vai acontecer isso que você descreveu mesmo, para resolver preciso entender direito o que você quer.

Uma página com links que vão "acessando" as pastas?

Não serve um conjunto de divs que "exibe/esconde" as subpastas de cada uma das pastas?

Um formulário que filtra as sub pastas que devem ser exibidas?

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia, antes de mais deixo aqui duas imagens das minhas tabelas, folder e subfolder, e a minha ideia seria dispor todas as folders e assim que clicado nas folders se existissem subfolders daquela folder ser exibido, segue em anexo imagem ilustrativa da minha ideia:

 

Meu código esta assim neste momento, dispus em tabela so para ver o resultado

 

<?php 
session_start();

include "includes/db.php";
?>
<!DOCTYPE html>
<html>
<head>
    <title>Sistema de pastas</title>
    <link rel="stylesheet" href="includes/style.css">
</head>
<body>

<div id="left">
<?php 
@$folderURL = $_GET['folder'];

$dados = "SELECT f.nome_folder, s.nome_sub_folder FROM folder AS f
INNER JOIN sub_folder AS s
ON f.id_folder = s.id_folder
ORDER BY f.nome_folder, s.nome_sub_folder";

$execDados = mysqli_query($link,$dados);
$contar = mysqli_num_rows($execDados);

while ($obterDados = mysqli_fetch_assoc($execDados)) {
?>
<table border="1" width="450" style="text-align: center;">
    <tr>
        <td style="width: 30%;"><?= $obterDados['nome_folder']; ?></td>
        <td><?= $obterDados['nome_sub_folder']; ?></td>
    </tr>
</table>
<?php

}

?>

</div><!-- left -->

</body>
</html>

 

Espero que tenha percebido minha ideia,

cumprimentos

 

 

 

folder.png

subfolder.png

ideia.png

Link para o comentário
Compartilhar em outros sites

  • 0

Entendi sim o que você quer, ou pelo menos parte, não reproduzi o cenário aqui, mas a sua consulta está certa essa consulta: "SELECT f.nome_folder, s.nome_sub_folder FROM folder AS f INNER JOIN sub_folder AS s ON f.id_folder = s.id_folder ORDER BY f.nome_folder, s.nome_sub_folder" tem que retornar:

598af51702eb9_Capturadetela_2017-08-09_08-38-07.png.54d5883039926881a5a55c09df3afd9c.png

Mas eu reescreveria o seu código assim:

<?php 
session_start();

include "includes/db.php";
?>
<!DOCTYPE html>
<html>
<head>
	<title>Sistema de pastas</title>
	<link rel="stylesheet" href="includes/style.css">
</head>
<body>

<div id="left">
<?php 
$folderURL = isset($_GET['folder']) ? $_GET['folder'] : ''; // Condição ternária

$folderSql = "SELECT f.nome_folder, s.nome_sub_folder FROM folder ORDER BY nome_folder"; // Seleciono apenas as pastas

$folders = mysqli_query($link,$folderSql);
$foldersQtde = mysqli_num_rows($folders);
?>
<table border="1" width="450" style="text-align: center;">
<?php
	while ($folder = mysqli_fetch_assoc($folders)) {
		if ($folderURL == $folder['nome_folder']) { // Filtro pela pasta "selecionada"

			$subFolderSql = "SELECT f.nome_folder, s.nome_sub_folder FROM folder ORDER BY nome_folder"; // Seleciono apenas as subpastas

			$subFolders = mysqli_query($link,$subFolderSql);
			$subFoldersQtde = mysqli_num_rows($subFolders);
			?>
				<tr>
					<td style="width: 30%;" rowspan="<?= $subFoldersQtde; ?>"> <?php // Rowspan "aumenta" a celula com o nome da pasta ?>
						<a href="?folder=<?= $folder['nome_folder']; ?>"> <?php // Link para "acessar" a pasta ?>
							<?= $folder['nome_folder']; ?>
						</a>
					</td>
			<?php
			while ($subFolder = mysqli_fetch_assoc($subFolders)) {
			?>
				<td><?= $subFolder['nome_sub_folder']; ?></td>
			<?php
			}
			?>
				</tr>
			<?php
		} else {
	?>
		<tr>
			<td style="width: 30%;">
				<a href="?folder=<?= $folder['nome_folder']; ?>"> <?php // Link para "acessar" a pasta ?>
					<?= $folder['nome_folder']; ?>
				</a>
			</td>
			<td></td> <?php // Não exibe subpasta de pastas não "acessadas" ?>
		</tr>
	<?php
		} // fechando o else
	} // fechando o primeiro while
?>
</table>

</div><!-- left -->

</body>
</html>

 

Link para o comentário
Compartilhar em outros sites

  • 0

Eu entendi a lógica, o rowspan vai "aumentar" a linha da folder de acordo com a quantidade de subfolders daquela folder para que não esteja sempre a repetir, mas agora ao executar o seu código, da-me este erro:

linha21: $foldersQtde = mysqli_num_rows($folders);

linha25:     while ($folder = mysqli_fetch_assoc($folders)) {

 

Sabe o que poderá ser?

Sem título2.png

Link para o comentário
Compartilhar em outros sites

  • 0

Sei sim, comi bronha na hora de montar os selects, rsrsrs, Ctrl+C Ctrl+V

"SELECT nome_folder FROM folder ORDER BY nome_folder" // Esse é o select das pastas

"SELECT nome_sub_folder FROM sub_folder ORDER BY nome_sub_folder" // Esse é o select das subpastas

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, tenta assim...

<?php

			$subFolderSql = "SELECT nome_sub_folder FROM sub_folder WHERE id_folder = {$folder['id_folder']} ORDER BY nome_sub_folder"; // Faltou esse WHERE

			$subFolders = mysqli_query($link,$subFolderSql);
			$subFoldersQtde = mysqli_num_rows($subFolders);
			?>
				<tr>
					<td style="width: 30%;" rowspan="<?= $subFoldersQtde; ?>">
						<a href="?folder=<?= $folder['nome_folder']; ?>">
							<?= $folder['nome_folder']; ?>
						</a>
					</td>
			<?php
			$primeiraSubpasta = true; // Essa variavel para funcionar como flag
			while ($subFolder = mysqli_fetch_assoc($subFolders)) {
              	// Esse IF para não abrir <tr> na primeira subpasta
				if ($primeiraSubpasta)
					$primeiraSubpasta = false;
				else
					echo '<tr>';
			?>
					<td><?= $subFolder['nome_sub_folder']; ?></td>
				</tr> <?php // E o fechamento da </tr> tem que ficar aqui dentro ?>
			<?php
			}

 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,9k
×
×
  • Criar Novo...