通过PHP更新MySQL数据时出错

时间:2010-02-19 09:28:43

标签: php mysql

我尝试使用复选框更新数据。但是,如果未选中一个或多个复选框,则会返回通知:

注意:第12行的E:\ wamp \ www \ HOSPITAL \ update.php中的未定义索引:stats2

注意:第12行的E:\ wamp \ www \ HOSPITAL \ update.php中的未定义索引:stats3

注意:第12行的E:\ wamp \ www \ HOSPITAL \ update.php中的未定义索引:stats5

<?php
    $con = mysql_connect("localhost","root","");
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }

    mysql_select_db("Hospital", $con);




       mysql_query("UPDATE t2 SET HOSPNUM ='$_POST[hnum]', ROOMNUM='$_POST[rnum]', ADDATE= '$_POST[ad8]', ADTIME='$_POST[adtym]', LASTNAME='$_POST[lname]', FIRSTNAME='$_POST[fname]', MIDNAME='$_POST[mname]', CSTAT='$_POST[cs]', AGE='$_POST[age]', BDAY='$_POST[bday]', ADDRESS='$_POST[ad]', SEX='$_POST[sex]', 
                                                                                                                                                                                                                                                                                                               STAT='$_POST[stats1]', STAT2='$_POST[stats2]', STAT3='$_POST[stats3]', STAT4='$_POST[stats4]', STAT5='$_POST[stats5]', STAT6='$_POST[stats6]', STAT7='$_POST[stats8]', STAT8='$_POST[stats8]', NURSE='$_POST[nurse]'              
        WHERE TELNUM ='$_POST[telnum]'");



    mysql_close($con)
    ?>

你可以帮助我,以便通知不会出现吗?

5 个答案:

答案 0 :(得分:1)

这是复选框的定义行为 - 只有当它们包含在表单数据中时才会被设置。

您应该使用isset()来确定是否选中了复选框。

将其更改为

STAT='".isset($_POST['stats1']).", 
STAT2='".isset($_POST['stats2']).", 
STAT3='".isset($_POST['stats3']).", 
STAT4='".isset($_POST['stats4']).",  
STAT5='".isset($_POST['stats5']).", 
STAT6='".isset($_POST['stats6']).", 
STAT7='".isset($_POST['stats8']).", 
STAT8='".isset($_POST['stats8'])." 

另一种解决方法是在复选框之前添加一个名称相同的隐藏变量:例如

<form action='t1.php' method='post'>
<input type='hidden' name="cb1" value="0">
<input type='checkbox' name="cb1" title='test'>
<input type='submit'  >
</form>
<?php 
print_r($_POST);
?>

答案 1 :(得分:1)

$_POST数组不包含stats2索引。这是因为当未选中复选框时,它将不会包含在帖子请求中。

如果表单元素是静态的,那么您可以检查它们是否已设置: 将STAT6='$_POST[stats6]'替换为STAT6=(array_key_exists('stats6', $_POST))

如果表单元素是动态生成的,例如:

foreach($students as $student)
{ 
    echo "<input element='checkbox' name='student-is-present-{$value}'>";
}

然后在表单中包含一个隐藏元素,以便您可以确定已检查的内容以及未检查的内容:

foreach($students as $student)
{ 
    echo "<input element='hidden' name='student-{$value}' value='student-is-present-{$value}'>";
    echo "<input element='checkbox' name='student-is-present-{$value}'>";
}

您应该引用数组键。例如,使用$_POST['stats5']代替$_POST[stats5]。您的SQL也向SQL injection开放。为避免这种情况,您应该使用mysql_real_escape_string()等函数来转义数据。

答案 2 :(得分:0)

当您在表单上有一个复选框时,如果勾选该框,则仅将其值发送到服务器。如果没有勾选,则该键不会存在于$ _POST数组中,因此会出现错误。

答案 3 :(得分:0)

您还应该使用mysql_real_escape_string清理输入以防止mysql注入。

答案 4 :(得分:0)

您不应该直接在数组中使用POST和GET变量。你应该清理它们,搜索mysql注入以了解更多信息:

$hnum = isset($_POST['hnum']) ? mysql_real_escape_string($_POST['hnum']) : '';

然后使用这些变量。这样就可以避免使用mysql注入并解决这些注意事项