0

チェックボックスを使用するPHPフォームがあります。3つのテーブルを持つMySQLデータベースもあります。

テーブルの1つはTAGSという名前で、その列はIDとARTICLE_CONTENTSです。

データベース内の別のテーブルはARTICLESと呼ばれ、その列はID、ARTICLETITLE、ARTICLEORGANIZATION、ARTICLEDATE、およびARTICLEURLです。

3番目のテーブルはARTICLES_TAGSと呼ばれ、その列はARTICLE_IDとTAG_IDです。

TAGSテーブルには、次のような87のエントリがあります。

1    |    geology
2    |    astronomy
3    |    chemistry

データベースの目的は、TAGSとARTICLESの間に関係を作成することです。これを行うために、PHPフォームは、データベースに新しいエントリを追加するときにユーザーがチェックできるチェックボックスを使用します。これらのチェックボックスは、TAGSテーブルのタグを表します。したがって、たとえば、TAGSテーブルの各エントリにチェックボックスがあります。[]地質学[]天文学[]化学...など...

私がやろうとしているのは、テキストボックス(記事のタイトル、記事の構成、記事の日付、記事のURL)を使用して情報を挿入し、mysql_insert_id()を使用してその挿入のIDを取得し、そのIDをのIDとペアリングすることです。チェックされているチェックボックスに関連付けられているタグ。

したがって、たとえば、地質チェックボックスがオンになっている場合、およびTAGSテーブルで地質のエントリは次のようになります。

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 )
{
}

このブロックが問題です。何もしないループがあります。ただし、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('','','','','');
    }
?>

それが機能するようになった今...

セキュリティについて少し話し合う必要があります。ここまでは初心者としてはうまくいきましたが、クエリに (逐語的に) 挿入される 1 つの変数 (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 に答える