使用PHP将多选框数据存储在MySQL数据库中

5
我希望能够将多个复选框的值存储到数据库的一个字段中。(例如:1、24、56、100)。我想知道如何实现这一点,如果我想在查询中调用变量,PHP又是如何从数据库中读取这些值的?
基本上,我正在创建一个博客应用程序(为了好玩和经验),我希望用户能够通过复选框更改每篇博客文章的可见性。我知道你可能会想为什么我不为每篇博客文章设置一个可见性字段。我明白为什么不建议这样做,但我想不出其他方法来实现这一点。再解释一下:我想将此应用程序附加到我已经构建的CMS上,基本上我有一个博客文章表,然后我希望用户能够转到其站点内的不同页面并添加博客。那么,如果用户想在3个不同的页面上使用相同的博客,但只想在每个页面上显示特定的文章,那该怎么办呢?所以我现在很困惑。

1
您正在要求存储非规范化数据,这并不推荐。如果您想提取复选框值的任何信息,那么将需要付出很多努力,而这是可以避免的。 - OMG Ponies
2
将多个值存储在一个列中是不明智的。相反,应创建一个规范化的表格,其中包含两个列 - 一个外键指向帖子ID,另一个是复选框值。该表格允许重复的帖子ID。 - Michael Berkowski
http://php.net/manual/zh/function.implode.php http://php.net/manual/zh/function.explode.php - Farzher
我明白为什么不建议这样做,但我想不到其他的方法。再解释一下:我想将这个应用程序附加到我已经构建的CMS上,基本上我有一个博客文章的表格,然后我希望用户能够在他们的网站内访问不同的页面并添加博客。那么,如果用户想在3个不同的页面上使用相同的博客,但只想在每个页面上显示特定的文章呢?所以现在我很困惑。 - drummer392
我知道你的问题已经得到了回答,但是关于你在上面评论中提到的问题,你可以简单地创建一个具有postID+pageID作为外键的表格,这将保留post、page的值,以便你只能在某些页面中显示特定的帖子。(该表不需要具有主键,但在任何情况下,你都可以拥有一个自动递增的临时id列)。这样你就可以拥有post/page的映射。我相信这就是OMG Ponies和Michael Berkwoski在他们的评论中向你推荐的。 - George
4个回答

15

尽管我不赞成这种保存数据的方式,但如果您真的想要这样做,可以尝试以下方法。我建议您创建一个非规范化的表,并将值存储在其中。

在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"]);

在从数据库读取数据的地方,您可以像这样将值从数据库转换为数组

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

希望这有所帮助


我认为这会起作用!我知道不推荐这样做的原因,但我想不到其他方法。再解释一下:我想将此应用程序附加到我已经构建的CMS上,基本上我有一个带有博客文章的表格,然后我希望用户能够在其站点的不同页面上添加博客。那么,如果用户想在3个不同的页面上使用相同的博客,但只想在每个页面上显示某些文章,该怎么办呢?所以现在我很困惑。 - drummer392

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连接.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文件。
<?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
请更加注意你的代码格式,否则很难阅读 :-) - kleopatra

1

这个问题的完美解决方案是创建规范化表,正如@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);

-1

你需要先学习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"; }
?>

查看通过W3Schools连接MySQL

好的,你所做的是连接到数据库服务器。但你尚未选择数据库。可以将其视作前往电影院观影,你仍需选择想看的电影。

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

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

查看通过W3Schools进行的mysql_select_db

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

大致如下:

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

查看通过W3Schools学习SELECT语句

根据您的表格设置,这将为您获取当前用户的列表。我假设您已经拥有用户ID(或获取其ID的方法),因为他们有能力为该网站定义自己的首选项。

现在您已经有了用于获取文章的SQL查询语句,您需要查询数据库。

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

这样就可以得到你需要的ID列表。

我会让你自己解决剩下的问题。这很简单,而且你现在拥有所有需要的工具。唯一需要注意的是 explodeforeach

所以,存储它们的方式取决于你。当以这种方式存储时,请查看 explode 的用法以将它们分割。


3
-1,w3schools的PHP材料质量令人不敢恭维。它们都有糟糕的实践方法。他们的示例充满了SQL注入和跨站点脚本漏洞。无论如何都不要推荐它们。 - Charles
我认为这不应该被视为圣经,但它们解释了基础知识。初学者需要的是功能性,让他们能够开始运行。随着他们的成长,你可以向他们介绍其他概念。这样做可以避免让正在学习的人感到不知所措。有很多安全和加固资源可供使用,我会继续推荐它们。 - Tango Bravo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接