#php #mysql
#php #mysql
Вопрос:
Мне было интересно, как я могу обновить две мои таблицы базы данных, используя PHP и MySQL? Я хочу добавить вторую таблицу с именем tags_2, которая проверит, существует ли тег уже, и если он существует, добавит его к текущему количеству в таблице, и если тег не существует, добавьте его в таблицу.
Надеюсь, я правильно это объяснил?
Мне в основном нужна помощь в добавлении правильного кода в нужных местах по какой-то причине это ставило меня в тупик весь день? Я заставил первую таблицу работать, но не вторую?
Ниже приведены мои таблицы MySQL.
CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
page TEXT NOT NULL,
tag VARCHAR(255) NOT NULL,
count INT NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE tags_2 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
tag VARCHAR(255) NOT NULL,
count INT NOT NULL,
PRIMARY KEY (id)
);
И вот мой PHP-скрипт ниже.
<?php
require_once ('./mysqli_connect.php');
if (isset($_POST['submitted'])){
$mysqli = new mysqli("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"SELECT * FROM tags");
if (!$dbc) {
print mysqli_error($mysqli);
}
$page = $_SERVER['SCRIPT_FILENAME'];
$tag = mysqli_real_escape_string($mysqli, $_POST['tag']);
$mysqli = new mysqli("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"SELECT id, count, page FROM tags WHERE tag='$tag' AND page = '$page'");
if(mysqli_num_rows($dbc)){
$tag_info = mysqli_fetch_array($dbc);
$tag_info_id = $tag_info["id"];
$tag_info_count = $tag_info["count"] 1;
$mysqli = new mysqli("localhost", "root", "", "sitename");
$dbc = mysqli_query($mysqli,"UPDATE tags SET count='$tag_info_count' WHERE id='$tag_info_id'");
echo "$tag now with $tag_info_count instances";
} else {
$mysqli = new mysqli("localhost", "root", "", "sitename");
$clean_url = mysqli_real_escape_string($mysqli, $page);
$dbc = mysqli_query($mysqli,"INSERT INTO tags (tag, count, page) VALUES ('$tag', 1, '$clean_url')");
if (!$dbc) {
print mysqli_error($mysqli);
}
echo "1 record added";
}
mysqli_close($mysqli);
}
?>
Будут ли таблицы выглядеть лучше вот так.
CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
page TEXT NOT NULL,
tag VARCHAR(255) NOT NULL,
count INT NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE tags_2 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
tag_id INT UNSIGNED NOT NULL DEFAULT 0,
tag VARCHAR(255) NOT NULL,
count INT NOT NULL,
PRIMARY KEY (id)
);
Ответ №1:
Во-первых, ваша схема не нормализована. Поместите все данные о тегах в одну таблицу. Поместите данные о страницах в другую таблицу. В таблицу Pages включите внешний ключ, который ссылается на первичный ключ таблицы tags:
CREATE TABLE pages(
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
page TEXT NOT NULL,
tag_id INT UNSIGNED,
tag_count INT NOT NULL DEFAULT 0, //count is a reserved word
PRIMARY KEY (id),
FOREIGN KEY (tag_id) REFERENCES tags(id)
ON DELETE RESTRICT
);
CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
tag VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
Затем, в псевдокоде, ваши запросы становятся:
$var= SELECT id FROM tags WHERE tag='somestring';
if $var!=0 {
UPDATE pages SET tag_id=$var,
tag_count=tag_count 1
WHERE page_id='a page id';
}
Комментарии:
1. не было бы лучше, если бы я просто проверил, совпадает ли имя тега с именем другого тега в первой таблице?
2. mysql требуется больше времени для проверки с помощью VARCHAR, чем для проверки с помощью INT … если ваша база данных растет, проверка каждого имени будет занимать все больше и больше времени, чтобы вернуть результат … лучше всего реализовать, как предлагает dnagirl.
3. но я не буду указывать, какой тег какому идентификатору принадлежит, когда пользователи отправляют тег. Как мне бороться с этой проблемой.
4. вы просматриваете свой тег в таблице tags и получаете его идентификатор. Если тег существует, используйте идентификатор для обновления таблицы pages. Если тег не существует, вставьте его в таблицу tags, получите его идентификатор, а затем обновите таблицу pages.