【问题标题】:Storing Multiple Checkbox Data in MySQL Database with PHP使用 PHP 在 MySQL 数据库中存储多个复选框数据
【发布时间】:2016-09-14 18:18:44
【问题描述】:

我希望将多个复选框值存储到数据库的一个字段中。 (例如 1, 24,56,100)。我想知道如何实现这一点,如果我想在查询中调用变量,PHP 如何从数据库中读取这些值?

基本上我正在创建一个博客应用程序(为了乐趣和体验),我希望用户能够通过复选框更改每篇博客文章的可见性。我知道您可能在想,为什么我不为每篇博文设置一个可见性字段。我理解为什么不建议这样做,但我想不出任何其他方法来做到这一点。再解释一下:我想将此应用程序附加到我已经构建的 CMS 上,基本上我有一个包含博客文章的表格,然后我希望用户能够转到他们网站中的不同页面并添加一个博客。好吧,如果用户想在 3 个不同的页面上使用同一个博客,但只想在每个页面上显示某些帖子,该怎么办。所以这就是我现在很困惑的原因。

【问题讨论】:

  • 您要求存储非规范化数据,不建议这样做。如果你想提取关于复选框值的任何信息,这将是一个可以避免的大量工作。
  • 在一列中存储多个值是不明智的。而是创建一个包含两列的规范化表 - 帖子 ID 的外键和复选框值。该表中允许重复的帖子 ID。
  • 我明白为什么不建议这样做,但我想不出任何其他方法来做到这一点。再解释一下:我想将此应用程序附加到我已经构建的 CMS 上,基本上我有一个包含博客文章的表格,然后我希望用户能够转到他们网站中的不同页面并添加一个博客。好吧,如果用户想在 3 个不同的页面上使用同一个博客,但只想在每个页面上显示某些帖子,该怎么办。所以这就是我现在很困惑的原因。
  • 我知道您的问题已经得到解答,但是关于您在上述评论中提到的问题,您可以简单地创建一个以 postID+pageID 作为外键的表,这将保留值帖子,页面,以便您只能在某些页面中显示某些帖子。 (该表不需要有主键,但无论如何您都可以有一个自动增量临时 id 列)。这样您就可以获得帖子/页面的映射。我相信这是 OMG Ponies 和 Michael Berkwoski 在他们的 cmets 中向你推荐的

标签: php mysql denormalized


【解决方案1】:

尽管我不赞成这样保存数据,但如果你真的想那样做,你可以这样做。我建议你有一个非规范化表并将你的 val 存储在那里

在您的 HTML 中,您可以使用这样的复选框(考虑到您正在存储某种类型的 id)

<input type="checkbox" name="ids[]" value"1" />
<input type="checkbox" name="ids[]" value"24" />
<input type="checkbox" name="ids[]" value"56" />
<input type="checkbox" name="ids[]" value"100" />

在您的 php 端,您可以使用函数 implode 将 id 形成一个字符串,如下所示(考虑到您正在执行 POST)

$ids = implode(",",$_POST["ids"]);

在从数据库中读取的位置,您可以将值从 db 转换为这样的数组

$ids_array = explode(",",$row->ids);

希望对你有帮助

【讨论】:

  • 我认为这行得通!我理解为什么不建议这样做,但我想不出任何其他方法来做到这一点。再解释一下:我想将此应用程序附加到我已经构建的 CMS 上,基本上我有一个包含博客文章的表格,然后我希望用户能够转到他们网站中的不同页面并添加一个博客。好吧,如果用户想在 3 个不同的页面上使用同一个博客,但只想在每个页面上显示某些帖子,该怎么办。所以这就是我现在很困惑的原因。
【解决方案2】:

首先创建数据库:

create table employee(id int(10) not null, name varchar(20), hobbie varchar(20),
     worked varchar(20), primary key(id));

然后创建一个这样的html页面:

   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1    /DTD/xhtml1-transitional.dtd">
  <html xmlns="http://www.w3.org/1999/xhtml">
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Untitled Document</title>
 </head>

 <body>
 <body background="blue">
 <form action="check.php" method="post">
 Name: <input name="Name" type="text" id="Name" /><br />
<br />
  <br />
   Which you do you want to likes?<br />
         <input type="checkbox" name="Hobbies[]" value="Books" />Books<br />
    <input type="checkbox" name="Hobbies[]" value="Movies" />Movies<br />
   <input type="checkbox" name="Hobbies[]" value="Sports" />Sports<br />
  <input type="checkbox" name="Hobbies[]" value="Games" />Games<br />
  <input type="checkbox" name="Hobbies[]" value="Travelling" />Travelling<br />  

  worked: <input name="Worked" type="text" id="Worked" /><br />
   <br />

<input type="submit" name="submit" value="Submit" />
<input type="reset" name="reset" value="reset" />

 </form>
  </body>
 </html>

之后我们做了mysql connect.php

 <?php
 $server="localhost";
 $user="root";
 $password="";
 $database="empcheckbox";

 $link=mysql_connect($server,$user,$password) or die("the connection is terminated please      check me!".mysql_error());
mysql_select_db($database,$link);
 ?>

之后我们必须像这样创建一个 check.php ok

<?php

if(isset($_POST['submit']))
{
 $name=mysql_real_escape_string($_POST['Name']);
$worked=mysql_real_escape_string($_POST['Worked']);
$hobb= $_POST['Hobbies'];
if(empty($hobb)) 
    {
        echo("<p>You didn't select any any hobby.</p>\n");
    } 
    else 
    {
       $N = count($hobb);
        echo("<p>You selected $N Hobbies(s): ");
        for($i=0; $i < $N; $i++)
        {
            $var1=$hobb[$i];
            include ('connect.php');
            $table = "INSERT INTO employee (name, hobbies, worked) ".
                     "VALUES ('$name', '$var1', '$worked')";
            mysql_query($table) or die(mysql_error());
            $inserted_fid = mysql_insert_id();
            mysql_close();  
        }

        echo "successfully uploaded!..";
      }
}
else
 {
echo "error please check ur code";
}

【讨论】:

  • 请多注意您的代码格式,否则很难阅读:-)
【解决方案3】:

对此的完美解决方案是@OMG 和@Michael 评论的规范化表的创建任务。

但这是你刚才问的答案

$ids = implode(", ", $_POST['ids']);

将其存储在 MySQL 表中。您可以使用 LIKE 命令查询表并使用explode 获取数组中的id。

$query = "SELECT * FROM <table> WHERE ids LIKE '%,2, %'"; // get posts having id 2

$id = explode(", ", $result->ids);

【讨论】:

    【解决方案4】:

    您将需要了解 PHP 和 MySQL 的基础知识。

    查看 tizag.com 或 w3schools.com 或其他一些网站(教程很多)。

    这里是基础知识 - 请记住这一点,因为它会帮助您理解。

    MySQL 是一个数据库。数据库通常用于存储数据。 PHP 是一种编程语言。它通常用于编程。

    因此,一些优秀的开发人员已经完成了从 PHP 与数据库通信的步骤。您所要做的就是建立连接。

    <?php
        $con = mysql_connect("localhost","peter","abc123");
        if (!$con) {
            die('Could not connect: ' . mysql_error());
        } else { echo "Connection made"; }
    ?>
    

    mysql_connect via W3Schools

    好的,你在这里所做的就是连接到数据库服务器。您尚未选择数据库。把它想象成去电影院,你仍然需要选择一部电影来观看。

    所以,现在我们连接到我们的数据库:

        mysql_select_db("my_db", $con); //Notice we're using our connection, "$con"
    

    mysql_select_db via W3Schools

    连接到数据库后,您就可以从中获取一些信息了。
    为此,您需要创建 SQL 查询。

    一些事情的曲调:

    $sql = "SELECT article_id FROM user_view_blog_posts WHERE user_id = '$user_id'";
    

    the SELECT statement via W3Schools

    根据您的表的设置方式,这将为您提供当前用户的列表。我假设您已经有了用户的 id(或获取它的方法),因为他们有能力为网站定义自己的偏好。

    现在您有了获取文章的 SQL 查询,您需要查询数据库。

    $result = mysql_query($sql);
    // Now, get the data
    while($row = mysql_fetch_array($result)) {
        $articles[] = $row['article_id'];
    }
    

    这应该会为您提供所需的 ID 列表。

    我会让你弄清楚其余的。这非常简单,而且您已经拥有了您现在需要的所有工具。您可能想复习的唯一内容是explodeforeach

    因此,存储它们的方式取决于您。当它们以这种方式存储时,请查看爆炸以将它们拆分。

    【讨论】:

    • -1,w3schools 的 PHP 材料质量很差。他们每个人的做法都很糟糕。他们的示例充斥着 SQL 注入和跨站点脚本漏洞。在任何情况下都不要推荐它们。
    • 我不认为它应该被视为福音,但他们解释了基础知识。初学者需要启动和运行的是功能。随着他们的成长,你会向他们介绍其他概念。这样你就不会压倒正在学习的人。有很多资源可用于安全和强化。我会继续推荐他们。
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    相关资源
    最近更新 更多