2009-05-24 19 views
0

私は非常に単純なPHPフォームを持っています。このフォームはチェックボックスを表示し、データベースにチェックが入っているかどうかをチェックします。これは最初の挿入では機能しますが、更新では機能しません。私は、$ saleidが$ pkに等しいケースをテストし、ifブランチに更新するために入力しません...なぜですか?mysqlはPHPフォームから更新していません

<?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"]; } 

$checkfield = ""; 

$checkboxes = (isset($_POST['checkboxes'])? $_POST['checkboxes'] : array()); 

if (in_array('field', $checkboxes)) $checkfield = 'checked'; 

$con = mysqli_connect("localhost","user","", "db"); 
if (!$con) { echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error(); exit; } 

$con->set_charset("utf8"); 

$getformdata = $con->query("select saleid, field from STATUS where saleid = '$pk'"); 
$saleid = ""; 
while ($row = mysqli_fetch_assoc($getformdata)) { 
    $saleid = $row['saleid']; 
    $checkfield = $row['field']; 
} 

if($cmd=="submitinfo") { 
    if ($saleid == null) { 
     $statusQuery = "INSERT INTO STATUS VALUES (?, ?)"; 
     if ($statusInfo = $con->prepare($statusQuery)) { 
       $statusInfo->bind_param("sssssssssssss", $pk, $checkfield); 
       $statusInfo->execute(); 
       $statusInfo->close(); 
     } else { 
       print_r($con->error); 
     } 
    } else if ($saleid == $pk) { 
     $blah = "what"; 
     $statusQuery = "UPDATE STATUS SET field = ? WHERE saleid = ?"; 
     if ($statusInfo = $con->prepare($statusQuery)) { 
       $statusInfo->bind_param("ss", $checkfield, $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\"> 
       <h1>Editing information for Auction No: ".$pk."</h1> 
         <input type=\"checkbox\" name=\"checkboxes[]\" value=\"field\" ".$checkfield." /> 
         <label for=\"field\">Test</label> 
         <br /> 
         <input type=\"hidden\" name=\"cmd\" value=\"submitinfo\" /> 
         <input name=\"Submit\" type=\"submit\" value=\"submit\" /> 
     </form>"; 
} 
?> 

答えて

0

だけでなく、私はテーブルを作成し、コードを実行し、それは更新のように「見え」ない理由が働いている

私のために正常に動作し、あなたが の$ saleidを読み取り、$からcheckfieldされているためでありますデータベースには、当時、おそらく

、「確認」にcheckfield $を設定し、あなたがここに

にこのラインをやりたいと思っているものではありませんデータベース

に同じ2つの値を置くUPDATEステートメントを構築します

if (in_array('field', $checkboxes)) $checkfield = 'checked'; 

、あなたが(「確認」の値を上書きする)データベースからの$ checkfieldを設定

while ($row = mysqli_fetch_assoc($getformdata)) { 
    $saleid = $row['saleid']; 
    $checkfield = $row['field']; 

その後、あなたが戻ってデータベース

$statusInfo->bind_param("ss", $checkfield, $pk); 
+0

適切な回避策はありますか? –

0

ないあなたは混在させることができるならばGETとPOSTタイプが

を要求してくださいPKを隠しフィールドとして渡されるように多分これを変更しますか?あなたが行う場合は、上記で

<form id="aform" action="thisform.php" method="post"> 
     <input type="checkbox" name="agree" value="yes" /> 
     <input type="hidden" name="secret" value="shhh" /> 
     <input type="submit" value="do it" /> 
    </form> 

echo "<form name=\"statusForm\" action=\"test.php?pk=".$pk."\" method=\"post\" enctype=\"multipart/form-data\"> 

例えば、ソートのここでは、この

echo "<form name=\"statusForm\" action=\"test.php\" method=\"post\" enctype=\"multipart/form-data\"> 
<input type=\"hidden\" name=\"pk\" value=\"".$pk."\"> 
+0

にcheckfieldの元の値を書き込む場合にも心に留めておきますチェックボックスはチェックされていません。チェックボックスの値が返されません。 – bumperbox

+0

の挿入は正常に動作します。ちょうど更新のためのものではありません... – Josh20002

0

などは、あなたのHTMLがどのように見えるかです

print_r($_POST); 

[同意] =>「はい」または「いいえ」のいずれかの配列を取得しますあなたがボックスをチェックしているかどうかによって、大量のボックスがなければ、配列ブラケットを置く必要はありません。

SQL部分については、列を単一の整数型にすることをお勧めします。ここでは、0または1.0のいずれかをチェックなしに、0をチェックすることができます。あなたは次のようなことをします:

$check_value = ($_POST['agree'] == 'yes') ? 1 : 0; 
    $secret_stuff = $_POST['secret']; 
    mysqli_query("Insert INTO sales_table (secret_column, agree_column) 
       VALUES ('$secret_stuff', '$check_value')"); 

それはあなたのチェックボックスをテーブルに入れます。それを消すには、次のものを用意してください:

$results = mysqli_query("SELECT * from sales_table where secret_column = $secret_stuff") 

    while($row = mysqli_fetch_assoc($results)) { 
    $checked = ($row['agree_column'] == 1) ? "checked=\"checked\"" : ""; 
    $secret_stuff = $row['secret_column]; 
    } 

    ?> 
    <form action=blah method=post id=blah> 
    <input type="checkbox" name="agree" value="yes" <?php echo $checked;?> /> 
    </form> 

申し訳ありませんが、最後に蒸気がなくなります。しかしそれはフロントエンドとバックエンドをカバーします。 1/0スイッチを使用し、$ checkedのような変数を1の場合は "checked = 'checked'"に設定してください。

+0

現時点では、私のHTMLで...唯一の問題は、更新ステートメントがcaを取得していないことですlled – Josh20002

0

isset($_GET["pk"])をまだ設定していない限り、$ pk変数を設定していませんクエリの後半でそれを使用します。これは良い考えではありません。他の状況によっては、これがバグにつながる可能性があるからです。

if pk is not set in form 
    insert new record 
    deal with error if insert failed 
else 
    update existing record 
    check update count and deal with error if 0 records were updated 
     (perhaps by doing an insert of the missing record) 
end 
+0

フォームは常に私のajaxアプリケーションからのパラメータとしてpkで呼び出されるので、これは設計された動作です。現時点の唯一の問題は、更新ブランチが入力されていないことです。 – Josh20002

+0

私の主なポイントは、デバッグのために状態の数を減らしてトレースする必要があるように、ロジックを単純化できるということでした。 –

0

ただ、サイドノートとして、それはREPLACE機能があなたのために便利になるだろうmysqlのようになります:あなたはあなたのロジックは次のようになりたいのは、これがあります。

また、チェックボックスをオンにしないと、値は難しいことになります。私は掲示値が設定されている場合、1に値を設定する関数を書いて、ゼロではない場合...

function checkbox_value($name) { 
    return (isset($_POST[$name]) ? 1 : 0); 
} 

あなたは1を取得し、常にそのクエリthroughtあなたの投稿をチェックボックスの値を実行したりしていますゼロ。

関連する問題