【问题标题】:Storing multiple tags in a MySQL database problem using PHP/MySQL?使用 PHP/MySQL 在 MySQL 数据库中存储多个标签?
【发布时间】:2009-12-06 11:23:41
【问题描述】:

首先让我解释一下,我有这个脚本应该让用户输入多个用逗号分隔的标签,例如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),
UNIQUE('tag')
);

这是脚本。

<?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=3");
if(mysqli_num_rows($dbc) >= 0){

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

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

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

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

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='$tags[x]'");
    }
}

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    查看explode() 以分隔输入的标签列表。使用 foreach/for 循环遍历列表并分别插入每个标签。

    最好的祝愿,
    费边

    【讨论】:

      【解决方案2】:

      替换这个:

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

      用这个:

      $query1 = "INSERT INTO tags (tag) VALUES ('" . $tags[$x] . "')";
      

      顺便说一句,您需要保护sql injectionsXSS

      更新:你还需要替​​换这个:

      $dbc = mysqli_query($mysqli,"SELECT id FROM tags WHERE tag='$tags[x]'");
      

      有了这个

      $dbc = mysqli_query($mysqli,"SELECT id FROM tags WHERE tag='" . $tags[$x] . "'");
      

      x 是一个变量...必须使用$x

      Update2questions_tags 代码必须在 for 循环内

      这是固定代码

      <?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=3");
          if(mysqli_num_rows($dbc) >= 0){
      
              if (isset($_POST['tag'])) {
                  $tags = explode(",", $_POST['tag']);
      
                  for ($x = 0; $x < count($tags); $x++){
      
                      $mysqli = new mysqli("localhost", "root", "", "sitename");
                      $clean_url = mysqli_real_escape_string($mysqli, $page);
      
                      $query1 = "INSERT INTO tags (tag) VALUES ('" . $tags[$x] . "')";
      
                      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='" . $tags[$x] . "'");
      
      
                      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";
                  }
              }
      
              // is this needed?
              // if (!$dbc) {
              //   print mysqli_error($mysqli);
              // }
          }
          mysqli_close($mysqli);
      }
      ?>
      

      【讨论】:

      • 现在它没有正确更新我的 questions_tags 表,而是将所有标签信息存储在一行上?
      • 究竟是什么插入到数据库中?
      • 它只将一个标签与用户问题相关联,我希望它将所有标签与用户问题相关联。
      • 好的,我看到了问题.. 将标签插入questions_tags 的代码不在 for 循环中。它应该在其中,以便您为每个标签添加一个条目。我更新了我的答案。
      猜你喜欢
      • 2017-07-22
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多