2014-04-17 1 views
-1

PHP에서 간단한 예약 양식을 만들려고합니다.SELECT COUNT가 10보다 작거나 같으면 입력 예약 정보

동일한 날짜와 시간의 예약 금액이 10 개 이하인 경우 세부 정보를 테이블에 입력하고 싶습니다.

다른 건, "예약 실패! 우리는 그 당시에 완전히 예약되었습니다."라고 말하기를 원합니다.

문제 : ". 예약 실패는 우리가 완전히 그 시간에 예약하고"나는 그러나 내 모든 메시지가 다시 같은오고, 하나의 특정 날짜와 시간 및 테스트를 위해 현재 10 명 예약이 어쨌든. 아무것도 가져올 수 없습니다.

SELECT COUNT 쿼리없이 입력 프로세스를 테스트 한 결과 성공적으로 입력되었으므로 "작거나 같음"쿼리에 문제가 있음을 알 수 있습니다.

대단히 감사드립니다. 감사합니다

<?php 

require_once('lib/php/functions.php'); 
require_once('lib/php/db_connect.php'); 

//Grab Form Data 
$reservationName = trim($_POST['reservationName']); 
$reservationEmail = trim($_POST['reservationEmail']); 
$reservationNumber = trim($_POST['reservationNumber']); 
$reservationDate = trim($_POST['reservationDate']); 
$reservationTime = trim($_POST['reservationTime']); 

$submit = trim($_POST['submit']); 

$message = ''; 

if (!$db_server){ 
    die("Unable to connect to MySQL: " . mysqli_connect_error()); 
    $db_status = "not connected"; 
}else{ 

    //If submit comment pressed, get data and input 
    if (isset($submit) && $submit == 'Submit reservation'){  

     if ($reservationName&&$reservationEmail&&$reservationNumber&&$reservationDate&&$reservationTime){ 

      $reservationName = clean_string($db_server, $reservationName); 
      $reservationEmail = clean_string($db_server, $reservationEmail); 
      $reservationNumber = clean_string($db_server, $reservationNumber); 
      $reservationDate = clean_string($db_server, $reservationDate);  
      $reservationTime = clean_string($db_server, $reservationTime); 
      mysqli_select_db($db_server, $db_database); 

      $query="SELECT COUNT(*) FROM reservations AS reservationCount WHERE reservationDate='$reservationDate' AND reservationTime='$reservationTime'"; 
      $result=mysqli_query($db_server, $query); 

      $row=mysqli_fetch_array($result); 

      if ($row <= 10){ 

       $query = "INSERT INTO reservations (reservationName, reservationEmail, reservationNumber, reservationDate, reservationTime) 
          VALUES ('$reservationName', '$reservationEmail', '$reservationNumber', '$reservationDate', '$reservationTime')"; 
       mysqli_select_db($db_server, $db_database); 
       mysqli_query($db_server, $query) or 
         die("Insert failed: " . mysqli_error($db_server)) . $query; 

       $message = "<p class='success'>Booking successful! See you soon.</p>"; 

      }else{ 

       $message = "<p class='fail'>Booking failure! We're fully booked at that time.</p>"; 
      }    

     }else{ 
      $message = "<p class='fail'>Booking failure! Please fill in all the fields.</p>"; 
     }  
    } 
}    
?> 
+5

@YourCommonSense 아 그 남자를 나서야, 나는 학생입니다 내 학습 과정이 진행되고있다. – jb93

+1

두 가지 문제가 있습니다. 1) 질의가 틀리며 2) 결과 검사가 잘못되었습니다. 내 대답을 확인해. – Latheesan

+0

@LatheesanKanes Latheesan 님이이 문제를 해결했습니다. – jb93

답변

2

우선 질문이 잘못되었습니다. 이에 업데이트 : 당신이 당신의 테이블 이름 뒤에 as reservationCount을 추가하는 경우,이 필드 별칭을 초래하지, 테이블 별명되고, 때문에 쿼리가 잘못된 이유를

$query="SELECT COUNT(*) AS reservationCount FROM reservations WHERE reservationDate='$reservationDate' AND reservationTime='$reservationTime'"; 

이유가 있었다.

if ($row['reservationCount'] <= 10){ 

추신 :

다음과 같은 검사를 수행하는 코드를 업데이트 귀하의 코드는 SQL Injection에 열려 있습니다. MySQLi 라이브러리를 객체 지향 방식으로 사용하고 params를 바인드하여 SQL 주입을 방지하십시오.

하는 예를 살펴 보자, 그것은 모두 권장 사항을 다룹니다 http://php.net/manual/en/mysqli.prepare.php#refsect1-mysqli.prepare-examples

+0

고마워,이 완벽하게 작동합니다. 한 번해볼 게요. – jb93

1

하나의 행의 COUNT(*) 반환 하나 개의 가치, 그리고 1 <= 10이 항상 참이기 때문에 항상 true가됩니다 있도록, 행의 수를 확인하고 있습니다. 변경 대상 :

if ($row[0] <= 10){ 
+0

의견을 보내 주셔서 감사합니다 Racil – jb93

+2

당신을 진심으로 환영합니다. Latheesan Kanes의 대답은 이름으로 값을 검색하려는 경우 좋지만 개인적으로 단일 값만 예상되는 경우 색인을 사용하는 것이 좋습니다. 이렇게하면 쿼리를 더 짧게 할 수 있습니다 (더 이상 필요하지 않기 때문에'AS reservationCount'를 제거 할 수 있습니다). 매번 대괄호 사이의 이름을 변경하지 않고'$ row [0]'을 다른 곳으로 복사하여 코드를 재사용하십시오 . 보너스로 인덱스를 기준으로 값을 검색하는 것은 한 값에 대해서는 무시할 수 있지만 조금 더 빠릅니다. –

관련 문제