PHP / MySQL - Nasıl birden fazla etiket eklemek için

2 Cevap php

Ben sadece kullanıcıların tek bir etiket girebilir ama kullanıcılar, shoe, shirt, hat, glasses, örneğin bir virgül ile ayrılır birden fazla etiket girelim ve veritabanındaki her etiketi saklamak istediğiniz olanak sağlayan bu komut dosyası var.

Birisi bana ben sipariş yapmak benim komut değiştirmek için gereken ne bir kaç örnek verebilir misiniz.

İşte aşağıda benim MySQL tablo olduğunu.

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

Aşağıda yazısıdır.

<?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 Cevap

kullanabilirsiniz explode()

Virgülle ayrılmış etiketleri dizisini almak için

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

Sonra veritabanına dizi aracılığıyla döngü eklemek için olabilir

Ayrıca oluşturma Sorgu dahil etmek isteyebilirsiniz UNIQUE

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

Bu şekilde alışkanlık aynı ada sahip iki etiketleri var. UNIQUE sözdizimi hakkında daha fazla açıklama için buraya bakınız

Here Goes coding without testing 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)");
    }
}

Avoid subqueries mysql_insert_id(), aynı sonuç elde edilmesi için iyi bir görünüm sağlamaktadır.

Başka bir şey - check $_POST['tags'] önce bir virgül için $ _POST ['etiketler'], örneğin olurdu explode() to make sure you will get an array and also check in the loop if trim($tags[$x]) == '' (ne yer alabilir: {[( 3)]} veya "tag1, ".

Ve sorunun kendisi ile bağlı, ancak çalışmayın use only one db connection per request (sürece bunu başka bir şekilde yapmak için iyi bir neden var gibi).