PHP - 将复选框表单中的数据插入MYSQL

7
这是我第一个使用服务器端技术的网站。同时也是我第一次学习PHP和MYSQL的使用。在实践中不断学习进步。
我为一家小型晚礼服公司创建了一个基本的管理页面,用于管理产品条目的数据库。
我正在开发一个表单功能,管理员可以使用该表单将新条目上传到数据库中。
其中包含以下一些条目:
- 礼服名称[text输入] - 颜色可选性[复选框]
我在从HTML表单获取多个复选框中的数据时遇到了麻烦。
复选框中的选择应该表示布尔值(是/否-1/0)。
以下是表单结构:
    <form action="inventory_list.php" enctype="multipart/form-data" name="myForm" id="myform" method="post">
    <table width="90%" border="0" cellspacing="0" cellpadding="6">
  <tr>
    <td width="20%" align="right">Dress Name</td>

    <td width="80%"><label>
    <input name="Dress_name" type="text" id="Dress_name" size="64" />
    </label>
    </td>
  </tr>

  <tr>
    <td align="right">Collections</td>
    <td>
    <label>
      <select name="collections" id="collections">
            <option value="other">Other</option>
            <option value="hermione">Hermione</option>
            <option value="jora">Jora</option>
            <option value="manon">Manon</option>
      </select>
    </label></td>
  </tr>
  <tr>
    <td align="right">Available Sizes</td>
    <td>
        <input type="checkbox" name="sizes[]" value="1" /> Sizes 2-6<br />
        <input type="checkbox" name="sizes[]" value="1" />  Sizes 6-10 <br />
        <input type="checkbox" name="sizes[]" value="1" /> Sizes 10-14<br />
        <input type="checkbox" name="sizes[]" value="1" />  Sizes 14-18 <br />
        <input type="checkbox" name="sizes[]" value="1" /> Sizes 18-22<br />
        <input type="checkbox" name="sizes[]" value="1" />  Sizes 22-26 <br />

   </td>
  </tr>
  <tr>
    <td align="right">Dress Colours</td>
    <td>
        <input type="checkbox" name="colours[]" value="1" /> Pinks/Reds <br />
        <input type="checkbox" name="colours[]" value="1" />  Blues/Greens <br />
        <input type="checkbox" name="colours[]" value="1" /> Violet/Purple<br />
        <input type="checkbox" name="colours[]" value="1" />  Yellow/Orange/Brown/Gold <br />
        <input type="checkbox" name="colours[]" value="1" /> Black/White<br />

   </td>
  </tr>
  <tr>
    <td align="right">Product Image</td>
    <td><label>
      <input type="file" name="fileField" id="fileField" />
    </label></td>
  </tr>      
  <tr>
    <td>&nbsp;</td>
    <td><label>
      <input type="submit" name="button" id="button" value="Add This Item Now" />
    </label></td>
  </tr>
</table>
</form>

以下是我编写的PHP代码,用于处理表单向数据库提交数据。

<?php 
if (isset($_POST['Dress_name'])) {

$dress_name = mysql_real_escape_string($_POST['Dress_name']);
$collections = mysql_real_escape_string($_POST['collections']);
$sizesArray = $_POST['sizes'];
$coloursArray = $_POST['colours'];

foreach ($sizesArray as $key => $value)
{
    echo "Key = $key || Value = $value<br />";
}

foreach ($coloursArray as $ckey => $cvalue)
{
    echo "Key = $ckey || Value = $cvalue<br />";
}

//See if that product name is an identical match to another product in the system
$sql = mysql_query("SELECT ID FROM names WHERE Dress='$dress_name' LIMIT 1");
$productMatch = mysql_num_rows($sql); // count the output amount
if ($productMatch > 0) {
    echo 'Sorry you tried to place a duplicate "Product Name" into the system, <a href="inventory_list.php">click here</a>';
    exit();
}


 //Add this product into the database now
$sql = mysql_query("INSERT INTO names (Dress) 
    VALUES('$dress_name')") or die (mysql_error());
 $pid = mysql_insert_id();



 //Place image in the folder 
$newname = "$pid.jpg";
move_uploaded_file( $_FILES['fileField']['tmp_name'], "../inventory_images/$newname");
header("location: inventory_list.php"); 
exit();
}
?>

正如你所看到的,我已经把数据放入了一个数组中。但是现在我遇到了一些困难,似乎无法找到任何有意义的答案。

我该如何将布尔值放入数据库表的正确列中?

感谢您的时间!


MySQL的布尔类型看起来像零和一。如果值为true,则在列中存储1。如果值为false(或更简单地说不是true),则存储零。 - buley
你的HTML表单上的复选框都具有相同的值 - 我认为你的意思是让它们的值等于适当的大小? - andrewsi
实际上,由于MySQL处理布尔值的方式,使用TINYINT要好得多。布尔类型可能会导致奇怪的错误:如果您只想要一个向上或向下的标记,请使用长度为1的整数。 - Nathaniel Ford
我已经在不同的列中使用了TINYINT来表示不同的尺寸。因此,在表格中,每个产品的不同尺寸范围内的列可以有1或0。 我想知道如何从复选框中获取数组中的数据以填充这些列? - Adam Ross Bowers
@AdamRossBowers 如果有答案接近您所需的解决方案,请务必“接受”该答案! - Nathaniel Ford
2个回答

9
首先要知道的是,HTML复选框如果被选中将返回结果,如果未被选中则不会返回任何内容。因此,在您的html中,将值递增是非常重要的:
<td align="right">Available Sizes</td>
<td>
  <input type="checkbox" name="sizes[]" value="1" /> Sizes 2-6<br />
  <input type="checkbox" name="sizes[]" value="2" />  Sizes 6-10 <br />
  <input type="checkbox" name="sizes[]" value="3" /> Sizes 10-14<br />
  <input type="checkbox" name="sizes[]" value="4" />  Sizes 14-18 <br />
  <input type="checkbox" name="sizes[]" value="5" /> Sizes 18-22<br />
  <input type="checkbox" name="sizes[]" value="6" />  Sizes 22-26 <br />
</td>

一个完全规范化的数据库模式应该是这样的:
//Note that 'names' and 'collections are overloaded
  //words and should be avoided
table BRANDS 
  id INT AUTOINCREMENT
  collectionname VARCHAR

table SIZES
  id INT AUTOINCREMENT
  sizecategory VARCHAR //ie 'Sizes 18-22'

table COLOURS
  id INT AUTOINCREMENT
  colourname VARCHAR 

table INVENTORY
  id INT AUTOINCREMENT
  brandid INT FOREIGN KEY (BRAND)
  imageurl VARCHAR

table INVENTORY_SIZES
  inventoryid INT FOREIGN KEY
  sizeid FOREIGN KEY

table INVENTORY_COLOURS
  inventoryid INT FOREIGN KEY
  colourid FOREIGN KEY

您的品牌颜色尺寸表需要被正确地填充上您可用的选项,您可以通过理论上动态地从这些表中加载数据来加载页面。这些表中每一行的ID应该最终成为复选框数组中的值。
//get your inputs
$query_values = array();
$query_values[':brandid'] = $dress_name = $_POST['Dress_name'];//note that you should change the value in your options here to the unique ids in your database.
$query_values[':sizeid'] = getSize($_POST[]);
$query_values[':colourid'] = getColour($_POST[]);
$query_values[':quantity'] = $_POST['quantity'];
$query_values[':imageurl'] = $_POST['imageurl'];


//Prepare and execute your sql
  //Note that PDO will handle escaping problematic inputs.
$sql = "INSERT INTO INVENTORY ('brandid', 'imageurl') VALUES (:brandid, :sizeid, :colourid, :quantity, :imageurl)";
executeInsert($sql, $query_values);
$inventoryid = mysql_insert_id();

saveSizes($_POST['sizes'], $inventoryid);
saveColours($_POST['colours'], $inventoryid);

function saveSizes($size_array, $inventoryid) {
  $sql = "INSERT INTO INVENTORY_SIZES ('inventoryid', 'sizeid') VALUES (:inventoryid, :sizeid)";
  foreach ($size_array as $sizeid) {
    $query_values = array();
    $query_values[':inventoryid'] = $inventoryid;
    $query_values[':sizeid'] = $sizeid;
    executeInsert($sql, $query_values);
  }
}

function saveColours($colour_array) {
  $sql = "INSERT INTO INVENTORY_COLOURS ('inventoryid', 'colourid') VALUES (:inventoryid, :colourid)";
  foreach ($size_array as $sizeid) {
    $query_values = array();
    $query_values[':inventoryid'] = $inventoryid;
    $query_values[':colourid'] = $colourid;
    executeInsert($sql, $query_values);
  }
}

function executeInsert($sql, $query_values) {
  $query = $conn->prepare($sql);
  $query->execute($query_values);
}

请务必使用PHP PDO来防范安全问题。我相当确定其中一些内容可以更好地抽象出来/清理,但这应该能够完成任务。(尽管我相当确定在没有测试的情况下进行此操作会有一些小错误。)


0

您需要将插入语句放置在“else”语句中,在“if”之后检查名称是否已存在于数据库中。

我不确定您究竟要做什么,因为没有语句来执行将“复选框”值放入数据库。您正在使用sizes数组作为管理员提交此表单后的输出,但根本没有将其放入数据库中。

如果您可以共享数据库结构(列名),那么会很有帮助。如果您没有2-5号尺码和其他类别的列,请添加这些列,然后将插入语句更改为以下内容:

INSERT INTO names (Dress,Size2to5,Size5to10,Size10to15,Size15to20) VALUES('$dress_name','$size[0]','$size[1]','size[2]','size[3]')

希望能对您有所帮助。如果这对您有用,请告诉我们。


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