首页 文章

当id被转换为整数而不是字符串时,mysqli预处理语句更新查询失败

提问于
浏览
1

在下面的代码中,我试图获取三个表单变量($ nps,$ sch,$ joint)和一个id($ weld_id)并将它们插入到UPDATE查询中 . 问题是我得到$ stmt-> error“没有为预准备语句中的参数提供数据 . ”

当我将行的id转换为“i”时 . 奇怪的是,如果我在最后一个问号周围放置单引号并转换为's',则该语句将执行无错误,但是,实际的数据库行不会更新 . 第3行上的函数不使用预准备语句来选择数据库中此行的当前值 .

我有var_dumped所有变量,复制它们并成功运行MySQL工作台上的查询 . 我没有想法,请帮忙 .

$weld = mysqli_real_escape_string($db,$_POST['id']);
$weld = single_weld_query($db,$weld);
if(isset($_POST['edit_weld_parameters'])){
    // Query to update 3 parameters on database entry where id = N
    $stmt       = $db->prepare("UPDATE `welds` SET `size` = '?' , `sch` = '?' , `joint` = '?' WHERE `id` = ?;");
    $stmt->bind_param("sssi", $nps, $sch, $joint, $weld_id);
    $nps        = isset($_POST['size'])?    mysqli_real_escape_string($db,$_POST['size']):          $weld['size'];
    $sch        = isset($_POST['sch'])?     mysqli_real_escape_string($db,$_POST['sch']):           $weld['sch'];
    $joint  = isset($_POST['joint'])?   mysqli_real_escape_string($db,$_POST['joint']):         $weld['joint'];
    $nps        = (strlen($nps) and in_array($nps,$pipe_obj->sizes))?                       $nps:   $weld['size'];
    $sch        = (strlen($sch) and in_array($sch,$pipe_obj->schedules))?                   $sch:   $weld['sch'];
    $joint  = (strlen($joint) and in_array(strtoupper($joint),$pipe_obj->joint_types))? $joint: $weld['joint'];
    $weld_id    = $weld['id'];
    if($stmt->execute()){
        echo $weld['weld_number'].' parameters edited.';
    }else{
        echo $stmt->error;
    }
}else{
    echo 'ERROR: Form failure.';
}

1 回答

  • 1

    你正在使用带有占位符值的预准备语句,这很好,但你也在逃避事情,这很糟糕 . 最终会双重逃避 . 将转义保留到驱动程序,使用占位符值,你会没事的:

    if (isset($_POST['edit_weld_parameters'])) {
        // Query to update 3 parameters on database entry where id = N
        $stmt = $db->prepare("UPDATE `welds` SET `size` = ? , `sch` = ? , `joint` = ? WHERE `id` = ?;");
        $stmt->bind_param("sssi",
           isset($_POST['size']) ? $_POST['size'] : $weld['size'],
           isset($_POST['sch']) ? $_POST['sch'] : $weld['sch'],
           isset($_POST['joint'])?   $db,$_POST['joint'] : $weld['joint'],
           $weld['id']
        );
    
        if ($stmt->execute()) {
            echo $weld['weld_number'].' parameters edited.';
        }
        else {
            echo $stmt->error;
        }
    }
    else {
        echo 'ERROR: Form failure.';
    }
    

    还有其他代码你需要在那里纠缠,你做了一些非常奇怪的事情来验证事后的事情,但试着坚持这种一般模式 .

    让司机做好工作 . 不要在查询中放置 '?' . 不要使用插值内联字符串 . Don 't escape anything that'已经是占位符值了 . 尽量保持逻辑清洁明显 .

相关问题