antiblock
https://arwen2.global/
  • Chatbox

    Did you check out our Discord? https://discord.gg/FFdvMjk9xA
    You don't have permission to chat.
    Load More
Sign in to follow this  
RachadoPT

[Ajuda] Problema Na Minha Pap

3 posts in this topic

Boas,

estou com dois problema na minha pap e gostava que me ajudassem, se puderem e conseguirem. É o seguinte, estou a tentar fazer a reserva de um quarto de hotel, e como é obvio, não basta um simples insert dos dados do formulario na base de dados, tem que haver confirmações de se o quarto já está reservado na data que a pessoa tenta reservar, etc...

 

O atual código que eu tenho é o seguinte:

<?php
  include('session.php');
  $_SESSION['action'] = 'inserir';
  
  if(isset($_POST['submit']))
  {
    include_once '../assets/inc/psl-config.php';
    $connection = new mysqli($db_host, $db_user, $db_pass, $db_database);
    if (mysqli_connect_errno())
    {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
    } else {
      $db = mysqli_select_db($connection, "pap");

      $cliente = mysqli_real_escape_string($connection, $_POST['cliente']);
      $quarto = mysqli_real_escape_string($connection, $_POST['quarto']);
      $data_i = date('Y-m-d', strtotime($_POST['data_inicio']));
      $data_i = mysqli_real_escape_string($connection, $data_i);
      $data_f = date('Y-m-d', strtotime($_POST['data_fim']));
      $data_f = mysqli_real_escape_string($connection, $data_f);
      $refeicoes = mysqli_real_escape_string($connection, $_POST['refeicoes']);
      
      $sql = "select * from reservas";
      $result = mysqli_query($connection, $sql);
      while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
        if($quarto == $row['quarto']){
          if(($data_i >= $row['data_inicio']) && ($data_i) <= $row['data_fim']) {
            $pode_reservar = 1;
          } else {
            $pode_reservar = 0;
          } 
        } else {
          $pode_reservar = 0;
        }
        if($pode_reservar == 0){
          if(mysqli_query($connection, "INSERT INTO reservas(cliente, quarto, data_inicio, data_fim, refeicoes) VALUES('$cliente','$quarto','$data_i','$data_f', '$refeicoes')"))
            {
              $sql = "SELECT * FROM quartos WHERE quarto='$quarto'";
              $query = mysqli_query($connection, $sql);
              while($row1 = mysqli_fetch_array($query, MYSQLI_ASSOC)){
                $reservas = $row1['reservas'] + 1;
                $sql = "UPDATE quartos SET reservas='$reservas' WHERE quarto='$quarto'";
                if($result = mysqli_query($connection, $sql)){
                  ?>
                    <script>alert('Inserido com sucesso!');</script>
                  <?php
                } else {
                  ?>
                    <script>alert('Falha ao inserir...');</script>
                  <?php
                }
              }
            } elseif($pode_reservar == 1){
              ?>
                <script>alert('Esse quarto já está reservado para esses dias.');</script>
              <?php
            }
        }
      }      
    }   
  }
?>

 

O problema está nesta parte:

while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
        if($quarto == $row['quarto']){
          if(($data_i >= $row['data_inicio']) && ($data_i) <= $row['data_fim']) {
            $pode_reservar = 1;
          } else {
            $pode_reservar = 0;
          } 
        } else {
          $pode_reservar = 0;
        } 

 

Ou seja, na confirmação do quarto para saber se pode ser reservado nessa data ou não, e os problemas são os seguintes:

 

Primeiro, no while dá-me o seguinte aviso:

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given in "diretorio" on line 25

 

Eu sei o que significa este aviso mas o problema é que mesmo dando este aviso, o código que se encontra dentro do while é todo executado na mesma, insere a reserva na tabela das reservas e aumenta uma reserva na tabela dos quartos.

 

Segundo, a confirmação da reserva dos quartos não está funcional, ou seja, consigo ter duas reservas do mesmo quarto para os mesmos dias ou para um dia em que o quarto ja esteja reservado para outro cliente... Não estou a ver outra maneira de fazer essa funcionalidade tirando como eu tenho e como eu tenho não funciona >>

 

Agradeço desde já a todos a vossa ajuda, ou tentativa de ajudar.

 

Cumprimentos,

RachadoPT

 

EDIT: O primeiro problema está resolvido... incrivel como em 4 horas de procura e com ajuda de dois professores não fui capaz de perceber que o problema estava somente em ter o inserir dentro do while da verificação... bastou-me separar os dois e já removeu o Warning... Mas o problema da confirmação das datas da reserva continua com problema, se puderem ajudar com isso por favor... :3

Share this post


Link to post
Share on other sites
antiblock
https://i.imgur.com/aJ17bf7.gif

Para o 1º problema dá echo ao $result e vê o que lá está dentro, esse erro geralmente dá quando temos um valor errado nessa variável.

Share this post


Link to post
Share on other sites

muito simples, fazes um select á tabela com essa data e vês se o array estar empty é porque está disponivél

 

$sql = "SELECT * FROM quartos WHERE data_inicio='$data_i'";

$query = mysqli_query($connection, $sql);
$row1 = mysqli_fetch_array($query, MYSQLI_ASSOC);

 

if(empty($row1)){

  // pode reservar

}

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
Sign in to follow this