我有一个使用复选框的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
数据库的目的是在TAGS和ARTICLES之间创建关系。为此,PHP表单使用用户可以在向数据库添加新条目时检查的复选框。这些复选框代表TAGS表中的标签。因此,例如,TAGS表中的每个条目都会有一个复选框:[]地质学[]天文学[]化学......等等......
我要做的是使用文本框(文章标题,文章组织,文章日期和文章网址)插入信息,并使用mysql_insert_id()获取该插入的ID并将该ID与与要检查的复选框关联的标记的ID。
因此,例如,如果要检查地质复选框,并且在TAGS表中是否有地质条目:
02 | geology
并且,如果插入的文章的ID恰好是142
然后
将在ARTICLES_TAGS中插入一个新条目:
Article_ID | TAG_ID
142 | 02
但是,每当我执行我的表单时,我都没有在ARTICLES_TAGS表中获得任何条目,尽管信息正确地插入到ARTICLES表中。我无法弄清楚我哪里出错了。
我一直在研究这个问题的措辞几天,我认为现在很清楚。如果需要澄清,请告诉我。
代码是:
<?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('','','','','');
}
?>
答案 0 :(得分:3)
首先,您需要修复解析错误。
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");
foreach( $POST_['articletags'] as $newtag )
{
}
这个块是个问题:你有一个循环什么都不做。但是,您确实准备好了insert语句。因此,让我们将此循环与第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));
}
此代码生成与以前相同的查询,但它将构建一组列表以一次插入多个条目。最重要的是,它还将两个值都过滤为整数。
我必须做一些重新格式化才能理解你的代码。这部分是导致问题的原因。如果没有适当的缩进,您可能会轻易地错过这样的错误而且永远不会知道您可能希望阅读programming style。