0

これは PHP の小さなコードです。

<?php include_once("includes/connection.php"); ?>
    <?php include_once("includes/functions.php"); ?>
    <?php 
        if(!isset($_POST['menu_name']) or !isset($_POST['position']) or !isset($_POST['visible'])){
            echo "You are supposed to fill all entries<br/><br/><a href='new_subject.php'>go back</a>";
            exit;
        }
            echo "<pre>";
            var_dump($_POST); 
            echo "</pre>":
        $menu_name = $_POST['menu_name'];
        $position = (int)$_POST['position'];
        $visible = $_POST['visible'];
        $menu_name = mysql_real_escape_string($menu_name);
        $subject_count = mysql_num_rows(get_all_subjects());
        //$subject_set_desc = mysql_query("SELECT position FROM subjects ORDER by position DESC",$connection);
        for($change = $position;$change<=$subject_count;$change++){
            //get row with position $change
            //increase it's position by 1
            //continue till all rows end OR loop ends
            /*UPDATE subjects SET position = $change+1 WHERE position = $change*/
            $new_position = $change+1;
            echo "{$change} ".gettype($change)."  {$new_position} ".gettype($new_position)."<br/> ";
            mysql_query("UPDATE subjects SET position = {$new_position} WHERE position = {$change}",$connection);
            echo "UPDATE subjects SET position = {$new_position} WHERE position = {$change}"."<br/>";
            //confirm_query($cheack);
            
        }
        $query = "INSERT INTO subjects (menu_name,position,visible) VALUES ('{$menu_name}',{$position},{$visible})";
        if(mysql_query($query,$connection)){
            //header("location:content.php");
            exit;
        } else{
            echo "<b>failed to insert new subject</b> <br/>".mysql_error();
        }
    ?>
    <?php mysql_close($connection); ?>

forループとそのループ内のデータベース クエリだけに注目してほしい.postこのページに次のデータを送信します。

$_POST['subject'] = 'new_subject'; //string type <br/>
$_POST['position'] = 1 //int type <br/>
$_POST['visible'] = 1 //tinyint type <br/>
$_POST['submit'] = 'Add Subject' // string type just submisssion <br/>

私のフォーム処理ファイルでわかるように

ここに画像の説明を入力

これらのクエリを作成する前の私のデータベース

ここに画像の説明を入力

クエリを作成した後の私のデータベース(コードの for ループ内)。

ここに画像の説明を入力

テーブル内のすべての行の位置を 1 ずつ増やす必要があると思いますが、すべてが 5 に変更されました$_POST['position']..<br/> 。そのクエリは正しいですが、実行後、テーブルへの変更は邪魔になりません(すべての位置を1ずつ増やしたい)..

4

3 に答える 3

1

下向きに実行する必要があります。位置 1 を 2 に更新することから始めます。これで、掲載順位が 2 の項目が 2 つになりました。次に、それらを 3 つに更新します。3 位に 3 つのアイテムが残ります。

むしろ、最も高い値から始めて、4 を 5 に更新します。次に、1 つを削除し、すべての 3 を 4 に増やします。

またはさらに良いのは、インクリメントする必要があるすべての位置に対して、ループなしで 1 つのクエリを使用することです。

Update subjects SET position = position +1
于 2013-10-16T10:43:23.660 に答える
0
$new_position = $change+1;

その行を次のように変更します。

$new_position = $position+1;

forループの前に置きます。

于 2013-10-16T10:39:40.190 に答える
0

間違っているのは、各値を一度に 1 つずつ変更していることです。

UPDATE subjects SET position = position + 1 WHERE position >= ...
于 2013-10-16T10:40:29.613 に答える