如何正确编写PHP的INSERT INTO语句?引号格式是否正确?
你的PHP INSERT语句问题分析
现有写法的问题
引号格式的潜在问题
- 你给
date、start、end字段的值加了单引号,如果这些字段是字符串/日期类型,语法上拼接后的引号是正确的;但classroom、type、name对应的字段值没加单引号,如果这些字段是字符串类型,会直接导致SQL语法错误。 - 但不管字段类型是什么,这种直接拼接用户输入的写法都存在致命问题。
- 你给
严重的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
相关产品推荐
相关产品推荐

