在下面的代码中,我试图获取三个表单变量($ 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 回答
你正在使用带有占位符值的预准备语句,这很好,但你也在逃避事情,这很糟糕 . 最终会双重逃避 . 将转义保留到驱动程序,使用占位符值,你会没事的:
还有其他代码你需要在那里纠缠,你做了一些非常奇怪的事情来验证事后的事情,但试着坚持这种一般模式 .
让司机做好工作 . 不要在查询中放置
'?'
. 不要使用插值内联字符串 . Don 't escape anything that'已经是占位符值了 . 尽量保持逻辑清洁明显 .