2010-07-20 122 views
1

我有一個論壇,並在該論壇的人可以創建一個線程在他們選擇的類別,但我想檢查,如果類別存在,但我不知道如何,因爲知道如果我鍵入另一個類別號碼我仍然可以看到網頁。論壇類別的問題

這裏是我的代碼

$kategoriID = $_GET['kategoriID']; 

if(!isset($overskrift) || !isset($indhold) || !isset($fejl)) 
{ 
$overskrift = ""; 
$indhold = ""; 
$fejl = false; 


}#Lukker if isset overskrift,indhold 


if(isset($kategoriID)) 
{ 

    #tjek om kategori findes 
    $mysql = connect(); 
     $stmt = $mysql->prepare("SELECT count(fk_forum_kategori) As t_id FROM forum_traad WHERE fk_forum_kategori = '$kategoriID'") or die($mysql->error); 
     $stmt->bind_result($t_id); 
     $stmt->execute() or die($mysql->error); 
    $stmt->fetch(); 

    if($t_id <= 0) 
    { 
    echo $t_id; 
    $fejl == true; 
    echo "<br>HEj med dig!"; 
    exit(); 
    } 
}#Lukker isset 







if(isset($_POST['send'])) { 

$kategoriID = $_GET['kategoriID']; 
$overskrift = htmlspecialchars($_POST['overskrift']); 
$indhold = htmlspecialchars($_POST['indhold']); 
$godkendt = "ja"; 

if($fejl == true) 
{ 
    $error = "Denne kategori findes ikke"; 
} elseif(empty($overskrift) || empty($indhold)) { 
    $error = "Alle felter skal udfyldes"; 
} else { 
    $mysql = connect(); 
    $stmt = $mysql->prepare("INSERT INTO forum_traad (overskrift, indhold, fk_forum_kategori, brugernavn, dato, godkendt) VALUES (?,?,?,?,?,?)") or die($mysql->error); 
    $stmt->bind_param('ssisis', $overskrift, $indhold, $kategoriID, $_SESSION['username'], $dato, $godkendt) or die($mysql->error); 
    $stmt->execute(); 
    $stmt->close(); 

    $traadID = mysqli_insert_id($mysql); 

    header("location: forum.traad.php?traadID=$traadID&kategoriID=$kategoriID"); 
}#Lukker else 




}#Lukker isset send 
+0

+1,不知道爲什麼這是被拒絕,似乎是一個合理的問題。但是,這對我來說很困難,因爲我不瞭解任何變量名稱。 – jordanstephens 2010-07-20 19:07:34

+1

注意你的「kategoriID」上的SQL注入攻擊,如果用戶可以設置的話。 http://cwe.mitre.org/top25/#CWE-89 – David 2010-07-20 19:12:15

+0

@大衛,小心不管。 – jordanstephens 2010-07-20 20:03:43

回答

0
"SELECT count(fk_forum_kategori) As t_id 

可能不是你想要的這裏。使用count()將返回與您的SQL查詢中的條件相匹配的行數,因此可能會始終向您顯示類別編號1(因爲每個類別編號只會在數據庫中出現一次)。

你可能會想這樣的事情,而不是:

"SELECT fk_forum_kategori FROM forum_traad WHERE fk_forum_kategori = '$kategoriID'" 
+0

hollsk我怎麼回聲它,所以我可以測試它是否存在? – Simon 2010-07-20 19:22:16

+0

你可以使用bind_request()函數(就像你已經使用的那樣) - fk_forum_kategori的內容應該和以前一樣在$ t_id變量中。如果需要輸出更多列,然後將它們添加到以逗號分隔的SQL查詢中,然後將更多變量添加到bind_request(),逗號分隔符與列的順序相同。希望這可以幫助。 – hollsk 2010-07-20 20:40:03

1

我覺得你有一些邏輯錯誤。我有點猜測腳本是如何工作的,因爲我不知道變量名是什麼意思(他們是瑞典語?)。我這裏還有我的想法:

$kategoriID = $_GET['kategoriID']; 

if(!isset($overskrift) || !isset($indhold) || !isset($fejl)) 
{ 
$overskrift = ""; 
$indhold = ""; 
$fejl  = false; 
} 

如果未設置三者的變量,將它們所有爲默認值。我的猜測是,這是你的問題,三個之一是沒有設置,所以你總是使用默認值。

if(isset($kategoriID)) 
{ 
    $mysql = connect(); // let's assume this works 
    $stmt = $mysql->prepare("SELECT count(fk_forum_kategori) As t_id FROM forum_traad WHERE fk_forum_kategori = '$kategoriID'") or die($mysql->error); 

選擇的時間每個匹配您的類別ID存在行數量。這將永遠是1.我建議SELECT COUNT(*) ASFROM forum_traad WHERE fk_forum_kategori = '$kategoriID'(順便說一句,如果你正在做一個準備好的聲明,你通常會做$mysql->prepare("SELECT ... WHERE id = ?"); $mysql->bind_param('d', $id);)。

$stmt->bind_result($t_id); 
    $stmt->execute() or die($mysql->error); 
    $stmt->fetch(); 

    if($t_id <= 0) 
    { 
    echo $t_id; 
    $fejl == true; 
    echo "<br>HEj med dig!"; 
    exit(); 
    } 
} 

如果沒有給定類別的線程,請停止腳本的執行。

if(isset($_POST['send'])) 
{ 
    $kategoriID = $_GET['kategoriID']; 
    $overskrift = htmlspecialchars($_POST['overskrift']); 
    $indhold = htmlspecialchars($_POST['indhold']); 
    $godkendt = "ja"; 

    if($fejl == true) 
    { 
    $error = "Denne kategori findes ikke"; 
    } 
    elseif (empty($overskrift) || empty($indhold)) 
    { 
    $error = "Alle felter skal udfyldes"; 
    } 
    else 
    { 

用戶提交了他們的線程。首先,檢查他們是否缺少任何東西,如果是的話,設置一個有用的錯誤信息。如果一切正常:

$mysql = connect(); 
    $stmt = $mysql->prepare("INSERT INTO forum_traad (overskrift, indhold, fk_forum_kategori, brugernavn, dato, godkendt) VALUES (?,?,?,?,?,?)") or die($mysql->error); 
    $stmt->bind_param('ssisis', $overskrift, $indhold, $kategoriID, $_SESSION['username'], $dato, $godkendt) or die($mysql->error); 
    $stmt->execute(); 
    $stmt->close(); 

將新線程插入數據庫並關閉連接。

$traadID = mysqli_insert_id($mysql); 

    header("location: forum.traad.php?traadID=$traadID&kategoriID=$kategoriID"); 
    } 
} 

將用戶重定向到他們的新線程。但是,你想從關閉的連接中獲得最新的插入ID

因此,考慮到所有這一切,我認爲你可以簡單地通過驗證他們使用的是有效的類別ID,我假設在另一個數據庫中,fk_forum_kategori是該表的外鍵。這是我會做的:

$mysqli = connect(); 

function isValidCategory($id) { 
    $statement = $mysqli->prepare("SELECT * FROM `categories` WHERE `id` = ?"); 
    $statement->bind_params("i", $mysqli->real_escape_string($id)); 
    $statement->execute(); 
    $num_rows = $statement->num_rows; 
    $statement->close(); 
    if ($num_rows > 0) { 
    return true; 
    } else { 
    return false; 
    } 
    // or: 
    // return ($statement->num_rows > 0); 
    // or even, if you're happy with 0 being converted to false and everything else to true: 
    // return $statement->num_rows; 
} 

if (isValidCategory($_GET['category_id']) { 
    if (is_empty($_POST['title']) { 
    print "Missing title. Please go back and try again."; 
    return false; 
    } 
    if (is_empty($_POST['content']) { 
    print "Missing content. Please go back and try again."; 
    return false; 
    } 


    $statement = $mysqli->prepare("INSERT INTO `threads` (`title`, `content`, `author`, `category_id`, `created`) VALUES (?, ?, ?, ?, NOW())"); 
    $statement->bind_params("sssi", 
    $mysqli->real_escape_string($_POST['title']), 
    $mysqli->real_escape_string($_POST['content']), 
    $mysqli->real_escape_string($_SESSION['username']), 
    $mysqli->real_escape_string($_GET['category_id']), 
); 
    $statement->execute(); 
    $statement->close(); 

    if ($thread_id = $mysqli->insert_id()) { 
    header("Location: view_thread.php?thread_id=$thread_id"); 
    } else { 
    print "Sorry, we were unable to create your thread. Please go back and try again later."; 
    } 
} else { 
    print "Invalid category idea. Please go back and try again."; 
} 

這有幫助嗎?