论坛类别问题

时间:2010-07-20 19:02:36

标签: php mysqli

我有一个论坛,在那个论坛上,人们可以在他们选择的类别中创建一个帖子,但我想检查该类别是否存在,但我不知道如何,因为知道我是否在URL中输入另一个类别号码我仍然看到页面。

这是我的代码

    $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

2 个答案:

答案 0 :(得分: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'(顺便说一下,如果你正在做一个准备好的陈述,你通常会做{{1} }})。

$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();

将用户重定向到他们的新主题。但是,您正在尝试从已关闭的连接中获取最新的插入ID

所以,鉴于所有这些,我认为你可以通过验证他们使用的是有效的类别ID,我假设它在另一个数据库中, $traadID = mysqli_insert_id($mysql); header("location: forum.traad.php?traadID=$traadID&kategoriID=$kategoriID"); } } 是该表的外键。这就是我要做的事情:

fk_forum_kategori

这有帮助吗?

答案 1 :(得分:0)

"SELECT count(fk_forum_kategori) As t_id 

可能不是你想要的。使用count()将返回与SQL查询中的条件匹配的行数,因此它可能始终显示类别编号1(因为每个类别编号只会在数据库中出现一次)。

你可能会想要这样的东西:

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