2016-09-09 8 views
0

私は、管理者が従業員が提出したアクセスフォームとレビューフォームを持つWebサイトを作成するためにPHPを使用しています。レビューPHPファイルでは、基本的にフォームを承認または不承認とする2つのボタンを作成しました。ボタンの1つをクリックすると、別のPHPファイルにリダイレクトされ、実際にMySQLデータベースに「処理済」という名前の列に変更が挿入されます。処理されていない0が1に変更され、処理されます。私が参照しているテーブルには、formid、フルネーム、部門、その他の仕事に関連するもののほか、管理者がレビュー対象の保留中のフォームがあるかどうかを確認できる「処理済」カラムなどがあります。SQL - 既存の行を変更する

私の問題は、実際にMySQLが適切な行を見つけて、すべてのセルを再度挿入する必要なしに、0から1までの名前の「処理済み」のセルだけを変更することを実際にどのように許可するか分かりません。ここで私は今まで試みているものです:

$id = $_SESSION[id]; 
$fullname = $_SESSION[fullname]; 
$teamformid = $_SESSION[teamformid]; 

if (isset($_POST['approved'])) { 
    $sql = "INSERT INTO carforms (processed) where aboveid='$id' and processed='0' and teamformid=$teamformid 
    VALUES ('0')"; 
} 

else if (isset($_POST['disapproved'])) { 
    //todo 
} 

私は私が望む特定の行を検索し、処理され、1つの列のみを変更するためにSQLを伝えるにはどうすればよいですか?

また、INSERT INTOコマンドを使用するときは、必ずすべての列名を入力する必要がありますか?

ありがとうございます。

+2

は、表に挿入 '... INSERTで(COL1、CO2)VALUES(val1と、VAL2)' – techspider

+2

た場合に列を指定することをお勧めします挿入するのではなく更新する行がすでに存在しています。 http://dev.mysql.com/doc/refman/5.7/en/update.html – chris85

答えて

0
すでに存在して明らかにこれだけ作品

あなたのために働く下のコードを使用してください。

$id = $_SESSION[id]; 
$fullname = $_SESSION[fullname]; 
$teamformid = $_SESSION[teamformid]; 

if (isset($_POST['approved'])) { 
    $sql = "UPDATE `carforms` SET processed = '1' WHERE `aboveid` = '".$id."' AND `teamformid` = '".$teamformid."'"; 
} 
0

試してください:あなたはMySQLのUPDATEコマンドを使用する必要があるように私はあなたの質問から解釈したものから

"UPDATE carforms SET processed = 1 WHERE aboveid = $id AND teamformid = $teamformid"

0

、それはそうです。これにより、既存の行がすべて更新されます。

たとえば、「フォーム」という名前のテーブルがあり、プライマリキー 'form_id'と 'processed'という名前のフィールドがあるとします。

私たちは「1」「に処理された」の値を変更したい場合は、私たちが実行します...

UPDATE forms SET processed = 1 WHERE form_id = [whatever number the form is]; 

(form_id付き)フォームが

0

SQLには「INSERT ... WHERE」はありません。

既存のレコードを変更するには、REPLACEまたはUPDATEという2つのオプションがあります。前者はレコードが存在しない場合にレコードを作成し、INSERTと同様の構文を持ちます。 UPDATEはWHERE句を使用して、変更するレコードを識別します。

REPLACEを使用するのは難しいです。新しいレコードをINSERTするか既存のUPDATEを行うべきかどうかを検討する必要があります。これは、表示されたデータ値がすでにテーブルのユニークなインデックスに存在するかどうかをチェックすることによって行います。レコードを更新しないでください。今すぐユニークなインデックスがあっても、アプリケーションの進化に伴ってこれらの構造が変化する可能性がありますので、OLTPにはREPLACEを使用しないことをお勧めします。あなたが書いたあなたの質問に

aboveid = '$のID' と処理さ= '0' とteamformid = $ teamformid

あなたが公表されていた場合(これは参考になりましたでしょうスキーマの関連部分)

'id'は通常、一意の識別子を表します。したがって、同じIDを持つ複数のレコードが存在しないようにする必要があります。そのため、WHERE句の残りの部分は冗長です(しかし、SQLインジェクションの手段を提供します - 良いことではありません)。

carformsの該当するレコードは一意に「ID」の値によってIDENTIFEDされている場合、あなたのコードは次のようなもの次のようになります。

$id=(integer)$id; 
$sql = "UPDATE carforms SET processed = $action WHERE aboveid=$id"; 

しかし、別の問題がここにあります。 3つの可能な状態が記録のためにあります。

  • まだ

を承認した。しかし、あなたが唯一の私たちには約2可能な状態を言った減処理されません。初期状態がNULLであると仮定すると、コードは次のようになります。

$action=0; 
if (isset($_POST['approved'])) { 
    $action=1; 
} 
$id=(integer)$id; 
$sql = "UPDATE carforms SET processed = $action WHERE aboveid=$id"; 
if ($id && 
    (isset($_POST['disapproved']) || isset($_POST['approved'])) 
    ) { 
    // apply the SQL to the database 
} else { 
    // handle the unexpected outcome. 
} 
関連する問題