проблема категории форума - PullRequest
1 голос
/ 20 июля 2010

У меня есть форум, и на этом форуме люди могут создавать темы в выбранной ими категории, но я хочу проверить, существует ли категория, но я не знаю, как, потому что знаю, если я введу другой номер категории в 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 ]

1 голос
/ 20 июля 2010

Я думаю, у вас есть логические ошибки. Я отчасти догадываюсь, как работает скрипт, потому что я не знаю, что означают имена переменных (они на шведском?). Вот мои мысли:

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

Выберите количество раз каждой строки , которое соответствует идентификатору вашей категории. Это всегда будет 1. Я рекомендую SELECT COUNT(*) AS раз FROM 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 из закрытого соединения .

Итак, учитывая все это, я думаю, что вы можете просто сделать это, убедившись, что они используют действительный идентификатор категории, который, как я предполагаю, находится в другой базе данных, 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.";
}

Помогает ли это?

0 голосов
/ 20 июля 2010
"SELECT count(fk_forum_kategori) As t_id 

Вероятно, это не то, что вы хотите здесь.Использование count () вернет число строк, соответствующих критериям, соответствующим этому, в вашем запросе SQL, поэтому, скорее всего, вам всегда будет показан номер категории 1 (поскольку каждый номер категории будет отображаться в базе данных только один раз).

Вы, вероятно, захотите что-то вроде этого:

"SELECT fk_forum_kategori FROM forum_traad WHERE fk_forum_kategori = '$kategoriID'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...