0

私は現在、jQuery Mobile と MVC フレームワークを使用してモバイル アプリに取り組んでいます。これは、ユーザーがクラス情報 (名前、講師、説明など) と各クラスの課題情報 (タイトル、メモ、期日など) を入力できるタスク/割り当てマネージャーとして機能します。

セッション変数を使用してログイン ページを作成し、正常にログインできました。ログインすると、デフォルトの action="list_assignments" があります。これは、すべてのクラス名を取得し、それらを各クラスの下の割り当てを持つリストビューの仕切りに変えます。

私の問題は、ログインすると、すべてのユーザーのすべての割り当てが表示されることです。

私はMySQLに3つのテーブルを持っています.

  • 割り当て (assign_id[PKey および AutoInc]、assign_title、note、dueDate、user_id、class_id)
  • クラス (class_id[Pkey & AI]、class_name、class_instructor、class_description、user_id)
  • ユーザー (user_id[Pkey & AI]、ユーザー名、パスワード)

assignment_tracker/index.php (コントローラー)

if ($action == 'list_assignments') {

    // Get the current user ID
   @ $user_id = $_SESSION['user_id'];
    if (!isset($user_id)) {
        $user_id = 1;
    }
    // Get the current class ID
   @ $class_id = $_GET['class_id'];
    if (!isset($class_id)) {
        $class_id = 1;
    }

    // Get assignment and class data
    $class_name = get_class_name($class_id);
    $classes = get_classes();

    // needs to be looped for each class within assignment_list.php
    $assignments = get_assignments_by_class($class_id);

    // Display the assignment list, or build "the view"
    include('view/assignment_list.php');


}

Assignment_tracker/view/assignment_list.php

    <?php include ('header.php'); ?>

    <?php print $_SESSION['user_id']; ?>

    <div data-role="content" id="assignment_list">
    <!-- create 2 foreach loops, 1 for classes to be listed and organized by id in list dividers and another for listing individual assignments within each class -->   
     <ul data-role="listview">

     <!--classes loop-->
     <?php foreach ($classes as $class) : ?>

    <li data-role="list-divider"><?php echo $class['class_name']; ?></li>

    <?php $assignments=get_assignments_by_class($class['class_id']); ?> 
    <?php foreach ($assignments as $assignment) : ?><!--assignments loop-->
    <?php print'<li><a href="index.php?action=show_assign_details&assign_id='.$assignment['assign_id'].'&class_id='.$assignment['class_id'].'">'.$assignment['assign_title'].'</a></li>';?>
    <?php endforeach; ?> <!--/assignments loop-->
    <?php endforeach; ?> <!--/classes loop-->

     </ul>      
    </div><!--/data-role="content"-->


    <?php include 'footer.php'; ?>

Assignment_tracker/モデル/class_db.php

    <?php
function get_classes() {
    global $db;
    $query = 'SELECT * FROM classes
              ORDER BY class_id';
    $result = $db->query($query);
    return $result;
}

function get_class_name($class_id) {
    global $db;
    $query = "SELECT * FROM classes
              WHERE class_id = $class_id";
    $class = $db->query($query);
    $class = $class->fetch();
    $class_name = $class['class_name'];
    return $class_name;
}

Assignment_tracker/モデル/assignment_db.php

<?php
function get_assignments() {
    global $db;
    $query = 'SELECT * FROM assignments
              ORDER BY assign_ID';
    $assignments = $db->query($query);
    return $assignments;
}

function get_assignments_by_class($class_id) {
    global $db;
    $query = "SELECT * FROM assignments
              WHERE assignments.class_id = '".$class_id."'
              ORDER BY assign_id";
    $assignments = $db->query($query);
    return $assignments;
}

ユーザーの ID に従って割り当てを見つけるクエリを作成しようとしましたが、foreach ループでソリューションを実装したときに、foreach エラーの無効な引数を取得しました。これは、入力の 1 つが配列ではないことを意味します。私は何時間もこれに行き詰まっていたので、自分のリソースを使用して助けを求める時が来たと考えました.

さらに情報が必要な場合はお知らせください。事前にご協力いただいた皆様に感謝いたします。

アップデート:

皆さんこんにちは、

ユーザーIDをクエリにハードコーディングして結果を取得する方法を見つけました。最初は何らかの理由で配列を返さないと思っていましたが、phpMyAdmin でテストすると、user_id がハードコーディングされている場合にクエリが正常に機能します。

user_id が一致するクラスのみを返す新しい関数を class_db.php に作成しました。$_SESSION['user_id']ログイン時にコントローラーに設定した変数を使用しようとしています。

function get_classes_by_user($user_id) {
global $db;
$query = 'SELECT * FROM classes
      WHERE user_id = 1
          ORDER BY class_id';
$result = $db->query($query);
return $result;
}

index.php

    if ($action == 'list_assignments') {

    // Get the current class ID
   @ $class_id = $_GET['class_id'];
    if (!isset($class_id)) {
        $class_id = 1;
    }
    // Get the current user ID
   @ $user_id = $_SESSION['user_id'];
    if (!isset($user_id)) {
        $user_id = 1;
    }

    // Get assignment and class data
    $class_name = get_class_name($class_id);
    $classes = get_classes();

    //new function being called with resultant array stored in $userclasses
    $userclasses = get_classes_by_user($user_id);

    // needs to be looped for each class within assignment_list.php
    $assignments = get_assignments_by_class($class_id);

    // Display the assignment list, or build "the view"
    include('view/assignment_list.php');

}

割り当てリスト.php

<?php include ('header.php'); ?>
<?php print $_SESSION['user_id']; ?>
        <div data-role="content" id="assignment_list">
            <!-- create 2 foreach loops, 1 for classes to be listed and organized by id in list dividers and another for listing individual assignments within each class -->   
            <ul data-role="listview">

            <!--classes loop-->

            <?php foreach ($userclasses as $class) : ?>

                <li data-role="list-divider"><?php echo $class['class_name']; ?></li>

                <?php $assignments=get_assignments_by_class($class['class_id']); ?> 
                <?php foreach ($assignments as $assignment) : ?><!--assignments loop-->
                <?php print'<li><a href="index.php?action=show_assign_details&assign_id='.$assignment['assign_id'].'&class_id='.$assignment['class_id'].'">'.$assignment['assign_title'].'</a></li>';?>
                <?php endforeach; ?> <!--/assignments loop-->
            <?php endforeach; ?> <!--/classes loop-->

            </ul>       
        </div><!--/data-role="content"-->


<?php include 'footer.php'; ?>

新しい関数に合わせて、上記の foreach ループの $classes を $userclasses に変更しました。

誰にもアイデアはありますか?私はこれを理解するのに非常に近いことを知っています! もう一度、あなたの助けに感謝します!

4

1 に答える 1

0

さて、しばらくアプリをいじった後、ようやく機能するようになりました。

私のindex.phpファイルで、に設定し$_SESSION['user_id']て関数を$user_id追加し、結果をに返しましたget_classes_by_user($user_id)$userclasses

    if ($action == 'list_assignments') {

    // Get the current class ID
   @ $class_id = $_GET['class_id'];
    if (!isset($class_id)) {
        $class_id = 1;
    }

    // Get the current user ID
   @ $user_id = $_SESSION['user_id'];
    if (!isset($user_id)) {
        $user_id = 1;
    }

    // Get assignment and class data
    $class_name = get_class_name($class_id);
    $classes = get_classes();

    $userclasses = get_classes_by_user($user_id);

    // needs to be looped for each class within assignment_list.php
    $assignments = get_assignments_by_class($class_id);

    // Display the assignment list, or build "the view"
    include('view/assignment_list.php');
    }

class_db.php で、クエリに問題があることに気付きました。

一重引用符付きのオリジナルは機能しません

function get_classes_by_user($user_id) {
    global $db;
    $query = 'SELECT * FROM classes
              WHERE user_id = $user_id
              ORDER BY class_id';
    $result = $db->query($query);
    return $result;
}

二重引用符で更新され、機能しています

function get_classes_by_user($user_id) {
    global $db;
    $query = "SELECT * FROM classes
              WHERE user_id = $user_id
              ORDER BY class_id";
    $result = $db->query($query);
    return $result;
}

違いを調べたところ、クエリに変数が含まれている場合は、二重引用符で囲む必要があると判断しました(引用しないでください、笑)。変数が中かっこ {} で囲まれたクエリも見たことがあります。自分で試してみましたが、少なくとも私にとっては、一重引用符を使用しても違いはありません。

于 2013-03-19T03:13:53.477 に答える