2012-11-15 3 views
1

EDIT : 업데이트! 첫 번째 부분이 작동했습니다. 그러나, 같은 IF() 문 내에서 다른 변수를 확인하는 방법을 잘 모르겠습니다. 누구든지 저를 도울 수 있습니까? 단일 if 문은 입력과 똑같은 이름의 클래스를 거부합니다. 그러나, 나는 또한 동등한 Days and Times를 거절해야합니다.모든 레코드 대신 첫 번째 레코드 만 확인

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Register Diver</title> 
<link rel="stylesheet" href="php_styles.css" type="text/css" /> 
<meta http-equiv="content-type" 
content="text/html; charset=iso-8859-1" /> 
</head> 
<body> 
<h1>Aqua Don's Scuba School</h1> 
<h2>Registration Confirmation</h2> 
<?php 
$DiverID = $_GET['diverID']; 
if (empty($DiverID)) 
    exit("<p>You must enter a diver ID! Click your browser's Back button to return to the previous page.</p>"); 
$DBConnect = @mysqli_connect("localhost", "students", "password") 
    Or die("<p>Unable to connect to the database server.</p>" 
    . "<p>Error code " . mysqli_connect_errno() 
    . ": " . mysqli_connect_error()) . "</p>"; 
$DBName = "scuba_school"; 
@mysqli_select_db($DBConnect, $DBName) 
    Or die("<p>Unable to select the database.</p>" 
    . "<p>Error code " . mysqli_errno($DBConnect) 
    . ": " . mysqli_error($DBConnect)) . "</p>"; 

$TableName = "registration"; 
$SQLstring = "SELECT * FROM $TableName"; 
$QueryResult = @mysqli_query($DBConnect, $SQLstring); 
if (!$QueryResult) { 
    $SQLstring = "CREATE TABLE registration (diverID SMALLINT, class VARCHAR(40), days VARCHAR(40), time VARCHAR(40))"; 
    $QueryResult = @mysqli_query($DBConnect, $SQLstring) 
     Or die("<p>Unable to create the registration table.</p>" 
     . "<p>Error code " . mysqli_errno($DBConnect) 
     . ": " . mysqli_error($DBConnect)) . "</p>"; 
    echo "<p>Successfully created the registration table.</p>"; 
} 
?> 

<?php 
$Class = $_GET['class']; 
$Days = $_GET['days']; 
$Time = $_GET['time']; 
$DiverID = $_GET['diverID']; 

$DBConnect = mysqli_connect("localhost", "students", "password"); 
$DBName = "scuba_school"; 
@mysqli_select_db($DBConnect, $DBName) 
    Or die("<p>Unable to select the database.</p>" 
    . "<p>Error code " . mysqli_errno($DBConnect) 
    . ": " . mysqli_error($DBConnect)) . "</p>"; 


$sqlString= "SELECT * FROM `registration` WHERE `diverID` = $DiverID AND `class` = '$Class' AND `days` = '$Days' AND `time` = '$Time'"; 
$QueryResult = mysqli_query($DBConnect, $sqlString) or die("MySQL error: " . mysqli_error($DBConnect) . "<hr>\nQuery: $QueryResult"); 
$row = mysqli_fetch_assoc($QueryResult); 

if ($row["class"] == $Class) 
{ 

echo "<p>You are already registered for $Class</p>"; 
    } 

    elseif($row["days"] == $Days && $row["time"] == $Time) 
    { 
     echo "<p>There is a conflict with $Days or $Time</p>"; 
     } 
else 
{ 
$SQLstring = "INSERT INTO $TableName VALUES('$DiverID', '$Class', '$Days', '$Time')"; 
    $QueryResult = @mysqli_query($DBConnect, $SQLstring); 
    echo "<p>You are registered for $Class on $Days, $Time. Click your browser's Back button to register for another course or review your schedule.</p>"; 
} 


mysqli_close($DBConnect); 
?> 

</body> 
</html> 

답변

0

사용하는 사람이 다른 사람 = 좋은 나쁜 =가 발견되면 다음 "말"이 세부 사항을 가진 사람을 찾아 "라는 쿼리 예를 들면 다음과 같습니다.

다음
SELECT ID FROM $TableName WHERE DiverID = '$DiverId', class = '$class', days='$Days' LIMIT 1 

해당 쿼리를 실행, 그것은 아무도 찾을 수없는 경우는 아무것도 (if(count($results) > 0)...) 다음 오류를 표시 (또는 무엇이든)을 발견하는 경우 다음의 세부 사항을 추가하는 것이 안전합니다

보너스 :. 보조 노트로 , PDO로 찾아보세요 (mysql_* 개 기능은 PHP-땅에서 no longer supported)을하고), 필터링 그리고 그들은 그것을 위해 구글 (데이터베이스 쿼리로 이동하기 전에 입력을 소독해야합니다

0

쿼리 후 상태가

//change this 
if ($row['class'] == "$Class") 
{ 
    echo "<p>You are already registered for $Class</p>"; 
} 

//to this 
if(!empty($row)) 
{ 
    if ($row['class'] == "$Class") 
     echo "<p>You are already registered for $Class</p>"; 
} 
0

귀하의 문제 거짓말 나쁜 여기 :

SELECT * FROM $TableName WHERE `diverID` = $DiverID 

당신은 에 대한 diverIDclass을 무시하는 것이 일치하는 모든 기록을 데이터베이스를 조회하고 있습니다. 예를 들어, 어떤 다이버가 다른 클래스에 등록되어있는 경우 쿼리는 해당 레코드를 검색 할 수도 있고 검색하지 않을 수도 있습니다. 당신은 somethingl 이케를 원하는 :

말했다되고 그건
// this is for simplicity's sake only; please escape your input in your code!! 

$sql = "SELECT * FROM $TableName WHERE `diverID` = $DiverID AND `class` = '$Class'" 
$query = mysqli_query($sql); 

if (mysqli_num_rows($query)) { 
    // already registered 
} else { 
    // not registered, insert 
} 

...

  1. 하지 사용 @ (오류 억제)를 수행. 프로덕션 환경에서 오류보고 기능을 해제하십시오. 그러나 오류 (오류 방지)는 끔찍합니다.

  2. 코드를 SQL injection에 취약하게 두십시오. 이 악화 된 경우도 $_GET을 사용하고있어 CSRF 공격에 취약 할 수 있습니다.

  3. 즉시 테이블을 만들지 마십시오. 스크립트가 실행되기 전에 이미 테이블 구조를 준비해야합니다. 어떤 것이 든, 설치 스크립트에 의해 생성되어야합니다.

+0

문제는 3 가지 변수에 대해이 작업을 수행해야합니다. 클래스 1은 내가 생각했던 가장 쉬운 것이었다. 내가 각 행 아래로 내려갈 때 ++ 나 뭔가를 만들면 어떨까요? 저는 코딩을 잘 못하고 있습니다 ... 그리고 이것은 수업을위한 것입니다. 그래서 선생님이 제공 한 예를 떠나려고합니다. 그러나 이것에 대한 예는 없습니다. – Tandar

+0

코드를 업데이트 했으므로 다른 부분을 작동시키는 방법을 알 수 없습니다. 좀 봐 줄래? – Tandar

관련 문제