Хранение нескольких тегов в базе данных MySQL с помощью PHP / MySQL?

0

Сначала позвольте мне объяснить, что у меня есть этот script, который должен позволить пользователям вводить несколько тегов, разделенных запятой, например, shoe, shirt, hat, glasses и хранить каждый тег в базе данных.

Но по какой-то причине теги не хранятся в базе данных правильно. Например, когда пользователь вводит два или более тега, они сохраняются в одной и той же строке вместо того, чтобы отображать их в собственных строках, а теги даже не вводятся в базу данных, только введена пустая строка?

Может кто-нибудь, пожалуйста, дайте мне пару примеров того, что мне нужно изменить в моем script для исправления этой проблемы?

Ниже приведены таблицы mysql.

CREATE TABLE questions_tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
tag_id INT UNSIGNED NOT NULL,
users_questions_id INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
);

CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
tag VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE('tag')
);

Вот script.

<?php 
require_once ('./mysqli_connect.php');

if (isset($_POST['submitted'])) {
        $mysqli = new mysqli("localhost", "root", "", "sitename");
        $dbc = mysqli_query($mysqli,"SELECT questions_tags.*, tags.* FROM questions_tags, tags");
    if (!$dbc) {
        print mysqli_error($mysqli);
    }
$page = '3';

$tag = mysqli_real_escape_string($mysqli, $_POST['tag']);

$mysqli = new mysqli("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"SELECT questions_tags.*, tags.* FROM questions_tags INNER JOIN tags ON tags.id = questions_tags.tag_id WHERE questions_tags.users_questions_id=3");
if(mysqli_num_rows($dbc) >= 0){

if (isset($_POST['tag'])){
    $tags = explode(",", $_POST['tag']);

    for ($x = 0; $x < count($tags); $x++){

$mysqli = new mysqli("localhost", "root", "", "sitename");
$clean_url = mysqli_real_escape_string($mysqli, $page);

$query1 = "INSERT INTO tags (tag) VALUES ('$tags[x]')";

if (!mysqli_query($mysqli, $query1)) {
    print mysqli_error($mysqli);
    return;
}

$mysqli = new mysqli("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"SELECT id FROM tags WHERE tag='$tags[x]'");
    }
}

if (!$dbc) {
    print mysqli_error($mysqli);
}  else {
    while($row = mysqli_fetch_array($dbc)){
        $id = $row["id"];
    }
}

$query2 = "INSERT INTO questions_tags (tag_id, users_questions_id) VALUES ('$id', '$page')";

if (!mysqli_query($mysqli, $query2)) {
    print mysqli_error($mysqli);
    return;
}

echo "$tag has been entered";

    if (!$dbc) {
            print mysqli_error($mysqli);
    }
}
mysqli_close($mysqli);
}
?>
Теги:

2 ответа

0
Лучший ответ

замените это:

$query1 = "INSERT INTO tags (tag) VALUES ('$tags[x]')";

с этим:

$query1 = "INSERT INTO tags (tag) VALUES ('" . $tags[$x] . "')";

и BTW, вам необходимо защитить от sql-инъекций и XSS

update: вам также необходимо заменить это:

$dbc = mysqli_query($mysqli,"SELECT id FROM tags WHERE tag='$tags[x]'");

с этим

$dbc = mysqli_query($mysqli,"SELECT id FROM tags WHERE tag='" . $tags[$x] . "'");

x - это переменная... должна использовать $x

Update2: код questions_tags должен находиться внутри цикла for

Здесь фиксированный код

<?php
require_once ('./mysqli_connect.php');

if (isset($_POST['submitted'])) {
    $mysqli = new mysqli("localhost", "root", "", "sitename");
    $dbc = mysqli_query($mysqli,"SELECT questions_tags.*, tags.* FROM questions_tags, tags");
    if (!$dbc) {
        print mysqli_error($mysqli);
    }
    $page = '3';

    $tag = mysqli_real_escape_string($mysqli, $_POST['tag']);

    $mysqli = new mysqli("localhost", "root", "", "sitename");
    $dbc = mysqli_query($mysqli,"SELECT questions_tags.*, tags.* FROM questions_tags INNER JOIN tags ON tags.id = questions_tags.tag_id WHERE questions_tags.users_questions_id=3");
    if(mysqli_num_rows($dbc) >= 0){

        if (isset($_POST['tag'])) {
            $tags = explode(",", $_POST['tag']);

            for ($x = 0; $x < count($tags); $x++){

                $mysqli = new mysqli("localhost", "root", "", "sitename");
                $clean_url = mysqli_real_escape_string($mysqli, $page);

                $query1 = "INSERT INTO tags (tag) VALUES ('" . $tags[$x] . "')";

                if (!mysqli_query($mysqli, $query1)) {
                    print mysqli_error($mysqli);
                    return;
                }

                $mysqli = new mysqli("localhost", "root", "", "sitename");
                $dbc = mysqli_query($mysqli,"SELECT id FROM tags WHERE tag='" . $tags[$x] . "'");


                if (!$dbc) {
                    print mysqli_error($mysqli);
                }  else {
                    while($row = mysqli_fetch_array($dbc)){
                        $id = $row["id"];
                    }
                }

                $query2 = "INSERT INTO questions_tags (tag_id, users_questions_id) VALUES ('$id', '$page')";

                if (!mysqli_query($mysqli, $query2)) {
                    print mysqli_error($mysqli);
                    return;
                }

                echo "$tag has been entered";
            }
        }

        // is this needed?
        // if (!$dbc) {
        //   print mysqli_error($mysqli);
        // }
    }
    mysqli_close($mysqli);
}
?>
  • 0
    Теперь он не обновляет мою таблицу questions_tags правильно и хранит всю информацию о тегах в одной строке?
  • 0
    обновил ответ .. попробуй
Показать ещё 4 комментария
1

Посмотрите explode(), чтобы разделить список введенных тегов. Перейдите по списку с помощью цикла foreach/for и вставьте каждый тег отдельно.

С наилучшими пожеланиями,
Fabian

Ещё вопросы

Сообщество Overcoder
Наверх
Меню