WordPress自定义插件更新记录时转义与魔术引号问题求助
解决WordPress插件更新记录时的魔术引号与转义问题
问题核心分析
从你提供的var_dump和SQL错误信息来看,核心问题有两个:
- 提交的每个字段值都被额外包裹了单引号(比如
id是'10'而非10),后续拼接SQL时这些单引号又被转义,变成\'10\'; - 更新语句中错误地试图修改主键
id,导致主键重复错误。
分步解决办法
1. 修复表单提交的数据源问题
你提交的数据里带单引号,大概率是表单输出时的写法错误。比如你可能用了:
<input type="text" name="id" value='<?php echo $episode_id; ?>'>
这种写法会让浏览器把值连同单引号一起提交。正确的做法是用双引号包裹value,并通过WordPress的esc_attr()函数处理值:
<input type="text" name="id" value="<?php echo esc_attr($episode_id); ?>">
这样提交的$_POST['id']就是纯数字10,不会带单引号。
2. 正确清理提交的数据
WordPress已经内置了处理魔术引号的函数wp_unslash(),比stripslashes_deep更适配WordPress环境。如果表单暂时没修复,可以先清理掉值前后的单引号再处理转义:
// 清理POST数据 $clean_post = array(); foreach ($_POST as $key => $val) { // 先去掉前后的单引号,再处理转义 $clean_post[$key] = wp_unslash(trim($val, "'")); } // 处理布尔类型的published字段,转成数据库存储的int类型 $clean_post['published'] = isset($clean_post['published']) ? 1 : 0;
3. 用WordPress官方方法构建SQL语句
绝对不要手动拼接SQL,用$wpdb->update()或$wpdb->prepare()自动处理转义和格式,既安全又能避免转义错误:
global $wpdb; $table = $wpdb->prefix . 'ngof_episodes'; // 执行更新,注意不要包含id字段(主键无需更新) $wpdb->update( $table, // 要更新的字段和值 array( 'number' => $clean_post['number'], 'title' => $clean_post['title'], 'description' => $clean_post['description'], 'type' => $clean_post['type'], 'platform' => $clean_post['platform'], 'airdate' => $clean_post['airdate'], 'duration' => $clean_post['duration'], 'shownotes' => $clean_post['shownotes'], 'authors' => $clean_post['authors'], 'image_small' => $clean_post['image_small'], 'image_big' => $clean_post['image_big'], 'stream_link' => $clean_post['stream_link'], 'published' => $clean_post['published'] ), // WHERE条件 array('id' => $clean_post['id']), // 字段的格式占位符:%s字符串,%d数字,%f浮点数 array( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%d' ), // WHERE条件的格式占位符 array('%d') );
为什么之前的方法没用?
你用array_map('stripslashes_deep', $_POST)只能去掉反斜杠,但无法移除值本身带的单引号。当你把带单引号的值拼进SQL时,WordPress的数据库类会自动转义单引号,就出现了\'10\'这种错误格式。
内容的提问来源于stack exchange,提问作者johnbell
相关产品推荐
相关产品推荐

