2009-05-24 9 views
0

J'ai un formulaire PHP très simple, qui affiche une case à cocher, et qui sera stocké s'il est coché ou non dans une base de données. Cela fonctionne pour l'insertion initiale, mais pas pour la mise à jour. J'ai testé des cas où $ saleid est égal à $ pk et il n'entre pas dans la branche if pour mettre à jour ... pourquoi?mysql ne se met pas à jour depuis le formulaire 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>"; 
} 
?> 

Répondre

0

Eh bien, je crée une table et a couru votre code et il fonctionne très bien pour moi

la raison pour laquelle il n'a pas « look » comme la mise à jour fonctionne, parce que vous lisez saleid de $ et Checkfield $ de la base de données puis la construction d'une déclaration de mise à jour qui met les deux mêmes valeurs de nouveau dans la base de données

qui est probablement pas ce que vous voulez faire

cette ligne fixe ici $ Checkfield à « checked »,

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

vous définissez Checkfield de $ de la base de données (en remplaçant la valeur « checked »)

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

vous écrire la valeur d'origine de Checkfield retour à la base de données

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

ce qui serait une solution de contournement appropriée? –

0

ne sais pas si vous pouvez mélanger GET et le type POST demandes

peut-être changer cela pour que pk est repassé comme un champ caché?

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

par exemple, un peu comme ce

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

aussi garder à l'esprit si la case à cocher n'est pas cochée, elle ne renverra pas de valeur dans le tableau de cases à cocher [] dans php – bumperbox

+0

le mixage fonctionne bien pour l'insertion ... mais pas pour la mise à jour ... – Josh20002

0

Voici ce que votre HTML devrait ressembler à:

<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> 

Avec ce qui précède, si vous faites:

print_r($_POST); 

vous obtiendrez un tableau qui a soit [d'accord] => "oui" ou non chose, en fonction de si elles cochent la case, donc pas besoin de mettre les supports de tableau, sauf si vous avez des tonnes de boîtes. Comme pour la partie SQL, je suggère de faire de la colonne un type entier unique, où il peut avoir un 0 ou 1. 0 pour non cochée, 1 pour vérifié. Pour l'insertion, vous devriez faire quelque chose comme:

$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')"); 

Cela va mettre votre case à cocher dans la table. Pour le sortir, vous devriez aller avec:

$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> 

Désolé, perdu de la vapeur à la fin. Mais cela couvre l'avant et l'arrière. Utilisez un commutateur 1/0 et réglez simplement une variable comme $ checked sur "checked = 'checked'" si c'est un 1.

+0

comme je le fais en ce moment fonctionne bien, avec mon html ... le seul problème est la déclaration de mise à jour ne devient pas ca lled – Josh20002

0

Vous ne définissez pas la variable $ pk à moins de isset($_GET["pk"]), mais vous êtes toujours l'utiliser plus tard dans la requête. Ce n'est pas une bonne idée, car en fonction d'autres circonstances, cela peut conduire à des bugs. Ce que vous voulez que votre logique ressemble à ceci:

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

le formulaire est toujours appelé avec pk comme un paramètre de mon application ajax donc ce comportement est conçu. Le seul problème pour le moment est que la branche de mise à jour n'est pas entrée. – Josh20002

+0

Je suppose que mon point principal était que vous pourriez simplifier votre logique de sorte que vous deviez tracer à travers moins de différents ensembles d'états pour le débogage .... –

0

Tout comme une note de côté, il semble que la fonction mysql REPLACE serait utile pour vous.

En outre, lorsqu'une case n'est pas cochée, la valeur peut être délicate. J'ai écrit une fonction qui définit la valeur à un, si la valeur affichée est réglée, et zéro sinon ...

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

Vous pouvez exécuter votre valeur de case à cocher affichée throught cette requête et toujours obtenir un ou zéro.

Questions connexes