1

PHPフレームワークCOdeigniterでPDOドライバーを使用しています。

誰かが「送信」ボタンを押したら実行しなければならないクエリが2つあります。

1つは挿入、次は挿入(問題クエリ)は更新です。

これは私のモデルのコードスニペットです:

function studenttime($anum) {
    try {
        $times = NULL;

        $sql = "UPDATE student SET last_visit = :times WHERE anum = :anum";
        $time = $this -> db -> conn_id -> prepare($sql);
        $time -> bindParam(':times', $times);
        $time -> bindParam(':anum', $anum);
        $time -> execute();
        if ($time -> rowCount() == 1) {
            return $time;
        }

    } catch (PDOException $e) {
        error_log($e -> getMessage());
        die("An Error Occured, Contact System Admin - Err: SFM136");
    }
}

これは私のコントローラーです:

} else {
                if ($session = $this -> staff_model -> session($anum, $why, $aidyear, $comments) && $time = $this -> staff_model -> studenttime($anum)) {

                    $this -> session -> unset_userdata('anum');
                    $this -> session -> unset_userdata('first');
                    $this -> session -> unset_userdata('last');
                    $this -> session -> unset_userdata('aidyear');
                    $this -> session -> unset_userdata('why');
                    $this -> session -> unset_userdata('comments');

                    redirect('staff_controller/studentlogin', 'location');
                }
            }

私のモデルで$session= sessionを呼び出す最初のクエリは、問題なく機能します...

次に、&&を使用して1つのelseステートメントで2つのクエリを実行しようとしましたが、2番目のクエリがifステートメントの結果にさえ影響を与えていないようです。

私のコントローラーにはこれらの種類のコードスニペットがたくさん散らばっているので、ここで何が間違っているのかわかりません。そのため、この特定のコードスニペットの問題はわかりません。

4

3 に答える 3

1

これは、演算子の優先順位によるものです。

例として、このコードを実行してみてください。

if ($a = 5 && $b = 6) {
    var_dump($a); // Output: bool(true)
}

なんで?これと同じなので:

if ($a = (5 && $b = 6)) {
    var_dump($a); // Output: bool(true)
}

話の教訓:if文などの内部の割り当てを括弧で囲みます。

これはうまくいくはずです:

if (($session = $this -> staff_model -> session($anum, $why, $aidyear, $comments)) && ($time = $this -> staff_model -> studenttime($anum))) {

混乱を招くという理由だけで、そのようなifステートメントで複数の割り当てを避けることをお勧めします。

于 2013-03-09T18:24:12.983 に答える
0

if ステートメントは、あなたとコードを読む他の人にとって読みやすくする必要があります。また、if ステートメントの途中で変数に値を割り当てないでください。そこに到達するまでにすべてを決定する必要があります。プログラミング言語が if ステートメントで変数の割り当てを処理できるからといって、それが実行されるわけではありません。彼らがうまくいくと思うように働きなさい。

$a = $session = $this -> staff_model -> session($anum, $why, $aidyear, $comments);
$b = $time = $this -> staff_model -> studenttime($anum);

これで、次のようなことができます。

if($a && $b)
{
    //...
}

そして、アクティブなすべてのセッションの設定を本当に解除しようとしている場合は、次を使用できます

session_destroy();

ただし、サブセットのみを破壊しようとしている場合は、確かに、あなたがやっている方法でそれを行ってください.

私が投稿した $a と $b が正しいかどうかはわかりません (あなたからコピー/貼り付け)。

于 2013-03-09T18:34:34.167 に答える
0

問題は、実際には私のモデルの他の方法から発生していました:

function checkanum($anum) {
        try {
            $sql3 = "SELECT * FROM student WHERE anum = : anum";
            $check = $this -> db -> conn_id -> prepare($sql3);
            $check -> bindParam(':anum', $anum);
            $check -> execute();
            if ($check -> rowCount() == 1) {
                return $check;
            }
        } catch (PDOException $e) {
            error_log($e -> getMessage());
            die("An Error Occured, Contact System Admin - Err: ST_M79");
        }
    }

== 0 に等しかったので、1 にする必要があります。

私のコントローラーは、レコードが既に存在するかどうかを確認し、存在する場合は、再度クエリされた時間を更新するだけでした。if ステートメントの割り当ての 1 つを意図的にスペルミスしたときに、エラーが発生していないことに気付きました。これにより、ロジックに欠陥があることを判断するために必要な情報が得られました。現在、すべてが完全に機能しています。

ご意見ありがとうございます。そして、オスカーが追加した追加が好きです:

これはうまくいくはずです:

if (($session = $this -> staff_model -> session($anum, $why, $aidyear, $comments)) && ($time = $this -> staff_model -> studenttime($anum))) {

そのような if ステートメントで複数の割り当てを避けることをお勧めします。単純に、それは紛らわしいからです。

非常に理にかなっています。+1

于 2013-03-09T19:42:06.637 に答える