1

私はむしろこのフォーラムに新しく加わった者です。PHPでコーディングするので、初心者として、あなたの助けを借りたいと思います。

私が直面している問題は次のとおりです。

次のフィールドを持つMySQLテーブル「アナウンス」があります

id
----------
advert
----------
date
----------
file
----------
approv
----------

ページからデータが入力される場所 - 承認を除くすべての列がその値を取得する場所。フィールドに入力するために、新しい PHP ページがあります。フィールド承認は、そのチェックボックスのチェックに基づいて値「承認済み」を取得します

私が直面している問題は、特定のレコードが承認され、MySQL テーブルに更新されるように、ID を表示し、対応するチェックボックスの値を取得するテキスト ボックスの値を読み取ることができないことです。

私が書いたコードを以下に示します

<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Annpouncements | Pending List</title>
<style type="text/css">
.textinput {
height: 20px;
width: 20px;
border-top-width: 0px;
border-right-width: 0px;
border-bottom-width: 0px;
border-left-width: 0px;
border-top-style: none;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
}
</style>
</head>

<body>

<table width="800" border="0" align="center" cellpadding="0" cellspacing="0">
<tr>
<td><table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td height="164"><form id="form1" name="form1" method="post" action="">
      <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td width="11%" height="31" align="center"><label>Id</label></td>
          <td width="15%" height="31" align="center"><label>Date</label></td>
          <td width="52%" align="center"><label>Title</label></td>
          <td width="22%" align="center"><label>Status</label></td>

        </tr>
<?php
//Open the table announce from the database and list date in descending order
$result = mysql_query("SELECT * FROM announce ORDER by date DESC" )or  
die(mysql_error());

//Define a variable to get the rows of the table
  $ann = mysql_fetch_array($result);

//Define a variable to get the no of rows 
  $num = mysql_num_rows($result);
  $i=0;

while($i<$num) {?>
    <?php $approv[$i]= mysql_result($result,$i,"approv"); ?>

        <tr>
            <?php if($approv[$i] !== "approved"){?> 
            <td height="36" align="center"><input name="id" type="text" 
            class="textinput" id="id" value="<?php echo mysql_result($result,$i,"id"); 
            ?>" /></td>
           <?php $ids = mysql_result($result,$i,"id"); 
    //$inp = $_POST["id"][$i];
    //echo 'Input value : ' .$inp. '<br/>' ?>
            <td height="36" align="center"><label>
            <?php echo  mysql_result($result,$i,"date"); ?></label></td>
            <td align="center"><label><?php echo mysql_result($result,$i,"advert"); 
             ?></label></td>

            <td align="center"></label><input type="checkbox" name="approv[]" />
              <label for="approv"></label></td>
             <?php $idan = mysql_query("SELECT * FROM announce WHERE id == $ids"); ?>
             <?php 
               if (isset($_POST['button'])) 
        {
              $apprv = $_POST["approv"];
          //echo 'id = '.$ids.'<br/>';
           $how_many = count($apprv);
         //echo 'Row selected' .$how_many. '<br/>'; 
           foreach ($_POST['approv'] as $apprValue)
           $txtvalue[] = $_POST[$apprValue];
           echo 'txtvalue = ' .$txtvalue. '<br/>';
           mysql_query("UPDATE announce SET approv = 'approved'WHERE id == 
                   $idan ");
                      }
    } 
         ?>
  <?php } ?>

        </tr>

        <?php 
        $i++;
      }
    ?>

        <tr>
          <td height="44">&nbsp;</td>
          <td>&nbsp;</td>
          <td align="center">&nbsp;</td>
          <td align="center"><input type="submit" name="button" id="button" 
           value="Submit" /></td>
        </tr>

      </table>
    </form></td>

             </tr>
           </table></td>
        </tr>
     </table>

したがって、チェックされた行のみに対して値「承認済み」でテーブルを更新するための正しい解決策を得るのを手伝ってください。

貴重なご協力をお待ちしております

4

2 に答える 2

0

あなたのクエリで見つけたいくつかの問題

これ

SELECT * FROM announce WHERE id == $ids

する必要があります

SELECT * FROM announce WHERE id = '$ids'

この

UPDATE announce SET approv = 'approved'WHERE id == $idan

する必要があります

UPDATE announce SET approv = 'approved' WHERE id = '$idan'

チェックボックスにも値属性がありません

<input type="checkbox" name="approv[]" value="<echo your table row id here>" />

次に使用します

foreach($_POST['approv'] as $apprValue)
{
    mysql_query(UPDATE announce SET approv = 'approved' WHERE id = '$apprValue');
}

余談ですが、mysql_* 関数はもう使用しないでください。それらはまもなく廃止される予定です。mysqliまたはに行く方が良いPDO

于 2012-09-06T05:23:38.170 に答える
0

さて、ここには多くの問題がありますが、チェックボックスを生成しているコード行の問題を突き止めます。具体的には、次のビット:

 <input name="id" type="text" class="textinput" id="id" value="<?php echo mysql_result($result,$i,"id"); ?>" />
 <input type="checkbox" name="approv[]" />

これは、さまざまな理由から、必要な情報を作成するための信頼できる方法ではありません。

  1. $_POST['id']単一の値のみが含まれます。あなたの意図と思われる承認状態へのIDのマップは作成されません。
  2. $_POST['approv']インデックスがゼロの配列になり、 to ループ カウントidのマップを保持せずにチェックボックスを に関連付ける便利な方法がなくなります。id(しかし、それを行う場合は、PHP が提供する構文を使用してください。)

わかりました。これで、いくつかの変更を加える必要があることがわかりました。まず、チェックボックスを機能させてみます。ただし、コードの構造の一部についてはまだ問題があります。特に、リクエストが PHP でどのように機能するかをまったく理解していないように見えるためです。

まず、各 ID の承認状態を確認する方法が必要です。それは実は簡単に治ります。変更するだけです:

<input type="checkbox" name="approv[]" />

<input type="checkbox" name="approv[]" value="<?= $id ?>" />

そうすれば、 をループする$_POST['approv']と、単なるオフセットではなく、実際に ID を取得できます。これにより、下部に同じ for ループを保持できます。

しかし、まだ問題があります

レンダリング ループ ( ) 内で $_POST を見る理由はありませんwhile($i<$num)。PHP 構造を有利に使用します。foreach($result_rows as $row)あなたのコードよりもはるかに慣用的で読みやすいです:

//Define a variable to get the rows of the table
  $ann = mysql_fetch_array($result);

//Define a variable to get the no of rows 
  $num = mysql_num_rows($result);
  $i=0;

while($i<$num) {?>
    ... // do work
    ... // Do something with $_POST. <-- wrong!!!
<? } ?>

次のようなものにする必要があります。

if (empty($_POST)) {
    // Only run the query when we need to display information
    $result = mysql_query("SELECT * FROM announce ORDER by date DESC") or die(mysql_error());

    //Define a variable to get the rows of the table
    $result_rows = mysql_fetch_array($result);
    foreach($result_rows as $row) { ?>
        ... // Display form
    <? }
} else {
    $success = array();
    foreach($_POST['approv'] as $approved_id) {
        // Ideally we would combine all of these updates into one statement
        $stmt = mysqli_prepare($link, "UPDATE announce SET approv = 'approved' WHERE id = ?i");
        mysqli_stmt_bind_params($stmt, $approved_id);
        // You then can look over the $success array to see if any failed.
        $success[$approved_id] = mysqli_stmt_execute($stmt);
    }
}
于 2012-09-06T05:46:33.843 に答える