2009-12-06 7 views
2

J'ai ce script qui permet seulement aux utilisateurs d'entrer un seul tag mais je veux laisser les utilisateurs entrer plusieurs tags qui sont séparés par une virgule, par exemple, shoe, shirt, hat, glasses et stocker chaque tag dans la base de données .PHP/MySQL - Comment ajouter plusieurs tags

Quelqu'un peut-il s'il vous plaît me donner quelques exemples de ce que je dois changer dans mon script dans l'ordre de le faire.

Voici mes tables MySQL ci-dessous.

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

Voici le script ci-dessous.

<?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); 
} 
?> 

Répondre

2

vous pouvez utiliser explode()

Pour obtenir un tableau de balises séparées par des virgules

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

boucle Ensuite, vous pouvez à travers le réseau à insérer dans la base de données

Vous pourriez aussi voulez que votre requête pour inclure Créer UNIQUE

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

De cette façon, vous avez l'habitude de deux balises avec le même nom. Regardez ici pour plus d'explications sur la syntaxe UNIQUE

sans codage Here goes test 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)"); 
    } 
} 
+0

où dois-je ajoutez ceci à dans mon code? – MyHeadHurts

+0

donnez-moi un sec il modifier le code –

+0

Je ne vraiment utiliser mysqli est-il ok si je vous montre la manière de base –

1

Évitez les sous-requêtes tout mysql_insert_id() fournir un bon résultat pour atteindre le même.

Une autre chose - chèque $_POST['tags'] pour une virgule avant explode() pour vous assurer que vous obtenez un tableau et vérifier aussi dans la boucle si trim($tags[$x]) == '' (ce qui peut avoir lieu si $ _POST [ « tags »] serait, par exemple :.. $_POST['tags'] === "tag1," ou "tag1, "

et non lié à la question elle-même, mais essayez de utiliser une seule connexion db par demande (tant qu'il n'y a pas de bonne raison de le faire autrement)

Questions connexes