php - 当 id 被转换为整数而不是字符串时,mysqli 准备语句更新查询失败

标签 php mysql mysqli prepared-statement

在下面的代码中,我尝试获取三个表单变量($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/

相关文章:

PHP 在 SQL 语句中转换日期时间

PHP & MySQL 查询问题

php - 未知的 mysql 语法错误代码在工作台中运行良好,但在 php mysqli 中抛出错误

php - 当我打印多维数组时,数组堆叠起来

php - 将图像上传到数据库不起作用

php - Magento - 初学者概念 - 主题结构

php - mysql_connect ..没有连接也没有错误

php - 以编程方式同步记录的想法

MySQL 全文搜索 AND 运算符

php - 如何使用js在网络浏览器中 trim 图像并将其保存在服务器上?