Problema al crear una tabla con dbDelta

2

Estoy trabajando en un complemento que estaba creando una tabla correctamente.

Sin embargo, decidí probarlo en una instalación nueva de Wordpress (en mi servidor local) y ahora la tabla no se está creando en mi código de activación. En su lugar, aparece el mensaje de error:

  

El complemento generó 149 caracteres de salida inesperada durante   activación. Si observa mensajes de "encabezados ya enviados", problemas   con feeds de sindicación u otros problemas, intente desactivar o eliminar   este plugin.

Aquí está mi código:

function nc_create_location_table() {
    // makes the location table
    global $wpdb;
    global $simple_location_version;

    $table_name = $wpdb->prefix . "nc_location";

    $installed_ver = get_option( "simple_location_version" );

    if( $installed_ver != $simple_location_version ) {
        $sql = "CREATE TABLE " . $table_name . " (
                location_id MEDIUMINT(9) NOT NULL AUTO_INCREMENT,
                PRIMARY KEY  (location_id),
                    name VARCHAR (100),
                    street_no VARCHAR (5),
                    street_name VARCHAR (75),
                    city VARCHAR (75),
                    province_state VARCHAR (75),
                    postal_code VARCHAR(10),
                    country VARCHAR (75)
            );";

        require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
        dbDelta($sql);

        update_option("simple_location_version", $simple_location_version);

    }

    $tmp = get_option('nc_location_options');

    if(($tmp['chkbox_reset']=='on')||(!is_array($tmp))) {
    echo 'setting defaults';
        $arr = array(
            "nc_location_zoom"=>10, 
            "nc_location_width" => "200", 
            "nc_location_height" => "200", 
            "nc_location_drop_down_maptype" => "road",
        );
        update_option('nc_location_options', $arr);
    }
}

register_activation_hook(__FILE__,'nc_create_location_table');

Cuando reviso mis tablas, veo que mi tabla no se ha creado y también recibo un mensaje de error.

Si alguien puede iluminar por qué el código que estaba funcionando ahora no funciona (y también, es posible ver dónde el resultado inesperado es ... ya que no hay ninguna indicación de cuál es el error más que este mensaje)?

    
pregunta redconservatory 21.08.2011 - 16:55

3 respuestas

4
if( $installed_ver != $simple_location_version ) {

en la primera ejecución, $installed_ver es una cadena vacía y $simple_location_version es NULL, por lo que esta prueba de desigualdad fallará y su SQL nunca se ejecutará.

si compruebas la desigualdad estricta, funcionará:

if( $installed_ver !== $simple_location_version ) {
    
respondido por el Milo 21.08.2011 - 17:36
2

Para responder a la

  

El complemento generó 149 caracteres de salida inesperada durante la activación. Si observa mensajes de "encabezados ya enviados", problemas con las fuentes de sindicación u otros problemas, intente desactivar o eliminar este complemento.

Cada declaración echo lo mostrará. Normalmente es solo la cantidad de caracteres que echo -ed.

Aquí es un enlace a mi clase de desinstalación / activación / desactivación (normal / vainilla) para complementos. Puede echar un vistazo a cómo imprimo errores en admin_notices para inspeccionar el comportamiento. Puede intentarlo con $this->error( "DB-Error: {$wpdb->last_error}", true ); (o echar un vistazo al archivo del núcleo wpdb, podría estar equivocado con el objeto var) para ver qué sucede después de la llamada dbDelta. De todos modos: no haga eco y no recibirá el aviso / error / carácter inesperado & encabezado enviado mensaje.

    
respondido por el kaiser 21.08.2011 - 21:33
1

Otra forma burda de investigar el error de "salida inesperada" es ejecutar exit() en la línea 1569 de wp-admin / includes / upgrade.php. Se llama al final de la función dbDelta, que le permitirá ver el resultado generado y solucionar el problema rápidamente, asumiendo que el problema es con dbDelta. He tenido dificultades similares a las suyas cuando algo iba mal con el SQL para la función dbDelta y esta estrategia ayudó a depurarlo. No es la mejor solución, pero puede ayudar en algunas situaciones.

    
respondido por el tollmanz 22.08.2011 - 06:20

Lea otras preguntas en las etiquetas