You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL插入时qty字段无法写入INT列问题排查求助

问题根源分析

你的代码核心错误是搞混了PHP和JavaScript的执行顺序,以及错误获取用户输入的qty值:

  1. PHP是服务器端代码,会先于客户端的JavaScript执行完成。你试图用$qty = "<script>document.writeln(qty);</script>";把JS代码赋值给PHP变量,这根本拿不到用户在浏览器里输入的数字,反而把一段JS字符串当成了qty的值。
  2. 数据库的INT列会自动将非数字内容转换为0,所以插入后qty始终显示0。
解决方案

下面提供两种可行的修复方式,同时解决SQL注入风险:

方式一:用表单提交(简单直接)

通过表单收集用户输入的qty,提交到PHP处理插入:

<?php
$it_code = $_POST['id'];
$user_id = $_SESSION['user_id'];

// 处理表单提交的请求
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['qty'])) {
    // 将qty转为整数,确保符合INT列类型
    $qty = (int)$_POST['qty'];
    
    // 验证qty有效性
    if ($qty <= 0) {
        echo "请输入有效的数量";
        exit;
    }

    // 使用参数化查询防止SQL注入(必须改,原代码有严重安全风险)
    $sqlStringInsert = "INSERT INTO orders(user_id,it_code,qty,status,tr_timestamp) VALUES (?,?,?,'PENDING',CURRENT_TIMESTAMP())";
    // 假设你的addToTable方法支持参数绑定,或者改用PDO/MySQLi的预处理逻辑
    $objItem->addToTable($sqlStringInsert, 'Successfully added.', 'Error adding', [$user_id, $it_code, $qty]);

    // 重定向防止重复提交
    header("Location: " . $_SERVER['HTTP_REFERER']);
    exit;
}
?>

<form method="post">
    <!-- 传递商品ID -->
    <input type="hidden" name="id" value="<?php echo htmlspecialchars($it_code); ?>">
    <!-- 隐藏输入框存qty -->
    <input type="hidden" name="qty">

    <script>
        var qty = prompt("Enter Qty", "");
        if (qty !== null && !isNaN(qty) && qty > 0) {
            document.querySelector('input[name="qty"]').value = qty;
            document.querySelector('form').submit();
        } else {
            // 用户取消或输入无效,返回上一页
            window.history.back();
        }
    </script>
</form>

方式二:用AJAX无刷新提交

适合需要页面不跳转的场景:

<!-- submit_order.php(单独的处理脚本) -->
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['id'], $_POST['qty'], $_SESSION['user_id'])) {
    $it_code = $_POST['id'];
    $qty = (int)$_POST['qty'];
    $user_id = $_SESSION['user_id'];

    if ($qty <= 0) {
        echo json_encode(['status' => 'error', 'msg' => '无效的数量']);
        exit;
    }

    $sqlStringInsert = "INSERT INTO orders(user_id,it_code,qty,status,tr_timestamp) VALUES (?,?,?,'PENDING',CURRENT_TIMESTAMP())";
    $objItem->addToTable($sqlStringInsert, '', '', [$user_id, $it_code, $qty]);

    echo json_encode(['status' => 'success', 'msg' => '添加成功']);
    exit;
}
?>

<!-- 原页面的代码 -->
<?php $it_code = $_POST['id']; ?>
<script>
var qty = prompt("Enter Qty", "");
if (qty !== null && !isNaN(qty) && qty > 0) {
    fetch('submit_order.php', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        body: `id=<?php echo htmlspecialchars($it_code); ?>&qty=${qty}`
    })
    .then(res => res.json())
    .then(data => {
        alert(data.msg);
        window.history.back();
    })
    .catch(err => {
        alert('提交失败');
    });
} else {
    window.history.back();
}
</script>
关键注意事项
  • 必须修复SQL注入:原代码直接拼接变量到SQL语句中,属于高危漏洞,所有数据库操作都要使用参数化查询。
  • 数据验证:要检查用户输入的qty是否为正整数,避免插入无效数据。
  • XSS防护:输出到HTML的变量要使用htmlspecialchars()转义,防止跨站脚本攻击。

内容的提问来源于stack exchange,提问作者lakshitha dilhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:45:36