• ベストアンサー

IFで処理を分けたい

PHP4.4で掲示板を作成しています。 記事の削除時に、 ・入力された削除用パスワードがカラム「削除用パスワード」とマッチ  もしくは、管理者用パスワードとマッチしていたら、削除するように  そうでなかった場合は、それと分かるステータスを返すようにしたい  のですが、そのSQLの書き方がわかりません。 ここではPOSTされたパスワードは1234、管理者用パスワードは9999、テーブル名はbbs、記事IDを10と仮定して例を書きます。 SQLの文法としては滅茶苦茶かもしれませんが、大体こういう事をしたいという意味です。 case when (1234 == bbs.password or 1234 == 9999) then   delete from bbs where post_id=10; else   return -1; end return-1の理由は、パスワードが違っていたという事を知りたいからです。 よろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.2

がると申します。 んと…SQLで全部やらなくても、と思うのですがいかがでしょうか? よく「1文の複雑なSQLで様々なことを片付けようとする」状況を拝見しますが、後々の保守とか考えるとまずお勧めできません。 SQL:入力された削除用パスワードがカラム「削除用パスワード」とマッチしたか? SQL:入力された削除用パスワードが管理者用パスワードとマッチしたか? PHP:いずれかのパスワードにマッチしたら SQL:対象情報を削除 PHP:いずれのパスワードにもマッチしなかったら 適切なメッセージなりを出力 という風にきちんと分解して作成されることをお勧めいたします。

ibayac
質問者

お礼

はい、自分でもその様に解決しました。 (1)PHPから「select del_password from bbs where post_id = XXXX」というSQLを実行し、パスワードを取得 (2)PHP上で入力されたパスワードが(1)のパスワードと同じか、もしくは管理者用の特別な番号であるかチェック(DB上のパスワードが空白の場合は入力されたパスワードと同じでも消させない) (3)削除すべき場合は「delete from bbs where post_id=XXX」を実行 ということで、なるべくSQLはシンプルにし、判断処理はPHP上で実行することで回避しました。 今回はループの中で呼ばれる処理でもないし、これで解決とし、どうしても複雑なSQLを記述する必要にせまられたら、その時考慮することにします。 ありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>パスワードが違っていたという事を知りたい あくまでもSQLですのでWHERE節で条件をつなげて、正であれば削除されるし 偽であれば削除されないという認識の方がよろしいかと。 最終的にはPHP側ではmysql_affected_rows()で影響のあった行数を拾えば よいのですから。

参考URL:
http://www.php.net/manual/ja/function.mysql-affected-rows.php

関連するQ&A

  • 簡単なif文でちゃんと分岐しません

    今参考書を見ながらやっていますがうまくいきません。 postからusernameとpasswordの値を受け取って処理する スクリプトなんですが、うまく作動してくれません。 ■問題点 分岐点が4箇所ありますが、 パスワードだけ間違っても、すべて■1■ ログイン処理状態になります。 どうしてもパスワード再設定の画面に切り替わりません。 入力されたデータはデータベースにきちんと入ります。 3日間これで悩んでいて、ついに投稿してみました。 こんなこともわからない私ですが なんとかお願い致します。 ----ここから---- <?php session_start(); $username = $_POST["username"]; $sql = "SELECT * FROM `art_users` WHERE `user_name` = '%{$username}%'"; $query = mysql_query($sql) or die("データ追加エラー" . mysql_error()); $record = mysql_fetch_array($query, MYSQL_ASSOC); if ( $_POST["mode"] == "login" && mysql_num_rows($query) > 0 && $_POST["password"] == $record["user_password"] ) { $_SESSION["userid"] = $record["user_id"]; header("Location: kaukau_top.php"); } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ログイン処理</title> </head> <body> <?php // ■1■ ログイン処理状態 if ( $_POST["mode"] == "login" ) { // 新規登録:クエリ実行結果が0行=既存ユーザー名と一致しない if ( mysql_num_rows($query) == 0 ) { echo '新規ユーザー登録<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="mode" value="register">'; echo '<input type="submit" value="登録">'; echo '</form>'; } // パスワードミス:クエリ実行結果のパスワードと入力されたパスワードが一致しない elseif ( $_POST["password"] != $record["user_password"] ) { echo 'パスワードが違います。<br>'; echo 'ひみつの質問に答えると、パスワードを変更できます。<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="resetpassword">'; echo '<input type="submit" value="送信">'; echo '</form>'; } } // ■2■ パスワード再設定状態 elseif ( $_POST["mode"] == "resetpassword" ) { if( $record["user_answer"] == $_POST["answer"] ) { echo 'パスワード再設定<br>'; echo '<form action="kaukau_login.php" method="POST">'; echo '<input type="hidden" name="username" value="' . $username . '">'; echo '<input type="hidden" name="mode" value="modifypassword">'; echo '<input type="submit" value="登録">'; echo '</form>'; } else{ echo "ひみつの答えが違います"; } } // ■3■ 新規ユーザー登録状態 elseif ( $_POST["mode"] == "register" ) { if( $_POST["password"] == $_POST["confirm"] ) { $sql = "INSERT INTO users (user_name, user_password, user_question, user_answer) VALUES ("; $sql .= " '" . $_POST["username"] ."',"; $sql .= " '" . $_POST["password"] ."',"; $sql .= " '" . $_POST["question"] ."',"; $sql .= " '" . $_POST["answer"] ."')"; $result = mysql_query($sql); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } // ■4■ パスワード変更状態 elseif ( $_POST["mode"] == "modifypassword" ) { if ( $_POST["password"] == $_POST["confirm"] ) { $sql = "UPDATE users"; $sql .= " SET user_password = '" . $_POST["password"] . "'"; $sql .= " WHERE user_name = '" . $_POST["username"] . "'"; mysql_query( $db, $sql ); echo '登録しました。'; } else { echo 'パスワードを再確認してください。'; } } ?> </body> </html>

    • 締切済み
    • PHP
  • phpのif文について

    下記の表現をした際に、必ずif文がelseの方に流れてしまいます。 そこで条件式をいろいろ書き換え試したところ、 if($_SESSION['user_id'] = $employee_id) ↓ if($_SESSION['user_id'] == $employee_id) に書き換えた際にだけ、elseに流れず、 ==の関係が成り立ちます。 その際に変更しているのは、条件式だけで他のコードを変更していません。 どのように変更すれば、正しく条件式が機能しますか? <?php $sql = "SELECT * FROM thread_detail WHERE thread_id = $id"; $date = mysql_query($sql,$link); $logs = array(); while ($post = mysql_fetch_assoc($date)) { $logs[] = array($post['thread_detail_id'], $post['parent_thread_detail'], '<a href="thread.php?id='.$post['thread_id'].'&res='.$post['thread_detail_id'].'">'.$post['post_date'],$post['employee_id'].'</a>', $post['body'],'<a href="thread.php?id='.$post['thread_id'].'&edit='.$post['thread_detail_id'].'">編集</a>', '<a href="remove_thread.php?id='.$post['thread_id'].'&delete='.$post['thread_detail_id'].'"'.'onclick="return confirm(\'本当に削除しますか?\');">削除</a>'); } foreach ($logs as list($no, $oya, $create_date, $employee_id, $kiji, $edit, $delete)) { if ($oya > 0) { continue; } if($_SESSION['user_id'] == $employee_id) { print $create_date. $employee_id .'<br>'. $kiji . $edit . $delete . '<br>'; } else { print $create_date. $employee_id .'<br>'. $kiji . '<br>'; } listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $create_date, $employee_id, $kiji, $edit, $delete)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<ul>'; } if($_SESSION['user_id'] == $employee_id) { print '<li>' .$create_date.$employee_id.'<br>'. $kiji . $edit . $delete . '<br>'.'<br>' . '</li>'; } else { print '<li>' .$create_date.$employee_id.'<br>'. $kiji . '<br>'.'<br>' . '</li>'; } listchild($logs, $no); } if ($ct > 0) { print '</ul>'; } } ?>

    • 締切済み
    • PHP
  • MySQLに日本語を登録すると文字化けする

    お世話になります。 PHPを使用して日本語文字を登録しようとすると文字化けします。 どこをどのようにすれば文字化けはなおるのでしょうか? ソースは以下で書いています。 よろしくお願いします。 <?php function blank($value){ if(isset($value)){ if(is_array($value)){ return count($value)==0; }else{ return $value==""; } } return true; } if(blank($_POST["phonenumber"])||blank($_POST["password"])||blank($_POST["name"])||blank($_POST["mail"])){ ?> <p>名前、E-mail、携帯番号またはパスワードを入力してください</p> <p><a href="input.html">戻る</a></p> <?php }else{ $name= $_POST["name"]; $mail= $_POST["mail"]; $phonenumber = $_POST["phonenumber"]; $password= $_POST["password"]; $link=mysql_connect("localhost","id","password"); if(!$link){ die("データベースに接続できません"); } $db=mysql_select_db("id"); if(!$db){ die("データベースを選択できません"); } $sql=<<<SQL insert into password(phonenumber,password,name,mail)value("{$phonenumber}","{$password}","{$name}","{$mail}") SQL; $result=mysql_query($sql,$link); if(!$result){ die("同じ携帯番号で登録済です。"); }else{ print("正常に登録が終了しました"); } } ?>

    • ベストアンサー
    • PHP
  • phpのif文について

    phpでログイン処理のif文を書いています。 nameとpasswordのフィールドが記入されているのかをチェックするif文を書いたのですが、機能してくれません。何かが間違っているのでしょうか。 何も入力しないor間違った情報を入力する ということをしてもログインが出来てしまいます。 どなたかテェックお願い致します。 <?php require('dbconnect.php'); session_start(); if ($_COOKIE['name'] != '') { $_POST['name'] = $_COOKIE['name']; $_POST['password'] = $_COOKIE['password']; $_POST['save'] = 'on'; } if (!empty($_POST)) { // ログインの処理 if ($_POST['name'] != '' && $_POST['password'] != '') { $sql = sprintf('SELECT * FROM members WHERE name="%s" AND password="%s"', mysql_real_escape_string($_POST['name']), sha1(mysql_real_escape_string($_POST['password'])) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { // ログイン成功 $_SESSION['id'] = $table['id']; $_SESSION['time'] = time(); // ログイン情報を記録する if ($_POST['save'] == 'on') { setcookie('name', $_POST['name'], time()+60*60*24*14); setcookie('password', $_POST['password'], time()+60*60*24*14); } header('Location: index.php'); exit(); } else { $error['login'] = 'failed'; } } else { $error['login'] = 'blank'; } } ?>

    • ベストアンサー
    • PHP
  • DELETE構文

    今、PostgreSQLの中にあるデータを 削除しようとしていますが、構文がDELETE構文が正しくなく 上手く削除することができせん。 環境→WindowsXP register_globals=offです。 ※フォームの部分は、文字制限の為、省略させて下さい。 画面構成 //ここにPostgreSQLから取得されたデータが //乗っています。 ID[入力欄] Name[入力欄] Score[入力欄] (削除ボタン) 構文 //PostgreSQLに接続 $conn = pg_pconnect("user=postgres password=grjtf dbname=mytbl"); //登録データを削除する if(isset($_POST["action"]) && $_POST["sign"] == '一行削除') { //IDが書かれていた場合 if($_POST["id"]) { //データを削除する $sql3="DELETE FROM mytb(id) WHERE $_POST['id'] = ('{$_POST['id']}')"; //データベースに問い合わせて、クエリを実行する pg_query($conn,$sql3); //成功メッセージ print "データを一件削除しました。<br>"; } else { //失敗メッセージ print "IDが書かれていないため、削除できません。<br><br>"; } }

    • 締切済み
    • PHP
  • php+mysqlで複数選択削除について

    php+mysqlで複数選択削除について いつもお世話になっておりますm(_ _)m 今回の質問なんですが チェックボックスで複数選択したものを一括で削除したいのですが、検索しても見つからないので質問しました!! 例) // $_POST["id"] ← チェックボックスより選択されたデータ // test ← テーブル名 foreach($_POST["id"] as $del){ delete test where id = $del; } 簡単にですいません;; 普通は上記のようにループさせながら削除すると思うのですが、ループさせないで一括で削除したいのですが可能でしょうか? 下記の様にカンマ区切りで一括削除は可能でしょうか? $sql = "delete test where "; foreach($_POST["id"] as $del){ $sql .= "id = $del, "; } クエリ発行

    • ベストアンサー
    • MySQL
  • 異なるスキーマからデータを抽出するには?oracl、PL/SQL

    Oracle初心者です。検索してもなかなかhitしないので、質問させていただきます。 aaaとbbbというスキーマがあると仮定します。 aaaにはパスワードテーブル bbbにはユーザテーブルがあるとします。 ユーザテーブル、パスワードテーブルにはそれぞれuser_idカラムがあり、そのuser_idをキーにして、aaaのpasswordカラムのデータを取得したいと思っています。 sql*plusでbbbに接続して、作業をしています。 言語はPL/SQLを使用しています。 単純に SELECT a.password FROM aaa.パスワードテーブル a, bbb.ユーザテーブル b WHERE a.user_id = b.user_id とすれば良いのかと思っていたら、違うようで、オブジェクトが存在しないと言うエラーになりコンパイルが通りません。 このよう違うスキーマのテーブルを参照する場合、どのようにすれば良いのでしょうか?

  • password_verifyがうまくできません

    不思議なことが起こります。 password_hash()で生成したパスワードをデータベースに保存しています。 それを取り出し、password_verifyでマッチするか否かを調べているのですが、 データベースから取り出したものだとマッチせず、 それをprintで出したものをコピー&ペーストで変数にいれたものはマッチします。 うまく説明できず、申し訳ないのですが…… $id = 66; require_once 'dbmanager.php'; $pdo = getDb(); $sql = "select password from members where id = $id"; $stmt = $pdo->prepare($sql); $stmt->execute(); $row = $stmt->fetch(PDO::FETCH_ASSOC); $hash = $row['password']; // print $hash; すると、「$2y$09$poBgU6PYziypG6dBtvDiYuG.9kPdTHVkTymLxo2RiCnC3NG.67ZhC」と表示されます。 そして、 $hash = $row['password']; とすると、マッチせず、 $hash = '$2y$09$poBgU6PYziypG6dBtvDiYuG.9kPdTHVkTymLxo2RiCnC3NG.67ZhC'; とすると、マッチします。 if (password_verify('****', $hash)){ echo 'あっている'; } else { echo '間違っている'; } どうしたら、データベースから取り出した値で直にマッチさせることができるのでしょうか。 もの凄く基礎的なところで間違っているのでしょうか。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • MySQLのUPDATE文について

    以下のようなスクリプトを書いた時に、phpMyAdminで、テーブルの中身をみると、 photo カラムには、添付画像ファイルのファイル名の値が入っているのに、 bbs.php側からアップデートしようとすると、ip_add以下passwordまでのカラムの 中身が空なのです。SQLの文法的に何かまちがってるでしょうか? 一応、ラストレコードのカラムを更新することを念頭に置いておりますが。 <file_upload.php> $sql = "INSERT INTO bbstbl_test (photo) VALUES('$upfilename');"; -------------------------------------------------------------------------------- <bbs.php> $sql = "UPDATE bbstbl_test SET ip_add = $ip_add, date = $date, name = $name, email = $email, title = $title, message = $message, password = $password;";

    • ベストアンサー
    • PHP
  • レコード削除・sqlインジェクション対策

    このようなSQL文は危険でしょうか? $sql = "delete テーブル名 where id = :id"; $stmt = $dbh->prepare($sql); $stmt->execute(array(":id" => $_POST['id'])); 上記の例だと、$_POST['id']は、 ちゃんとエスケープできているのでしょうか?

    • ベストアンサー
    • MySQL