PHP函数中的字符串偏移量非法

时间:2021-07-01 作者:Mathieu Préaud

我正在创建一个元盒来上载PDF文件。

对于这一行代码,我有以下警告通知:$this_file = $filearray[\'url\'];

警告:中的字符串偏移量“url”非法

完整的功能代码:

function wp_custom_attachment() {
    wp_nonce_field( plugin_basename(__FILE__), \'wp_custom_attachment_nonce\' );
    $html = \'<p class="description">Upload your PDF here.</p>\';
    $html .= \'<input id="wp_custom_attachment" name="wp_custom_attachment" size="25" type="file" value="" />\';

    $filearray = get_post_meta( get_the_ID(), \'wp_custom_attachment\', true );
    $this_file = $filearray[\'url\'];
    
    if ( $this_file != \'\' ) { 
         $html .= \'<div><p>Current file: \' . $this_file . \'</p></div>\'; 
    }
    echo $html; 
}
提前感谢您的帮助。

编辑

function add_custom_meta_boxes() {
    add_meta_box( 
        \'wp_custom_attachment\',
        \'PDF File\',
        \'wp_custom_attachment\',
        \'workshop\',
        \'normal\'
    ) ;
}
add_action( \'add_meta_boxes\', \'add_custom_meta_boxes\' );

function wp_custom_attachment() {
    wp_nonce_field( plugin_basename(__FILE__), \'wp_custom_attachment_nonce\' );
    $html = \'<p class="description">Upload your PDF here.</p>\';
    $html .= \'<input id="wp_custom_attachment" name="wp_custom_attachment" size="25" type="file" value="" />\';

    $filearray = get_post_meta( get_the_ID(), \'wp_custom_attachment\', true );
    $this_file = $filearray[\'url\'];
    
    if ( $this_file != \'\' ) { 
         $html .= \'<div><p>Current file: \' . $this_file . \'</p></div>\'; 
    }
    echo $html; 
}

function save_custom_meta_data( $id ) {
    if ( ! empty( $_FILES[\'wp_custom_attachment\'][\'name\'] ) ) {
        $supported_types = array( \'application/pdf\' );
        $arr_file_type = wp_check_filetype( basename( $_FILES[\'wp_custom_attachment\'][\'name\'] ) );
        $uploaded_type = $arr_file_type[\'type\'];

        if ( in_array( $uploaded_type, $supported_types ) ) {
            $upload = wp_upload_bits($_FILES[\'wp_custom_attachment\'][\'name\'], null, file_get_contents($_FILES[\'wp_custom_attachment\'][\'tmp_name\']));
            if ( isset( $upload[\'error\'] ) && $upload[\'error\'] != 0 ) {
                wp_die( \'There was an error uploading your file. The error is: \' . $upload[\'error\'] );
            } else {
                add_post_meta( $id, \'wp_custom_attachment\', $upload );
                update_post_meta( $id, \'wp_custom_attachment\', $upload );
            }
        }
        else {
            wp_die( "The file type that you\'ve uploaded is not a PDF." );
        }
    }
}
add_action( \'save_post\', \'save_custom_meta_data\' );

function update_edit_form() {
    echo \' enctype="multipart/form-data"\';
}
add_action( \'post_edit_form_tag\', \'update_edit_form\' );

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

您需要验证关于$filearray 在你使用它之前。

评论中有一些很好的建议,我认为有几个强有力的例子也可以为您提供帮助:

使用empty()

function wp_custom_attachment() {
    wp_nonce_field( plugin_basename(__FILE__), \'wp_custom_attachment_nonce\' );
    $html = \'<p class="description">Upload your PDF here.</p>\';
    $html .= \'<input id="wp_custom_attachment" name="wp_custom_attachment" size="25" type="file" value="" />\';

    $filearray = get_post_meta( get_the_ID(), \'wp_custom_attachment\', true );
    
    if ( ! empty( $filearray[\'url\'] ) ) { 
         $html .= \'<div><p>Current file: \' . $filearray[\'url\'] . \'</p></div>\'; 
    }
    echo $html; 
}
empty() 很好,因为它隐式地工作如下isset, 如果没有设置该值,它只会返回false. 的另一个好处empty 您可以测试数组键之类的结构,而不用担心对象是否是数组:

php > var_dump( empty( $a[\'foo\'] ) ); // $a is undefined
php shell code:1:
bool(true)
php > var_dump( empty( $a[\'foo\'][\'bar\'][32] ) ); // $a is undefined
php shell code:1:
bool(true)
php > var_dump( empty( $o->foo ) ); // $o is undefined
php shell code:1:
bool(true)
上面,您可以看到PHP并没有抱怨缺少$a$o 由于没有定义,它只是告诉我们;是的,那是空的;然后继续。

使用isset和is\\U数组

function wp_custom_attachment() {
    wp_nonce_field( plugin_basename(__FILE__), \'wp_custom_attachment_nonce\' );
    $html = \'<p class="description">Upload your PDF here.</p>\';
    $html .= \'<input id="wp_custom_attachment" name="wp_custom_attachment" size="25" type="file" value="" />\';

    $filearray = get_post_meta( get_the_ID(), \'wp_custom_attachment\', true );

    if ( is_array( $filearray) && isset( $filearray[\'url\'] ) ) { 
         $html .= \'<div><p>Current file: \' . $filearray[\'url\'] . \'</p></div>\'; 
    }
    echo $html; 
}
这种方法进行两部分验证——首先,我们确保$filearray 确实是一个数组,然后我们验证url 密钥存在。这比empty, 并具有类型检查的附加好处。应该注意的是empty( $filearray[\'url\'] ) 只有在以下情况下才能工作$filearray 是一个数组,因为语法规定了它,但是,此检查不是显式的。

关于三元和零聚结的一个注释

一些人建议使用三元:

$this_file = ! empty( $filearray[\'url\'] ) ? $filearray[\'url\'] : \'\';
这很好,虽然一开始有点难摸索。如果PHP版本支持空合并,也可以使用空合并:

$this_file = $filearray[\'url\'] ?? \'\';
虽然这些都很好,但我还是会避免使用它们,直到你对PHP更熟悉为止。几个月后再回到旧代码中,试着记住你在代码看起来像什么的时候做了什么,这很糟糕

$foo = $bar ? ( $baz ?? false ) : ( $done ?: \'Waiting\' );