PHP / MySQL как вставить и / или обновить две таблицы MySQL?

#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.