警告:主题选项页面上的字符串偏移量非法

时间:2014-02-25 作者:Richard Mišenčík

我正在创建自定义主题选项,我收到了这个PHP错误:警告:字符串偏移量非法。。。在线75

// adding the page to menu
add_menu_page(\'Theme Options\', \'Theme Options\', \'manage_options\', \'rm-options\', \'rm_display_options_page\');

// form to display options
<form method="post" action="options.php">
            <?php
                settings_fields(\'rm_theme_options\'); // options name
                do_settings_sections(\'rm-options\'); // page
                submit_button();
            ?>
</form>

// adding a section
add_settings_section(\'rm_general_section\', \'General options\', \'rm_general_section_callback\', \'rm-options\');

// register the options
register_setting( \'rm_theme_options\', \'rm_theme_options\', \'esc_attr\' );

// register a field
$some_option_args = array(\'type\' => \'text\', \'id\' => \'some_option_name\', \'name\' => \'some_option_name\', \'desc\' => \'Description\');
add_settings_field(\'some_option_name\', \'Some Option\', \'pu_display_setting\', \'rm-options\', \'rm_general_section\', $some_option_args);

// finally a function to display the fields
function pu_display_setting($args){
    extract( $args );
    $options = get_option( \'rm_theme_options\' );

    switch ( $type ) {  
          case \'text\':
              //$options[$id] = stripslashes($options[$id]);  
              //$options[$id] = esc_attr( $options[$id]);
              // this is line 75 where im getting the warning
              echo "<input type=\'text\' id=\'$id\' name=\'" . \'rm_theme_options\' . "[$id]\' value=\'$options[$id]\'>";
              echo ($desc != \'\') ? "<br /><span class=\'description\'>$desc</span>" : "";  
          break;  
    }
}
现在,当我试图保存选项时,错误仍然存在,输入的值是“A”,当我检查数据库时,实际值只是“Array”。75号线怎么了?在我获得显示设置功能的教程中,还有另外两行正在剥离slahes和esc\\u attr。

编辑:

现在我的代码就是这样的,我用这个函数来显示页面,但我不想把每一段代码都放在这里,这样就不会太乱了。这就是它的完整性:

function rm_display_options_page() { ?>
    <div class="wrap">
        <h2><?php echo \'Theme options: \' . wp_get_theme(); ?></h2>
        <div class="description">Theme options description</div>

        <?php settings_errors(); ?>

        <form method="post" action="options.php">
            <?php
                settings_fields(\'rm_theme_options\'); // options name
                do_settings_sections(\'rm-options\'); // page
                submit_button();
            ?>
        </form>
    </div>
<?php
}
第75行是:

echo "<input type=\'text\' id=\'$id\' name=\'" . \'rm_theme_options\' . "[$id]\' value=\'$options[$id]\'>";

2 个回复
SO网友:Morgan Estes

您发布的代码具有major flaw*: 它混合了HTML和PHP,但没有将它们正确地分开。这个代码块有一个PHP函数调用,后跟一个HTML字符串,但由于没有任何信息告诉文件应该将其视为HTML,解析器会说“嘿,<form 我什么都认不出来。我要离开这里!“”

*几乎每个人在使用PHP和HTML时都会遇到这种情况

这里的违规代码是

// adding the page to menu
add_menu_page(\'Theme Options\', \'Theme Options\', \'manage_options\', \'rm-options\', \'rm_display_options_page\');

// form to display options
<form method="post" action="options.php">
        <?php
            settings_fields(\'rm_theme_options\'); // options name
            do_settings_sections(\'rm-options\'); // page
            submit_button();
        ?>
</form>
这里有几个选项,一个是告诉PHPecho HTML如下所示:

// adding the page to menu
add_menu_page(\'Theme Options\', \'Theme Options\', \'manage_options\', \'rm-options\', \'rm_display_options_page\');

// form to display options
echo \'<form method="post" action="options.php">\';
            settings_fields(\'rm_theme_options\'); // options name
            do_settings_sections(\'rm-options\'); // page
            submit_button();
echo \'</form>\';
另一种方法是将PHP部分括起来,以便PHP不会解析HTML:

// adding the page to menu
add_menu_page(\'Theme Options\', \'Theme Options\', \'manage_options\', \'rm-options\', \'rm_display_options_page\');

// form to display options
?>
<form method="post" action="options.php">
        <?php
            settings_fields(\'rm_theme_options\'); // options name
            do_settings_sections(\'rm-options\'); // page
            submit_button();
        ?>
</form>
<?php
 ...

* Update *

这里有一点字符串串联,我无法完全理解,所以我在这里对其进行了更改,以便于我理解。它还可以帮助修复任何错误。在HTML中转义属性也是最佳做法,因此我更新了这一行以包含这些函数。

echo "<input type=\'text\' id=\'$id\' name=\'rm_theme_options[$id]\' value=\'" . esc_attr( $options[$id] ) . "\' />\';

SO网友:Chip Bennett

这似乎只是PHP语法问题:

echo "<input type=\'text\' id=\'$id\' name=\'" . \'rm_theme_options\' . "[$id]\' value=\'$options[$id]\'>";
第一个问题是混合PHP变量和字符串串联。我想你需要绳子\'rm_theme_options[$id]\', 哪里$id 是否替换为其值?如果是这样,字符串串联应该反映:

echo "<input type=\'text\' id=\'" . $id . "\' name=\'rm_theme_options[" . $id . "]\' value=\'" . $options[$id] . "\'>";
这是主观的,但我建议对HTML使用双引号,对PHP字符串使用单引号。只是更容易理解:

echo \'<input type="text" id="\' . $id . \'" name="rm_theme_options[\' . $id . \']" value="\' . $options[$id] . \'">\';
将PHP字符串括在双引号中的主要优点是可以将变量直接传递到字符串中;但在混合双引号和单引号的复杂字符串中,这(正如您所发现的)可能会变得非常复杂。

结束

相关推荐

为什么如此频繁地调用xmlrpc.php和wp-cron.php?

我正在运行Wordpress网站,从服务器日志中发现xmlrpc。php和wp cron。php的请求(当然是POST请求)非常频繁,包括一些散发恶意活动或尝试气味的可疑IP。我的理解是xmlrpc。php提供了一个“API”,供其他人与站点交互。wp cron。php用于定期任务。那么,为什么我看到这么多的请求,而这些页面?黑客是否在寻找某种后门或安全漏洞?