0

10 レコードテーブルがあり、それらの 10 レコードからnamelastname、およびrankを取得したいとします。まず、私は次のようなことをします:

<?php // DATABASE SELECT QUERY
      $db =& JFactory::getDBO();
      $query="SELECT name, lastname, rank
                FROM table
               ORDER BY rank ASC";
      $db->setQuery($query);
      $rows = $db->loadObjectList(); ?>

次に、テーブルの値を含むいくつかのフィールドをフォームに追加して、フォームから編集できるようにします。

<form action="#" method="post" name="form">

<table><?php $count    = 0; while ($count < 10){
             $name     = $rows[$count]->name;
             $lastname = $rows[$count]->lastname;
             $rank     = $rows[$count]->rank; ?>
<tr>

<td><input name="name" value="<?php echo $name ?>" type="text" /></td>
<td><input name="lastname" value="<?php echo $lastname ?>" type="text" /></td>
<td><select name="rank">
    <option value="<?php echo $rank ?>"><?php echo $rank ?></option>
    <option disabled="disabled" value="...">...</option>
    <?php for ($i = 0; $i <= 100; $i++){ ?>
    <option value="<?php echo $i ?>"><?php echo $i ?></option> <?php } ?>
    </select></td>  

</tr><?php $count++;}?>

</table>

<input class="something" name="updatemod" type="submit" value="UPDATE" />
</form>

次に、Select クエリの前に、以下のメソッドを使用して更新クエリを追加したので、更新ボタンを押したときに DB を更新します。

// DATABASE UPDATE QUERY
if (isset($_POST['updatemod']) or isset($_GET['updatemod'])){
$db =& JFactory::getDBO();
$query = "UPDATE table
             SET name = '".$_POST["name"]."',
             SET lastname = '".$_POST["lastname"]."',
             SET rank = '".$_POST["rank"]."'
             ";
$db->setQuery($query);
$db->query();}

しかし...何も機能していません!!! 私は他のフォームに対してまったく同じことをしましたが、完璧に機能しています! これら 2 つの形式の唯一の違いはwhile、もう一方の形式ではこのループを使用していないことです。それで、多分これか何かに関係がありますか?わかりません。この時点で私の知識が混乱しているので、あなたの助けが必要です!

4

1 に答える 1

1

テーブル内のすべての行を更新しようとしていると思います。

その場合は、このようなことをする必要があります。

<?php // DATABASE SELECT QUERY // also you should select your unique id field
      $db =& JFactory::getDBO();
      $query="SELECT name, lastname, rank,id
                FROM table
               ORDER BY rank ASC";
      $db->setQuery($query);
      $rows = $db->loadObjectList(); ?>

フォームでは、要素名を単一として配置していますが、要件は、入力名を配列として使用する必要があるワンクリックですべての行を編集することです。また、ここでは、更新条件のために新しい id フィールドも導入する必要があります

    <form action="#" method="post" name="form">

    <table><?php $count    = 0; while ($count < 10){
                 $name     = $rows[$count]->name;
                 $lastname = $rows[$count]->lastname;
                 $rank     = $rows[$count]->rank;
                  $id      = $rows[$count]->id; ?>
    <tr>

    <td><input name="uid[]" value="<?php echo $id?>" type="hidden" />
<input name="name[]" value="<?php echo $name ?>" type="text" /></td>
    <td><input name="lastname[]" value="<?php echo $lastname ?>" type="text" /></td>
    <td><select name="rank[]">
        <option value="<?php echo $rank ?>"><?php echo $rank ?></option>
        <option disabled="disabled" value="...">...</option>
        <?php for ($i = 0; $i <= 100; $i++){ ?>
        <option value="<?php echo $i ?>"><?php echo $i ?></option> <?php } ?>
        </select></td>  

    </tr><?php $count++;}?>

    </table>

    <input class="something" name="updatemod" type="submit" value="UPDATE" />
    </form>

また、更新クエリには、ループと where 句も必要です

// DATABASE UPDATE QUERY
if (isset($_POST['updatemod']) or isset($_GET['updatemod'])){
$db =& JFactory::getDBO();
$total_rows = sizeof($_POST["uid"]);
for($i =0; $i<$total_rows;$i++){

$query = "UPDATE table
             SET name = '".$_POST["name"][$i]."',
             lastname = '".$_POST["lastname"][$i]."',
             rank = '".$_POST["rank"][$i]."'
              WHERE id = '".$_POST["uid"][$i]."'
             ";
$db->setQuery($query);
$db->query();
}
}

これで問題が解決すると思います。

ここで、異なる可能性があるテーブルの一意のキーとして「id」について言及しましたが、アイデアが得られることを願っています

しかし、これは最悪の場合の更新条件です。1000 行のテーブルを想像してみてください。結果を得るには時間がかかりすぎます。

適切な方法で単一の行を更新してみてください。これが最善の方法です。

これがお役に立てば幸いです。

于 2013-01-16T11:38:19.163 に答える