0

我有一个使用复选框的 PHP 表单。我还有一个带有 3 个表的 MySQL 数据库。

其中一张表名为 TAGS,其列是 ID 和 ARTICLE_CONTENTS。

数据库中的另一个表称为 ARTICLES,其列是 ID、ARTICLETITLE、ARTICLEORGANIZATION、ARTICLEDATE 和 ARTICLEURL。

第三个表称为 ARTICLES_TAGS,其列是 ARTICLE_ID 和 TAG_ID

TAGS 表有 87 个条目,类似于:

1    |    geology
2    |    astronomy
3    |    chemistry

数据库的目的是创建标签和文章之间的关系。为此,PHP 表单使用复选框,用户可以在向数据库添加新条目时选中这些复选框。这些复选框代表 TAGS 表中的标签。因此,例如,TAGS 表中的每个条目都会有一个复选框:[ ]geology [ ]astronomy [ ]chemistry ...etc...

我要做的是使用文本框(文章标题、文章组织、文章日期和文章 url)插入信息,并使用 mysql_insert_id() 获取该插入的 ID 并将该 ID 与 ID 配对与选中的复选框关联的标签。

因此,例如,如果要选中 geology 复选框,并且如果在 TAGS 表中的 geology 条目是:

02  |  geology

并且,如果插入的文章的 ID 恰好是 142

然后

将在 ARTICLES_TAGS 中插入一个新条目:

Article_ID    |    TAG_ID
   142        |      02

但是,每当我执行我的表单时,尽管信息正确插入到 ARTICLES 表中,但我在 ARTICLES_TAGS 表中没有任何条目。我无法弄清楚我哪里出错了。

几天来我一直在研究这个问题的措辞,我认为现在很清楚。请让我知道是否需要任何澄清。

代码是:

<?php
    function renderForm($articletitle, $articleorganization, $articledate, $articleurl, $articletags )
{
?>
<!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>
    . . .
</head>
    <body>
        <div class="container">
        <div class="header">
            . . .
        </div>
        <div class="sidebar1">
            . . .
        </div>
        <div class="content">
            <div id="stylized" class="myform">
                <form id="form" name="form" action="" method="post">
                    <h1>Create a new entry in the database</h1>
                        <table width="76%" border="0" cellpadding="6">
                            <tr>
                                <td colspan="2"><legend></legend></td>
                            </tr>
                            <tr>
                                <td width="20%" align="right"><span class="field">Article Title:</span></td>
                                <td width="80%" align="left"><span class="field">
                                    <input name="articletitle" type="text" value="<?php echo $articletitle; ?>" size="50"/>
                                </span></td>
                            </tr>
                            <tr>
                                <td align="right"><span class="field">Article Author:</span></td>
                                <td align="left"><span class="field">
                                    <input name="articleorganization" type="text" value="<?php echo $articleorganization; ?>" size="50"/>
                                </span></td>
                             </tr>
                             <tr>
                                 <td align="right"><span class="field">Access Date:</span></td>
                                 <td align="left"><span class="field">
                                     <input name="articledate" type="text" value="MM/DD/YYYY" size="50"/>
                                 </span></td>
                             </tr>
                             <tr>
                                 <td align="right"><span class="field">Article URL:</span></td>
                                 <td align="left"><span class="field">
                                     <input name="articleurl" type="text" value="<?php echo $articleurl; ?>" size="50"/>
                                 </span></td>
                             </tr>
                             <tr>
                                 <td align="right"><span class="field">Article Tags:</span></td>
                                 <td align="left"><span class="field">
                                     <input type="checkbox" name="articletags[]" value="1" id="articletags_0" />Science
                                     <input type="checkbox" name="articletags[]" value="2" id="articletags_1" />Geology

                                 </span></td>
                             </tr>
                             <tr>
                                 <td colspan="2" align="center" valign="middle"><input type="submit" name="submit" value="Add this Article" /></td>
                             </tr>
                        </table>
                </form>
        </div>
       <div class="footer">
           . . .
       </div>
    </body>
</html>
<?php 
}
    include('settings.php');

    if(count($articletags) > 0)
{
    $articletags_string = implode(",", $articletags);
}
    if($_SERVER['REQUEST_METHOD'] == 'POST')
{ 
    $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']));
{
}
    if ($articletitle == '' || $articleorganization == '')
{
    $error = 'ERROR: Please fill in all required fields!';
    renderForm($articletitle, $articleorganization);
}
    else
{
    mysql_query("INSERT INTO articles SET articletitle='$articletitle',
        articleorganization='$articleorganization',
        articledate='$articledate',
        articleurl='$articleurl' ");
    $article_id = mysql_insert_id();       

    foreach ($_POST['articletags'] as $newtag)
{
    mysql_query(" INSERT INTO articles_tags article_id='$article_id',
               tag_id='$newtag' ");
}
    header("Location:addsuccess.php");  
}
}
    else
{
    renderForm('','','','','');
}
?>
4

1 回答 1

3

让它工作...

首先,您需要修复一个解析错误。

第 93 行:

mysql_query("INSERT INTO articles SET articletitle='$articletitle',
    articleorganization='$articleorganization',
    articledate='$articledate',
    articleurl='$articleurl' ")
    $article_id = mysql_insert_id();       
or die(mysql_error()); 
header("Location:addsuccess.php"); 

注意 的or die()赋值后$article_id = mysql_insert_id()。这是无效的语法。

mysql_query("INSERT INTO articles SET articletitle='$articletitle',
    articleorganization='$articleorganization',
    articledate='$articledate',
    articleurl='$articleurl' ")
    or die(mysql_error()); 
$article_id = mysql_insert_id();       
header("Location:addsuccess.php"); 

第 84 - 85 行:

foreach( $POST_['articletags'] as $newtag )
{
}

这个块是问题所在:你有一个循环什么都不做。但是,您确实已经准备好插入语句。因此,让我们将此循环与第 101 行(在 101 的位置)合并以进行有效插入。

foreach( $_POST['articletags'] as $newtag )
{
  mysql_query('INSERT INTO articles_tags (article_id,tag_id) VALUES ($article_id, $newtag)');
}

您的结果应如下所示:

<?php
    function renderForm($articletitle, $articleorganization, $articledate, $articleurl, $articletags )
{
?>
<!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>
    . . .
</head>
    <body>
        <div class="container">
        <div class="header">
            . . .
        </div>
        <div class="sidebar1">
            . . .
        </div>
        <div class="content">
            <div id="stylized" class="myform">
                <form id="form" name="form" action="" method="post">
                    <h1>Create a new entry in the database</h1>
                        <table width="76%" border="0" cellpadding="6">
                            <tr>
                                <td colspan="2"><legend></legend></td>
                            </tr>
                            <tr>
                                <td width="20%" align="right"><span class="field">Article Title:</span></td>
                                <td width="80%" align="left"><span class="field">
                                    <input name="articletitle" type="text" value="<?php echo $articletitle; ?>" size="50"/>
                                </span></td>
                            </tr>
                            <tr>
                                <td align="right"><span class="field">Article Author:</span></td>
                                <td align="left"><span class="field">
                                    <input name="articleorganization" type="text" value="<?php echo $articleorganization; ?>" size="50"/>
                                </span></td>
                             </tr>
                             <tr>
                                 <td align="right"><span class="field">Access Date:</span></td>
                                 <td align="left"><span class="field">
                                     <input name="articledate" type="text" value="MM/DD/YYYY" size="50"/>
                                 </span></td>
                             </tr>
                             <tr>
                                 <td align="right"><span class="field">Article URL:</span></td>
                                 <td align="left"><span class="field">
                                     <input name="articleurl" type="text" value="<?php echo $articleurl; ?>" size="50"/>
                                 </span></td>
                             </tr>
                             <tr>
                                 <td align="right"><span class="field">Article Tags:</span></td>
                                 <td align="left"><span class="field">
                                     <input type="checkbox" name="articletags[]" value="1" id="articletags_0" />Science
                                     <input type="checkbox" name="articletags[]" value="2" id="articletags_1" />Geology
                                 </span></td>
                             </tr>
                             <tr>
                                 <td colspan="2" align="center" valign="middle"><input type="submit" name="submit" value="Add this Article" /></td>
                             </tr>
                        </table>
                </form>
        </div>
       <div class="footer">
           . . .
       </div>
    </body>
</html>
<?php 
}
    include('settings.php');

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

    if($_SERVER['REQUEST_METHOD'] == 'POST')
    { 
        $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']));
        if ($articletitle == '' || $articleorganization == '')
        {
            $error = 'ERROR: Please fill in all required fields!';
            renderForm($articletitle, $articleorganization);
        }
        else
        {
            mysql_query("INSERT INTO articles SET articletitle='$articletitle',
                articleorganization='$articleorganization',
                articledate='$articledate',
                articleurl='$articleurl' ")
                or die(mysql_error()); 
            $article_id = mysql_insert_id();       
            header("Location:addsuccess.php");  
        }
        foreach( $_POST['articletags'] as $newtag )
        {
          mysql_query('INSERT INTO articles_tags (article_id,tag_id) VALUES ($article_id, $newtag)');
        }
    }
    else
    {
    renderForm('','','','','');
    }
?>

现在它起作用了......

我们必须讨论一下安全性。到目前为止,对于初学者来说,您已经做得很好,但是您错过了转义一个被插入(逐字!)到查询中的变量:tag_id。而且您忘记了单引号不插入值。

mysql_query('INSERT INTO articles_tags (article_id,tag_id) VALUES ($article_id, $newtag)');

真的应该是(主要是为了安全):

mysql_query(sprintf('INSERT INTO articles_tags (article_id,tag_id) VALUES (%d, %d)', $article_id, $newtag));

一点优化

当您插入大量标签时,此脚本会创建多个查询。所以我想我会告诉你如何清理它以一次插入多个标签。

if(isset($POST_['articletags']) && count($POST_['articletags'])) {
  $query = 'INSERT INTO articles_tags (article_id,tag_id) VALUES ';
  $tags = array();
  foreach( $POST_['articletags'] as $newtag )
  {
    $tags[] = sprintf('(%d, %d)', $article_id);
  }
  mysql_query($query . implode(', ', $tags));
}

此代码生成与以前相同的查询,但它将构建一组列表以一次插入多个条目。最重要的是,它还将两个值过滤为整数。

代码格式

我必须做一些重新格式化才能理解您的代码。这部分是您的问题的原因。如果没有适当的缩进,您可能很容易错过这样的错误并且永远不会知道。您可能想阅读编程风格

于 2012-06-20T16:50:17.910 回答