0

我想为每个条目建立一个三级关键字系统。正如建议的那样,我为类别信息创建了一个表(ctypes),为具有条目的关系表创建了一个(类别)。

CREATE TABLE ctypes (
cat_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
cat_name VARCHAR(20) NOT NULL,
cat_level INT UNSIGNED NOT NULL,
parent_id INT UNSIGNED,
PRIMARY KEY (cat_id),
UNIQUE (cat_name)
);

CREATE TABLE categories (
entry_id INT UNSIGNED NOT NULL,
cat_ids VARCHAR(100) NOT NULL,
UNIQUE (entry_id)
);

然后我已经建立了一个表单来通过复选框收集关键字信息。

<form action="add_category.php" method="post">
<table>
<tr>
    <td><b>Level 1(A,B,C)</b></td>
    <td><b>Level 2(Aa,Ab,Ac)</b></td>
    <td><b>Level 3(Aa1,Aa2,Aa3)</b></td>
</tr>
<tr>
    <td>A</td>
    <td>Aa</td>
    <td><input type="checkbox" name="cat[]" value="5" />Aa1<td>
</tr>
<tr>
    <td></td>
    <td></td>
    <td><input type="checkbox" name="cat[]" value="6" />Aa2</td>
</tr>
<tr>
    <td></td>
    <td>Ab</td>
    <td><input type="checkbox" name="cat[]" value="7" />Ab1</td>
</tr>
...
</table>
<input type="hidden" name="eid" value="1" />
<input type="submit" name="submit" value="submit" />
</form>

我已经为 entry_id 和 cat_id 创建了一个关系表,如何将 $cat[] 数据保存到表中?

那么,如何处理这个编辑(添加/删除)每个条目的关键字,以及如何通过(第一个,第二个,第三个关键字)搜索条目?

4

2 回答 2

0

我不完全确定您要达到的目标。正如已经指出的那样,您的表格结构看起来并不理想,但是在不知道您的确切最终目标的情况下,很难为您提供帮助和建议。

我认为主要的谜团是为什么每个类别都有三个级别,但一个级别只有一个复选框。

即你有这个:

<tr>
    <td>A</td>
    <td>Aa</td>
    <td><input type="checkbox" name="cat[]" value="5" />Aa1<td>
</tr>

但是,为什么我不能选择“A”或“Aa”?

也许这就是您的意图,或者(根据您的许多评论)您只是想展示一个基本示例来说明您要实现的目标,一旦您得到答案,就会根据需要更改您的代码。

此外,您的解决方案将不起作用,因为您需要创建一个数组以插入 mysql,您只是附加到一个变量,该变量将插入一行,并将整个数组数据作为一个值。

为了帮助您输入,您可以这样做:

//Initialise some things so can work with them (and no errors)
$arySqlQry = array();
$strError = FALSE;

//make sure you have posted data first
if (isset($_POST['cat']) && is_array($_POST['cat']))
  {

    foreach ($_POST['cat'] as $strCatKey => $strCatValue)
      {

        //ensure data is what you want, no SQL injection etc
        if ($strCatValue != 'Aa1'
            && $strCatValue != 'Aa2'
            && $strCatValue != 'Ab1')
          {
            $strError = TRUE;
          }
        else
          {
            //clean data and construct sql values ready for insert
            $strCatValue = mysql_real_escape_string($strCatValue);             
            $arySqlQry[] = "('".$eid."', '".$strCatValue."')";
          }

        //if we have an error in the array
        //stop the loop as further looping is pointless
        if ($strError == TRUE)
          {
            break;
          }


      }//end foreach


    //if we have a new array with results, and no errors
    //insert into DB
    //if not, this wont run and the error catch below will work
    if (!empty($arySqlQry) && $strError != TRUE)
      {
        $qryQuery = '"INSERT INTO categories (entry_id, cat_ids) 
                      VALUES '.implode(',', $arySqlQry).'"';
        $qryExecute = mysqli_query($dbc, $qryQuery);
      }


  } //end if $_POST is set and is array
else //(POST not there so is error)
  {
    $strError = TRUE;
  }

//if there are any errors
if ($strError == TRUE)
  {
    //do some error reporting
    //ie tell user nothing entered in form, and therefore nothing was saved
  }

您可以通过用 注释掉该行$qryExecute并回显 var来查看此功能$qryQuery,这将向您显示构造的 mysql 查询字符串以及它将插入到数据库中的内容。

至于取回数据,这是一个简单的选择,使用一段时间或抓取一个数组和 foreach 等。

正如已经提到的,但我再次觉得有必要,从mysql_PHP 5.5.0 开始,这些扩展已被贬低,您应该考虑使用 PDO 或 mysqli,并使用准备好的语句来获得额外的可管理性和安全性。

于 2013-08-27T17:07:25.410 回答
-2

如何将表单数据保存到数据库表中

$cats=''; 

foreach($_POST["cat"] as $key)  {
    $cats.=$key.',';
}
$q="insert into categories (entry_id, cat_ids) values ('$eid','$cats')";
$r = @mysqli_query($dbc, $q); // Run the query.

如何从数据库中读取数据

$q = "select cat_ids from categories WHERE entry_id=$eid";    
$r = @mysqli_query ($dbc, $q);

if (mysqli_num_rows($r) == 1) { 
    $row = mysqli_fetch_array ($r, MYSQLI_NUM);
    $cats = trim($row[0],',');
    $cat = explode(",",$cats);
    echo '<p>';
    foreach($cat as $key)  {
        $q = "select cat_name from ctypes where cat_id=$key";    
        $r = @mysqli_query ($dbc, $q);
        $row = mysqli_fetch_array ($r, MYSQLI_NUM);
        echo "<b>".$row[0].";</b>";               
    }
    echo '</p>';
}
于 2013-08-24T04:53:06.350 回答