3

私は志願して、生徒の不正行為を効果的に追跡するために、学校用にある種のデータベースを作成したいと考えました。私は専門家ではありません。私がしてきたことは、自分が欲しいものをグーグル検索し、それを独学で学び、すべてをつなぎ合わせようとすることです.

私はこのチュートリアルに出くわしました. /

その結果、私はこれを思いつきました: http://ipoh.wesleyschool.edu.my/ace_beta.php

全体のアイデアはクラスの選択に基づいており、その特定のクラスの生徒がリストとして表示されます。

現時点ではすべてが機能していますが、別のレベルに押し上げたいと考えています。ご覧のとおり、私が書いたものは一度に 1 人の学生しか許可していません。同じ不正行為に対して複数の学生を同時に選択したい場合はどうすればよいでしょうか?

「動的チェックボックス」などをグーグルで検索しましたが、どういうわけかそれらをリンクして機能させる方法がわかりません...試してみたので、ここで質問しています。

コード (ace_beta.php):

メインページは以下で実行されます: ace_beta.php; 私はこの場所で立ち往生していると信じています:

<td width="25%" valign="top"'>

<table border="0" width="100%" cellpadding="6">
<tr>
<td width="100%" align="middle" valign="top" bgcolor='#636363'>
<font face="Arial" size='5' color='#ffffff'><b> STEP ONE </b></font>
</td></tr></table>

<br />
<b> STUDENT INFORMATION ::. </b>
<br />

<table border="0" width="100%" cellpadding="3">

<tr>
<td width="20%" align="right"> class </td>
<td width="80%" align="left">
    <select id="class" name="class">
        <?php echo $opt->ShowClass(); ?>
    </select></td>
</tr>

<tr>
<td width="20%" align="right"> student </td>    
<td width="80%" align="left">
    <select id="student" name="student">
         <option value="0">choose...</option>
         </select></td>
</tr>

</table>

</td>

ace_beta.php は、関数が格納されている select.class.php と密接にリンクされています...

コード (select.class.php)

<?php
class SelectList
{
    protected $conn;

        public function __construct()
        {
            $this->DbConnect();
        }

        protected function DbConnect()
        {
            include "db_config.php";
            $this->conn = mysql_connect($host,$user,$password) OR die("Unable to connect to the database");
            mysql_select_db($db,$this->conn) OR die("can not select the database $db");
            return TRUE;
        }

        public function ShowClass()
        {
            $sql = "SELECT * FROM class";
            $res = mysql_query($sql,$this->conn);
            $class = '<option value="0">choose...</option>';
            while($row = mysql_fetch_array($res))
            {
                $class .= '<option value="' . $row['id_cls'] . '">' . $row['name'] . '</option>';
            }
            return $class;
        }

        public function ShowStudent()
        {
            $sql = "SELECT * FROM student WHERE id_cls=$_POST[id]";
            $res = mysql_query($sql,$this->conn);
            $student = '<option value="0">choose...</option>';
            while($row = mysql_fetch_array($res))
            {
                $student .= '<option value="' . $row['id_stu'] . '">' . $row['name'] . '</option>';
            }
            return $student;
        }

}

$opt = new SelectList();

?>

質問

誰かが次のことを行う方法を教えてくれるほど親切でしょうか:

  1. ace_beta.php の「クラス選択」に基づいて、対応する生徒を含むチェックボックスのリストが ace_beta.php の「生徒エリア」に表示されます。
  2. 「送信」ボタンを押した後、ace_add.php で選択された名前を処理するメソッド。
4

1 に答える 1

0

まず、データベース クエリを、データベースへの 1 つの接続を保持するクラスに分割する必要があります。これを取得するには、singletonが必要です。

/**
 * Simple DB class as Singleton.
 */
class Database {

    /**
     * @var PDO
     */
    protected $conn;

    /**
     * @var Database
     */
    private static $instance;

    /**
     * Method that ensures you have only one instance of database
     *
     * @return Database
     */
    public static function getInstance() {
        if (self::$instance === null) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    /**
     * Query method.
     *
     * @example Database::getInstance()->query("SELECT * FROM table where param1 = ? AND param2 = ?", array($param1, $param2));
     *
     * @param string $sql
     *
     * @return array
     */
    public function query($sql) {
        $statement = $this->conn->prepare($sql);
        $args = func_get_args();
        array_shift($args);
        $statement->execute($args);
        return $statement->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * Gets connection
     *
     * @return PDO
     */
    public function getConnection() {
        return $this->conn;
    }

    protected function DbConnect()
    {
        include "db_config.php";

        $dsn = sprintf('mysql:dbname=%s;host=%s', $db, $host);

        try {
            $this->conn = new PDO($dsn, $user, $password,

                // be sure you are have ut8 symbols
                array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));

            // all errors from DB are exceptions
            $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


        } catch (PDOException $e) {
            echo 'Connection failed: ' . $e->getMessage();
            return FALSE;
        }

        return TRUE;
    }

    private function __construct()
    {
        $this->DbConnect();
    }

    private function __clone() {}
    private function __wakeup() {}

}

コードを少し変更しました。今はもっとシンプルに見えますよね?

class SelectList
{

    /**
     * Get class list
     *
     * @return array
     */
    public function getClass()
    {
        $sql = "SELECT * FROM class";
        $res = Database::getInstance()->query($sql);

        return $res;
    }

    /**
     * Get list of students from $classId
     *
     * @param int $classId class students from
     *
     * @return array
     */
    public function getStudent($classId)
    {
        $sql = "SELECT * FROM student WHERE id_cls= ?";

        $res = Database::getInstance()->query($sql, array($classId));

        return $res;
    }

}

そして、ここにあなたの変更がありますace_beta.php

<!--
 considering you are have form that looks like
 <form method="post" action="ace_beta.php">


 and somewhere you are have submit button :)
-->

<td width="25%" valign="top">

    <table border="0" width="100%" cellpadding="6">
        <tr>
            <td width="100%" align="middle" valign="top" bgcolor='#636363'>
                <font face="Arial" size='5' color='#ffffff'><b> STEP ONE </b></font>
            </td></tr></table>

    <br />
    <b> STUDENT INFORMATION ::. </b>
    <br />

    <table border="0" width="100%" cellpadding="3">

        <tr>
            <td width="20%" align="right"> class </td>
            <td width="80%" align="left">
                <select id="class" name="class">
                    <option value="0">choose...</option>
                    <?php foreach ($opt->getClass() as $class): ?>
                        <option value="<?php echo $class['id_cls'] ?>"><?php echo $class['name'] ?></option>
                    <?php endforeach; ?>
                </select>
            </td>
        </tr>

        <tr>
            <td width="20%" align="right"> student </td>
            <td width="80%" align="left">
                <div id="students">

                </div>
            </td>
        </tr>

    </table>

</td>

今あなたの仕事のために:

学生のチェックボックスを取得するには、 AJAXを使用する必要があります。このためには、たとえば次のような名前の別のファイルが必要ですget_students.php

include 'select.class.php';
$opt = new SelectList();

// watch if there are any GET request coming with `class=ID`
if (isset($_GET['class'])) {
    $result = $opt->getStudent($_GET['class']);
    // header for JSON
    header('Content-type: application/json');
    // output JSON (need php 5.2 at least)
    echo json_encode($result);
}

ace_beta.phpページの下部のどこかに追加します。

<!-- this just in case you are have no jQuery yet. -->
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        // when you slect new item.
        $('#class').change(function(){
            $.ajax({
                // go to url with ?class=ID
                url: '//get_students.php?class=' + $(this).val(),
                dataType: 'json'
                // when all is ok:
                success: function(data){
                    var studentsContainer = $('#students');
                    // empty checkboxes.
                    studentsContainer.html('');

                    // iterate throug data
                    $.each(data, function(index, item) {
                        // create new checkobx
                        var checkbox = $('<input type="checkbox" name="students[]" />');
                        // assign value and id for it.
                        checkbox.attr('value', item.id)
                                .attr('id', 'student_' + item.id);

                        // create a label with name inside
                        var label = $('<label />');
                        label.attr('for', 'student_' + item.id);
                        label.html(item.name);

                        // append all of new elements and "<br />" for readability.
                        studentsContainer.append(checkbox);
                        studentsContainer.append(label);
                        studentsContainer.append('<br />');
                    });
                }
            });
        });
    });
</script>

上記の JavaScript は、次の HTML を作成します。

<input type="checkbox" name="students[]" value="1" id="student_1" /><label for="student_1" /><br />
<input type="checkbox" name="students[]" value="2" id="student_2" /><label for="student_2" /><br />
<input type="checkbox" name="students[]" value="3" id="student_3" /><label for="student_3" /><br />

このすべてをテストしたわけではありませんが、これが正しい方向に進むのに役立つことを願っています!

于 2012-12-25T09:51:31.780 に答える