在下面的代码中,我尝试获取三个表单变量($nps、$sch、$joint)和一个 ID($weld_id),并将它们插入 UPDATE 查询中。问题是我收到 $stmt->error “No data supplied for parameters in prepared statement.”
当我将行的 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.';
}
最佳答案
您正在使用带有占位符值的准备好的语句,这很好,但您也在转义一些东西,这很糟糕。这最终会双重逃避他们。将转义留给驱动程序,使用占位符值,你会没事的:
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.';
}
您还需要处理其他代码,您正在做一些非常奇怪的事情来事后验证这些代码,但请尝试坚持这种通用模式。
让司机完成工作。不要将 '?'
放入您的查询中。不要使用插值内联字符串。不要转义任何已经是占位符值的内容。尽量保持逻辑清晰明了。
关于php - 当 id 被转换为整数而不是字符串时,mysqli 准备语句更新查询失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41726754/