PHP mysqli代码出现Undefined index: do错误,如何消除该报错?
解决PHP mysqli代码中「Undefined index: do」的错误
这个错误其实很常见,原因也很直白:当你直接加载这个页面(没有通过带?do=sparatid或?do=nytid的链接触发操作)时,$_GET['do']这个变量根本不存在,PHP就会抛出「Undefined index: do」的警告——虽然不影响表单功能,但确实看着闹心,咱们来搞定它。
核心解决思路:先判断变量是否存在,再判断值
你需要先检查$_GET['do']这个键是否存在,再去判断它的值是什么,有两种常用写法:
写法1:用isset()做前置判断
直接在条件里先确认do参数存在,再做值的比较:
if(isset($_GET['do']) && $_GET['do'] == 'sparatid'){ $datum=$_POST['datum']; $info=$_POST['info']; $color=$_POST['color']; $uppdatera = "UPDATE narvaro SET info = '{$info}', color = '{$color}' WHERE datum = '{$datum}'"; $res = mysqli_query($con, $uppdatera) or die("SQL: Gick ej att uppdatera informationen $uppdatera <br>".mysqli_error($con)); } elseif(isset($_GET['do']) && $_GET['do'] == 'nytid'){ $datum=$_POST['datum']; $info=$_POST['info']; $color=$_POST['color']; $sql = "insert into narvaro (fornamn, efternamn, datum, info, narvaro_id, pos, color) SELECT (fornamn), (efternamn), '$datum', (info), (narvaro_id), (pos), '$color' FROM narvaro WHERE datum ='2018-02-28'"; $results = mysqli_query($con, $sql); }
(顺便提一句:你原来的错误提示用了mysql_error(),应该改成mysqli_error($con)才对,因为你用的是mysqli扩展)
写法2:PHP7+可用null合并运算符简化
如果你的PHP版本是7.0及以上,可以先给$do赋一个默认值,再判断:
// 如果$_GET['do']不存在,就设为空字符串 $do = $_GET['do'] ?? ''; if($do == 'sparatid'){ // 你的更新代码 } elseif($do == 'nytid'){ // 你的插入代码 }
重要提醒:你的代码有SQL注入风险!
虽然你现在的问题是消除错误,但必须提一句:直接把$_POST里的变量拼到SQL语句里是非常危险的,攻击者可以轻易篡改你的数据库数据。建议改用mysqli预处理语句来避免这个问题,比如更新部分可以改成这样:
if(isset($_GET['do']) && $_GET['do'] == 'sparatid'){ $datum=$_POST['datum']; $info=$_POST['info']; $color=$_POST['color']; // 预处理语句,用?作为占位符 $uppdatera = "UPDATE narvaro SET info = ?, color = ? WHERE datum = ?"; $stmt = mysqli_prepare($con, $uppdatera); // 绑定参数,"sss"表示三个字符串类型的参数 mysqli_stmt_bind_param($stmt, "sss", $info, $color, $datum); mysqli_stmt_execute($stmt); // 可以添加执行结果判断 if(mysqli_stmt_affected_rows($stmt) > 0){ echo "信息更新成功"; } else { echo "更新失败或无数据需要修改"; } mysqli_stmt_close($stmt); }
插入部分也可以用同样的方式改写,彻底杜绝SQL注入风险。
内容的提问来源于stack exchange,提问作者calle.fr
相关产品推荐
相关产品推荐

