2009-05-25 21 views
0

次のPHPフォームがあります。これはmysqlデータベースにポストバックしています。私の問題は、更新クエリが機能するようですが、常に "checked"で上書きされることです。私がしたいのは、データベースから現在の値を取得することです。それからポストに値がある場合は、その値を取得します。今...なぜこれは動作していないのですか?それが_POSTにあるかどうかをチェックするときにelse節を持つ必要がありますか?その場合、$ checkDeleted = "";で変数を初期化する必要がありますか?mysqlデータベースの更新ロジックに問題があります

<?php 
error_reporting(E_ALL); 
if (isset($_GET["cmd"])) 
    $cmd = $_GET["cmd"]; else 
if (isset($_POST["cmd"])) 
    $cmd = $_POST["cmd"]; else die("Invalid URL"); 
if (isset($_GET["pk"])) { 
    $pk = $_GET["pk"]; 
} 
$checkDeleted = ""; 
$con = mysqli_connect("localhost","user","pw", "db"); 
$getformdata = $con->query("select ARTICLE_NO, deleted from STATUS where ARTICLE_NO = '$pk'"); 
while ($row = mysqli_fetch_assoc($getformdata)) { 
    $ARTICLE_NO = $row['ARTICLE_NO']; 
    $checkDeleted = $row['deleted']; 
} 
$checkboxes = (isset($_POST['checkboxes'])? $_POST['checkboxes'] : array()); 
if (in_array('deleted', $checkboxes)) $checkDeleted = 'checked'; 
if($cmd=="submitinfo") { 
    if ($ARTICLE_NO == null) { 
     $statusQuery = "INSERT INTO STATUS VALUES (?, ?)"; 
     if ($statusInfo = $con->prepare($statusQuery)) { 
      $statusInfo->bind_param("ss", $pk, $checkDeleted); 
      $statusInfo->execute(); 
      $statusInfo->close(); 
     } else { 
      print_r($con->error); 
     } 
    } else if ($ARTICLE_NO == $pk) { 
     $statusQuery = "UPDATE STATUS SET deleted = ? WHERE ARTICLE_NO = ?"; 
     if ($statusInfo = $con->prepare($statusQuery)) { 
      $statusInfo->bind_param("ss", $checkDeleted, $pk); 
      $statusInfo->execute(); 
      $statusInfo->close(); 
     } else { 
      print_r($con->error); 
     } 
    } 
} 
if($cmd=="EditStatusData") { 
    echo "<form name=\"statusForm\" action=\"test.php?pk=".$pk."\" method=\"post\" enctype=\"multipart/form-data\"> 
         <input type=\"checkbox\" name=\"checkboxes[]\" value=\"deleted\" ".$checkDeleted." /> 
         <label for=\"deleted\">Delete</label> 
         <input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" /> 
         <input name=\"Submit\" type=\"submit\" value=\"submit\" /> 
     </form>"; 
} 
?> 

私はcheckDeletedを次のように変更してみましたが、違いはありませんでした。

if (in_array('deleted', $checkboxes)) { 
$checkDeleted = 'checked'; 
} else { 
$checkDeleted = ''; 
} 

編集:OK、私はこの作業を取得するために管理し、だけ

$ checkDeleted = in_array( '削除'、$チェックボックス)に変更した後がありますか? 'checked': '';

以下の回答によると、これはまだ機能しませんでした。それが機能するためには、私はデータベースクエリを削除し、それをsubmitinfoブランチ内のものと置き換えなければならず、EditStatusDataブランチ内のものと置き換えなければなりません...なぜですか? 1つのクエリしか持てないのはなぜですか?

if($cmd=="submitinfo") { 

$getformdata = $con->query("select ARTICLE_NO from STATUS where ARTICLE_NO = '$pk'"); 

while ($row = mysqli_fetch_assoc($getformdata)) { 
    $ARTICLE_NO = $row['ARTICLE_NO']; 
}  
    if ($ARTICLE_NO == null) { etc 

if($cmd=="EditStatusData") { 
$getformdata = $con->query("select deleted from STATUS where ARTICLE_NO = '$pk'"); 

while ($row = mysqli_fetch_assoc($getformdata)) { 
    $checkDeleted = $row['deleted']; 
} etc 

答えて

0

あなたがデータをGET'ingしている場合にのみ動作します:

$getformdata = $con->query("select ARTICLE_NO, deleted from STATUS where ARTICLE_NO = '$pk'"); 

あなたのコード$ PKでリクエストがPOSTである場合に設定されていません。 $ _GET ['pk']に好きなデータを置くことができ、SQLクエリを壊す可能性があるので、この行の$ pk変数もエスケープする必要があります。

+0

if (in_array('deleted', $checkboxes)) $checkDeleted = 'checked'; 

を交換するような場合

に、常にチェックボックスに設定されているもので、データベースの値を上書きされてやりたいです? –

+0

'(isset($ _ GET ["pk"]))行は、GETリクエストの場合にのみtrueです。 – gacrux

+0

また、ページは常にpkパラメータで呼び出されるので、pkは常にGETを介して設定されます。 –

1

これはかなり同じで、あなたの他の質問

mysql not updating from php form

コードと間違っては何もないのであるあなたが

をしたいと、それは私が何をしたいのかを正確に働いてもらうですデータベースからの現在の値、そしてpostに値がある場合は、代わりにその値を取得します。

ケース1:$ _POST [ 'チェックボックス'] [ '削除']が設定されていない場合、HTMLないティック有するフォームデータベース$ checkDeleted =から読み出さ

  1. を 'チェック'
  2. あるとして、書き込みcheckDeleted $を残すデータベース

ケース2に '確認'。$ _POST [ 'チェックボックス'] [ '削除されたが']に設定されている場合、データベース$ checkDeleted =から読み取るダニ

  1. とHTMLフォームが
  2. 'をチェックし' 変更$ checkDeleted =
  3. 書き込みを 'が確認さ'あなたはダニを持っているか、いない場合は、あなたがにデータベースの値を変更した後、次にチェックし、それを

    を変更する方法がないので、データベース

に関係なく「をチェックし」私はそれが何よと仮定しますuがGETすることが制限されている理由は、この行この

$checkDeleted = in_array('deleted', $checkboxes) ? 'checked' : ''; 
+0

これが機能するためには、データベースクエリはチェックしなければなりませんそれが配列内にあれば? –

+0

上記の例の配列にない場合は、実際にフィールドを ''に設定しようとしています。なぜそれが機能しないのですか? –

+0

改訂された質問をご覧ください... –

関連する問題