0

在几个 Stack Overflow 成员的指导下,我得到了一个 PHP 表单来与我的 MySQL 数据库进行通信。现在,我为我的复选框使用了一个数组,并且信息确实到达了 MySQL 表……有点……

下面的代码会将所有记录插入数据库,但复选框对应的列具有值“数组”而不是分配的值...:

<?php
 function renderForm($articletitle, $articleorganization, $articledate, $articleurl,     $articletags )
 {
 ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <link rel="stylesheet" type="text/css" href="style.css">
  </head>
  <body>
    <div id="stylized" class="myform">
      <form id="form" name="form" action="" method="post">
. . .
          <input type="checkbox" name="articletags[]" value="checkbox" id="articletags_0" />
          <input type="checkbox" name="articletags[]" value="checkbox 2" id="articletags_1" />
. . .
        <footer><input type="submit" name="submit" value="Add this Article"></footer></form>
    </div>
  </body>
</html><?php 
 }
. . .

 if(count($articletags) > 0)
{
 $articletags_string = implode(",", $articletags);
}

 if (isset($_POST['submit']))
 { 
 $articletitle = mysql_real_escape_string(htmlspecialchars($_POST['articletitle']));
 $articleorganization = mysql_real_escape_string(htmlspecialchars($_POST['articleorganization']));
 $articledate = mysql_real_escape_string(htmlspecialchars($_POST['articledate']));
 $articleurl = mysql_real_escape_string(htmlspecialchars($_POST['articleurl']));
 $articletags = ($_POST['articletags']);

. . .
 mysql_query("INSERT articles SET articletitle='$articletitle',     articleorganization='$articleorganization', articledate='$articledate',     articleurl='$articleurl', articletags='$articletags' ")
 or die(mysql_error()); 


 header("Location:addsuccess.html"); 
 }
 }
 else

 {
 renderForm('','','','');
 }
?>
4

3 回答 3

4

由于$_POST['articletags']是一个数组,因此您必须在保存到表之前将其转换为字符串。替换这一行:

$articletags = ($_POST['articletags']);

有了这个:

$articletags = implode(',', $_POST['articletags']);
于 2012-06-08T06:29:26.277 回答
1

是的,您正在将数组值传递给您的数据库字段..为此,您必须执行一些转换方法。

您可以通过多种方式做到这一点。首先,您可以将数组值转换为字符串。

$articletags = implode(',', $_POST['articletags']);

其次,您可以将数组值转换为 json 格式,然后您可以输入数据库..

于 2012-06-08T06:35:51.477 回答
1

好的,我现在正在经历这个,这就是我的想法。

最好的方法,因为你有一个多对多的关系,是有三个表,让我们称它们为“main_table”、“tag_table”和“key_table”。如果我没记错的话,这将为您提供 3 级标准化。

将复选框的值放入数组中。当您上传信息时,首先将其他数据上传到“main_table” - 不要担心您的标签。然后获取您刚刚上传的 main_table 行的 ID 号。

现在在您的“标签”数组上使用 foreach 运算符,并生成一个字符串值以进入您的 INSERT INTO key_table VALUES $string。

我认为这至少是一种正确的方法,当然从 MySQL 的角度来看。这是我刚刚编写和测试的一些准系统代码。有很多关于错误、安全性等方面的小细节缺失。

这是表格,它将从数据库中下载并填写表格。(``它确实包含一个自动值(checked='checked'),因此如果出现问题,表单不会被删除。)

            $query1 = "SELECT * FROM tag_table";
            $res1 = mysqli_query ($dbc, $query1);
            while ($row1 = mysqli_fetch_array($res1, MYSQLI_NUM)) {
                    $tag_id = $row1[0];
                    $tag = $row1[1];
                    echo "<div class='check'><label for='tags[]'>$tag</label> "; 
                    echo "<input type='checkbox' name='tags[]' value='$tag_id'";
                    if (in_array("$tags",$tag_id)) echo " checked='checked' ";
                    echo "/></div>";
                }

这是表单处理程序的基本框架,您已经在其中建立了由变量 $dbc 保存的数据库连接。这在您上传基本信息后立即进行,以便 mysqli_insert_id 将获取最近插入的 id 号:

    $tags = $_POST (tags);
    if ($tags) {
        $new_main_id =  mysqli_insert_id($dbc);
    foreach ($tags as $value) {
           $qvalues .= "('$new_main_id','$value'),";
    }
    $qvalues = substr("$qvalues", 0, -1); 

    $q2 = "INSERT INTO key_table (id_main,id_tag_table) VALUES $qvalues";
    $res2 = mysqli_query($dbc, $q2);

}

这将为您提供一个漂亮干净的规范化数据库。请注意,我们使用 PHP 函数 substr() 将逗号从要插入的值列表的最后一个去掉。

因此,如果您有一个包含三行两列的标签表,例如 1 个红色、2 个蓝色、3 个绿色,并且您的用户检查了红色和绿色,并且您的 main_table 中用于主插入的 id 编号为 18,则查询($q2) 将显示为:

插入 key_table (id_main,id_tag_table) 值 ('18','1'),('18','3')

于 2012-08-23T20:17:56.357 回答