Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

CarlosPT

Query SQL

Recommended Posts

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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>

Edited by thoga31
Tags code + GeSHi

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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";

Edited by HappyHippyHippo

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

Share this post


Link to post
Share on other 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";
   )";

Edited by tiago.f

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Edited by tiago.f

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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'

Share this post


Link to post
Share on other 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.

Edited by Cerzedelo
  • Vote 1

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

×

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.