为什么我会收到“UNDEFINED_INDEX”错误?

时间:2011-06-23 作者:turbonerd

对,我的头撞到墙上了。我确信这是一件非常简单的事情,但我总是在所有这些变量上出现未定义的索引错误。

function meta_genus_species() {
    global $post;

    if (isset($post)) {
        $custom = get_post_custom($post->ID);
    }

    if (isset($custom)) {
        $genus = $custom["genus"][0];
        $species = $custom["species"][0];
        $etymology = $custom["etymology"][0];
        $family = $custom["family"][0];
        $common_names = $custom["common_names"][0];
    }

    ?>
<label>Genus:</label>
<input name="genus" value="<?php if(isset($genus)) { echo $genus; } ?>" />
<label>Species:</label>
<input name="species" value="<?php if(isset($species)) { echo $species; } ?>" />
<p><label>Etymology:</label><br />
<textarea cols="50" rows="5" name="etymology"><?php if(isset($etymology)) { echo $etymology; } ?></textarea></p>
<label>Family:</label>
<input name="family" value="<?php if(isset($family)) { echo $family; } ?>" />
<label>Common Names:</label>
<input name="common_names" value="<?php if(isset($common_names)) { echo $common_names; } ?>" />
    <?php
}
对于每个变量,我都会得到:

注意:未定义索引:[…]中的属sf物种概况。php在线207

有什么想法吗?

3 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

这是一个常见的PHP错误,通常是当您尝试使用不存在的键访问数组成员时;

$array = array( \'hello\' => \'world\' );
echo $array[\'foobar\']; // undefined index
你应该先用isset( $array[\'foobar\'] );

UPDATE: 在本例中,我将插入一个为您设置变量的循环,在这个过程中检查索引。

foreach ( array( \'genus\', \'species\', \'etymology\', \'family\', \'common_names\' ) as $var )
    $$var = isset( $custom[ $var ][0] ) ? $custom[ $var ][0] : \'\';

echo $genus; // prints value of $custom[\'genus\'][0] if set, otherwise empty

SO网友:mfields

您已经在每次将数据打印到屏幕时调用isset()。

为什么不跳过这一部分:

if (isset($custom)) {
    $genus = $custom["genus"][0];
    $species = $custom["species"][0];
    $etymology = $custom["etymology"][0];
    $family = $custom["family"][0];
    $common_names = $custom["common_names"][0];
}
并在打印输入时执行此操作:

<label>Genus:</label>
<input name="genus" value="<?php if( isset( $custom["genus"][0] ) ) { print $custom["genus"][0]; } ?>" />
不需要额外的变量赋值,因此会在此处生成通知。

顺便提一下

在将输出打印到表单中之前,需要对其进行转义:

<label>Genus:</label>
<input name="genus" value="<?php if(isset($genus)) { echo esc_attr( $genus ); } ?>" />
<label>Species:</label>
<input name="species" value="<?php if(isset($species)) { echo esc_attr( $species ); } ?>" />
<p><label>Etymology:</label><br />
<textarea cols="50" rows="5" name="etymology"><?php if(isset($etymology)) { echo esc_textarea( $etymology ); } ?></textarea></p>
<label>Family:</label>
<input name="family" value="<?php if(isset($family)) { echo esc_attr( $family ); } ?>" />
<label>Common Names:</label>
<input name="common_names" value="<?php if(isset($common_names)) { echo esc_attr( $common_names ); } ?>" />

SO网友:EAMann

另一种选择是,在推特上讨论这篇文章,改变你获取数据的方式。get_post_custom() 返回数组数组,这是导致您头痛的原因。我建议使用get_post_custom_values() 而是:

function meta_genus_species() {
    global $post;

    $genus = get_post_custom_values( \'genus\', $post->ID );
    $species = get_post_custom_values( \'species\', $post->ID );
    $etymology = get_post_custom_values( \'etymology\', $post->ID );
    $family = get_post_custom_values( \'family\', $post->ID );
    $common_names = get_post_custom_values( \'common_names\', $post->ID );

    ?>
<label>Genus:</label>
<input name="genus" value="<?php if(isset($genus[0])) { echo esc_attr( $genus[0] ); } ?>" />
<label>Species:</label>
<input name="species" value="<?php if(isset($species[0])) { echo esc_attr( $species ); } ?>" />
<p><label>Etymology:</label><br />
<textarea cols="50" rows="5" name="etymology"><?php if(isset($etymology[0])) { echo esc_attr( $etymology ); } ?></textarea></p>
<label>Family:</label>
<input name="family" value="<?php if(isset($family[0])) { echo esc_attr( $family ); } ?>" />
<label>Common Names:</label>
<input name="common_names" value="<?php if(isset($common_names[0])) { echo esc_attr( $common_names ); } ?>" />
    <?php
}
自定义值的更好替代方法是使用自定义元。您可以将这些定义为唯一的,然后当您从DB中获取自定义元时,您将拥有一个值,而不是只有一个成员的索引数组。只是需要考虑一下。

结束

相关推荐

Displaying oEmbed errors?

有时,通过oEmbed嵌入项目是不可能的,例如,当YouTube视频已禁用嵌入时。The oEmbed service will return a 401 Unauthorized, 并且不会转换代码。有没有办法通知用户这一点?当前的工作流是非直观的(至少对我来说),我更喜欢在WordPress页面上,或者更好的是,在编辑器中显示一条消息,说明对象无法嵌入。