2010-07-20 125 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."; 
} 

这有帮助吗?