PHP / MySQL - Как добавить несколько тегов - PullRequest
2 голосов
/ 06 декабря 2009

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

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

Вот мои таблицы 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)
);

Вот скрипт ниже.

<?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='$page'");

if(mysqli_num_rows($dbc) >= 0){

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

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

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='$tag'");

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 ]

2 голосов
/ 06 декабря 2009

вы можете использовать взорваться ()

Чтобы получить массив тегов, разделенных запятыми

$tag_string = "t1, t2, t3";
$tags = explode(",", $tag_string );
echo $tags[0]; // t1
echo $tags[1]; // t2

Затем вы можете перебрать массив для вставки в базу данных

Возможно, вы также захотите, чтобы ваш запрос на создание включал UNIQUE

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

Таким образом, у вас не будет двух тегов с одинаковым именем. Смотрите здесь для дальнейшего объяснения синтаксиса UNIQUE

Здесь идет кодирование без тестирования xD

//Assuming you have already added the question and the mysql_insert_Id() == 1
//where mysql_insert_Id() is the last id added to the question table

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

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

        //Due to unique it will only insert if the tag dosent already exist
        mysql_query("INSERT INTO tag VALUES(NULL, {$tags[x]})");

        //Add the relational Link
        mysql_query("INSERT INTO question_tag VALUES(NULL, (SELECT tags.Id FROM tags WHERE tags.tag = {$tags[x]}), 1)");
    }
}
1 голос
/ 06 декабря 2009

Избегайте подзапросов , в то время как mysql_insert_id() обеспечивает хороший результат для достижения того же.

Другое дело - проверить $_POST['tags'] на запятую перед explode(), чтобы убедиться, что вы получите массив, а также проверить в цикле, если trim($tags[$x]) == '' (что может произойти, если $ _POST [ 'теги'] будут, например: $_POST['tags'] === "tag1," или "tag1, ".

И не связан с самим вопросом, но попытайтесь использовать только одно соединение в дБ на запрос (если нет веских причин делать это иначе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...