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

如何正确编写PHP的INSERT INTO语句?引号格式是否正确?

你的PHP INSERT语句问题分析

现有写法的问题

  1. 引号格式的潜在问题

    • 你给date、start、end字段的值加了单引号,如果这些字段是字符串/日期类型,语法上拼接后的引号是正确的;但classroom、type、name对应的字段值没加单引号,如果这些字段是字符串类型,会直接导致SQL语法错误。
    • 但不管字段类型是什么,这种直接拼接用户输入的写法都存在致命问题。
  2. 严重的SQL注入风险
    直接把$_REQUEST里的用户输入拼接到SQL语句中,恶意用户可以构造特殊输入篡改SQL逻辑,比如删除表、获取敏感数据,这是PHP数据库操作的大忌。

正确的写法:使用预处理语句

示例1:PDO方式(推荐)

// 假设已经建立了PDO连接
$pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', 'username', 'password');

$sql = "INSERT INTO class_schedule (date, start_id, end_id, classroom_id, type_id, name_id)
        VALUES (:date, :start, :end, :classroom, :type, :name)";

$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':date' => $_REQUEST['date'],
    ':start' => $_REQUEST['start'],
    ':end' => $_REQUEST['end'],
    ':classroom' => $_REQUEST['classroom'],
    ':type' => $_REQUEST['type'],
    ':name' => $_REQUEST['name']
]);

示例2:mysqli方式

// 假设已经建立了mysqli连接
$mysqli = new mysqli('localhost', 'username', 'password', 'your_db');

$sql = "INSERT INTO class_schedule (date, start_id, end_id, classroom_id, type_id, name_id)
        VALUES (?, ?, ?, ?, ?, ?)";

$stmt = $mysqli->prepare($sql);
$stmt->bind_param('sssiii', $_REQUEST['date'], $_REQUEST['start'], $_REQUEST['end'], $_REQUEST['classroom'], $_REQUEST['type'], $_REQUEST['name']);
// 注意:bind_param的第一个参数是类型标识,sssiii表示前三个是字符串,后三个是整数,需根据实际字段类型调整
$stmt->execute();

预处理语句会自动处理字段值的引号和转义问题,彻底避免SQL注入,同时不用再纠结引号拼接的格式问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:35:46