Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

CarlosPT

Query SQL

Mensagens Recomendadas

CarlosPT

Boas,

Estou a construir um site de um hotel com sistema de reservas e não consigo fazer a consulta á base de dados para me retornar os quartos que estão disponiveis para as datas que insiro no formulário html.

Alguém me pode ajudar na query?

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

Boas,

Estou a construir um site de um hotel com sistema de reservas e não consigo fazer a consulta á base de dados para me retornar os quartos que estão disponiveis para as datas que insiro no formulário html.

Alguém me pode ajudar na query?

Obrigado

Até percebo alguma coisita de PHP agora de adivinho não.....

Põe aí a tabela e o que já tens feito em PHP

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosPT

Quartos:

-id_quarto;

-tipologia;

-preco_noite;

-regime;

Reservas:

-id_reserva;

-data_entrada;

-data_saida;

-id_quarto;

Tenho isto em php, mas a query que tenho não me retorna aquilo que eu quero

<?php
header ("Content-type: text/html; charset=ISO-8859-1",true);

$chegada = $_POST['chegada'];
$saida = $_POST['saida'];

//ligar ao SGBD e escolher DB através do include
include ("ligarBD.php");

//ínicio de accção sobre a BD
$listar = "SELECT * FROM `quartos` WHERE not (reservas.data_entrada > '".$chegada."' and reservas.data_saida < '".$saida."')";



$faz_listar = mysqli_query($ligarBD, $listar);
$num_registos = mysqli_num_rows($faz_listar);

//Verificação de registos
if($num_registos == 0){
echo "<p> Não existem quartos disponíveis, por favor seleccione outra data!";
echo '<p> <a href="index.html"> Voltar </a>';
exit;
}

echo 'Para a sua data selecionada, temos disponíveis: ' .$num_registos. 'quartos!';
?>

<table border="1">
<tr>
<th> Número de quarto </th>
<th> Tipologia </th>
<th> Capacidade </th>
<th> Preço </th>
<th> Regime </th>
</tr>

<?php
for ($i=0;$i<$num_registos;$i++){
$registos = mysqli_fetch_array($faz_listar);
echo '<tr>';
echo '<td>'.$registos['id_quarto'].'</td>';
echo '<td>'.$registos['tipologia'].'</td>';
echo '<td>'.$registos['num_pessoas'].'</td>';
echo '<td>'.$registos['preco_noite'].'</td>';
echo '<td>'.$registos['regime'].'</td>';
echo '</tr>';
}
?>
</table>

Editado por thoga31
Tags code + GeSHi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ruicosta.web

Bom dia,

Coloca este código no topo do teu ficheiro para mostrar todos os erros e avisos:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

Uma forma simples de analisares se o teu sql está correto:

$listar = "SELECT * FROM `quartos` WHERE not (reservas.data_entrada > '".$chegada."' and reservas.data_saida < '".$saida."')";
echo $listar;

fazes copiar/colar do sql para o phpmyadmin (por exemplo) e executas diretamente na BD para saberes se retorna algo, se retornar, o problema não será do sql...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f

Boas,

no teu sql, onde tens por exemplo "reservas.data_entrada", o que é "reservas"? é que não indicas esta tabela no FROM....

Depois tens que unir as duas tabelas com quartos.id_quarto=reservas.id_quarto.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosPT

Boas,

Desde já obrigado pela ajuda.

O que eu pretendia, era que, quando no formulário HTML inserisse uma data de entrada e uma data de saída, tivesse um retorno dos quartos que estão disponíveis para essas datas. E não estou a conseguir obter a query para isso. Já tentei com um join mas não dá à mesma. Ninguém sabe como se faz a query? Precisava mesmo

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Já tentei com um join mas não dá à mesma. Ninguém sabe como se faz a query? Precisava mesmo

o problema não é arranjar alguém que saiba fazer a query, mas é sempre arranjar alguém que saiba explicar qual é o problema ...

não vou explicar a query, porque não tenho tempo, mas basicamente o que pretendes é:

"todos os quartos que não tem uma reserva para as datas mercadas."

$listar = "SELECT *
            FROM quartos
           WHERE id_quarto NOT IN (SELECT quartos.id_quarto
                                     FROM quartos INNER JOIN reservas ON quartos.id_quarto = reservas.id_reservas

WHERE '{$chegada}' < reservas.data_saida and '{$saida}' > reservas.data_chegada";

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f

Oi,

tiraste-me as palavras da "textbox" :)

Só um comentário/ajuste ao query (não é preciso o inner join e o "ON" está a comparar os campos incorrectos)

$listar = "SELECT *
FROM quartos
WHERE id_quarto NOT IN (
   SELECT id_quarto
   FROM reservas
   WHERE '{$chegada}' <= reservas.data_saida and '{$saida}' >= reservas.data_chegada";
   )";

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosPT

Boas,

Depois de ter inserido a query que me disseram, ao fazer a pesquisa dá-me este erro:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\Testar\listardados.php on line 18.

Tendo isto no meu php, não consigo identificar o erro:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);


header ("Content-type: text/html; charset=ISO-8859-1",true);

$chegada = $_POST['chegada'];
$saida = $_POST['saida'];

//ligar ao SGBD e escolher DB através do include
include ("ligarBD.php");

//Início da ação sobre a base de dados
$listar = "SELECT * FROM quartos WHERE id_quarto NOT IN (SELECT id_quarto FROM reservas WHERE '".$chegada."' <= reservas.data_saida and '".$saida."' >= reservas.data_chegada)";
$faz_listar = mysqli_query($ligarBD, $listar);
$num_registos = mysqli_num_rows($faz_listar);

//Verificação de registos
if($num_registos==0) {
echo "<p> Não existem quartos para listar!";
echo '<a href="Projeto_Teste.html"> Voltar </a>';
exit;
}

echo 'Número total de registos encontrados:' .$num_registos;
?>

<table border="1">
<tr>
<th>ID Quarto</th>
<th>Tipologia</th>
<th>Número de Pessoas</th>
<th>Preço por noite</th>
<th>Regime</th>
<th>Disponibilidade</th>
</tr>

<?php
for ($i=0; $i<$num_registos; $i++){
$registos = mysqli_fetch_array($faz_listar);
echo '<tr>';
echo '<td>'.$registos['id_quarto'].'</td>';
echo '<td>'.$registos['tipologia'].'</td>';
echo '<td>'.$registos['num_pessoas'].'</td>';
echo '<td>'.$registos['preco_noite'].'</td>';
echo '<td>'.$registos['regime'].'</td>';
echo '<td>'.$registos['disponibilidade'].'</td>';
echo '</tr>';
}
?>
</table>

Alguém me pode ajudar?

Obrigado pela ajuda

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f

Deves testar o retorno do mysqli_query antes de o passares ao mysqli_num_rows.

Quando há um erro no query (que é provavelmente o caso) o retorno é FALSE. Daí ele queixar-se que estás a passar um boolean.

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

verifica qual é o erro:

if (($faz_listar = mysqli_query($ligarBD, $listar)) === false) {
 echo mysqli_error($ligarBD);
 die();
}

agora diz qual a mensagem que te é apresentada


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
CarlosPT

Boas,

Agora aparece-me este erro: Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in C:\xampp\htdocs\Testar\listardados.php on line 18

Unknown column 'reservas.data_chegada' in 'where clause'

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Cerzedelo

Na indicação que deu da base de dados, na tabela reservas, não existe nenhum campo, com o nome data_chegada. É isso que o aviso esta a indicar, que não existe o campo data_chegada.

Editado por Cerzedelo
  • Voto 1

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.