含双/单引号的HTML代码转SQL插入字符串的PHP解决方案
解决方案
优先用预处理语句(安全又省心)
直接拼接SQL不仅容易触发引号语法错误,还会带来SQL注入风险,用预处理语句能一次性解决这两个问题,这是行业标准的安全做法。
PDO写法
// 假设你已经有PDO连接实例$pdo $sql = "UPDATE $table SET value = :data WHERE sectionId = :id"; $stmt = $pdo->prepare($sql); // 绑定参数,PDO自动处理引号和特殊字符 $stmt->bindParam(':data', $data, PDO::PARAM_STR); $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute();
$data直接赋值你那段包含单双引号的HTML代码即可,不需要做任何手动转义,预处理机制会自动搞定所有引号兼容问题。
MySQLi写法
// 假设已有mysqli连接实例$conn $sql = "UPDATE $table SET value = ? WHERE sectionId = ?"; $stmt = $conn->prepare($sql); // 第一个参数"si"表示:第一个变量是字符串(s),第二个是整数(i) $stmt->bind_param("si", $data, $id); $stmt->execute();
同样,$data直接放入目标HTML代码即可,无需手动处理引号。
非要用字符串拼接的话(不推荐,风险高)
如果因特殊情况必须保留原有拼接方式,需要对$data中的单引号做转义处理:
用MySQLi自带的转义函数
// 先将目标HTML代码赋值给$data $data = '<div class="card custom-card mt-3"> <div class="card-body" id="default"> <div class="row"> <div class="col-lg-8"> <input type=\'text\' name="project_code" placeholder="Dear Client," class="form-control" onkeyup="setvalue(this)" id="text" /> </div> </div> </div> </div> <script> var counterSection = 0; function init() { dragula([document.getElementById(\'default\')]).on(\'drag\', function (el) { el.className = el.className.replace(\'draggable\', \'\'); }).on(\'drop\', function (el) { el.className += \' draggable\'; }); </script>'; // 基于当前数据库连接转义特殊字符 $escaped_data = mysqli_real_escape_string($conn, $data); // 拼接时必须用单引号包裹转义后的字符串 $sql = 'update '.$table.' set value = \''.$escaped_data.'\' where sectionId = '.$id; // 执行SQL语句 $conn->query($sql);
注意:必须基于当前数据库连接进行转义,否则转义规则可能不匹配;另外这种方式依然存在SQL注入风险,能不用就不用。
手动替换单引号(仅应急场景)
如果无法获取数据库连接,可临时手动将$data中的单引号替换为两个单引号(SQL标准转义规则):
$escaped_data = str_replace("'", "''", $data); $sql = 'update '.$table.' set value = \''.$escaped_data.'\' where sectionId = '.$id;
这种方法仅能处理单引号,无法兼容其他特殊字符(如反斜杠、换行符),风险较高,不推荐常规使用。
内容的提问来源于stack exchange,提问作者consolenine
相关产品推荐
相关产品推荐

