$ wpdb-> insert создает «Дублирующую запись« 0-0 »для ключа« 1 »» - PullRequest
0 голосов
/ 24 февраля 2012

Я пишу плагин и пытаюсь вставить новую строку в таблицу wp_term_relationships внутри цикла foreach.Я знаю, что переменные имеют значения из-за var_dump, но по какой-то причине я получаю ошибку постоянно.Это примерно 600 раз отображается в функции show_errors ():

Ошибка базы данных WordPress: [Дублирующая запись '0-0' для ключа 1] INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order) ЗНАЧЕНИЯ ('', '', '')

Мой код:

foreach ($cb_t2c_cat_check as $values) {
        global $wpdb;
        $prefix = $wpdb->prefix;

        $table = $prefix . 'term_relationships';
        $object_id = $values->object_id;
        $taxo_id = $values->term_taxonomy_id;
        $num_object_id = (int)$object_id;
        $num_taxo_id = (int)$taxo_id;

        //var_dump($num_object_id); //This produces values, so why are they not getting inserted into the table?
        //var_dump($num_taxo_id); //This produces values, so why are they not getting inserted into the table?

        $wpdb->insert( 
            $table, 
            array( 
                'object_id' => $num_object_id, 
                'term_taxonomy_id' => $num_taxo_id,
                'term_order' => 0
                ), '' 
            ); 

        //$wpdb->show_errors();
        //$wpdb->print_error();
        }

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Что касается того, почему это не работает: не устанавливайте третий параметр $wpdb->insert в пустую строку.Он форматирует каждое поле соответственно ..

То, что он делает сейчас, эквивалентно:

$wpdb->insert($table, array(
            'object_id' => sprintf('', $num_object_id), 
            'term_taxonomy_id' => sprintf('', $num_taxo_id),
            'term_order' => sprintf('', 0)
));

Если вы действительно хотите установить третий параметр, вы должны сделать:

$wpdb->insert($table, array(
            'object_id' => $num_object_id, 
            'term_taxonomy_id' => $num_taxo_id,
            'term_order' => 0
), array('%d', '%d', '%d'));

Что касается ошибки: таблица wp_term_relationships имеет уникальный первичный ключ (object_id, term_taxonomy_id).Это означает, что в этой таблице не может быть двух строк, имеющих одинаковые object_id и term_taxonomy_id.

Хотя это произошло потому, что, устанавливая третий параметр вставки в пустую строку, вы пытаетесь вставить строки с object_id = 0и term_taxonomy_id = 0 снова и снова.

0 голосов
/ 27 февраля 2012

Ответ выше был верным в том смысле, что в базе данных должны быть уникальные ключи, и она не может вставить строку, где пара ключ-значение уже существует, и необходимо задать формат каждого нового значения.Кроме того, что касается Wordpress, была проблема, которую я не решал, в частности, касался таблицы term_taxonomy и обновления счетчика.

Во-первых, важно отметить, что плагин был разработан для обновления определенных категорий сообщений.в таблице term_relationships.На самом деле это было достигнуто с помощью метода $ wpdb-> insert.Тем не менее, мой тест для определения, действительно ли плагин вставлял новые строки в таблицу term_relationships, заключался не в том, чтобы смотреть на таблицу напрямую, а на то, чтобы перейти на панель управления Wordpress, выбрать категории и посмотреть, было ли количество постов с этой категорией большедо.Это не сработало, потому что плагин никогда не обновлял счетчик в таблице term_taxonomy.Я обнаружил это, только щелкнув «просмотреть» рядом с категорией на панели инструментов Wordpress и увидев, что в этой категории было несколько постов, хотя в официальном «подсчете» Wordpress говорилось, что их нет.

Я подтвердил, чтоТаблицу term_taxonomy, столбец count, также необходимо обновить, перейдя прямо в базу данных и поместив WHERE = 'term_taxonomy_id' в оператор.Конечно, было более 1700 результатов, хотя Wordpress считал, что их не было.

Урок: Убедитесь, что метод $ wpdb-> insert работает с использованием PHPMyAdmin, не обязательно полагаясь на панель управления Wordpress.

С несколькими модификациями код теперь отлично работает.Вот пример:

foreach ($cb_t2c_objects as $values) {
        global $wpdb;
        $prefix = $wpdb->prefix;

        $table = $prefix . 'term_relationships';
        $object_id = $values->object_id;
        $taxo_id = $values->cat_taxo;
        $num_object_id = (int)$object_id;
        $num_taxo_id = (int)$taxo_id;

        //Need to check to see if row exists for each, if not, then insert.
        $cb_t2c_get_row = $wpdb->get_row("
            SELECT * 
            FROM ".$prefix."term_relationships
            WHERE object_id = ".$num_object_id." AND term_taxonomy_id = ".$num_taxo_id."
            GROUP BY object_id, term_taxonomy_id
        ", OBJECT);

        //var_dump($cb_t2c_get_row);

        if ( is_null($cb_t2c_get_row) ) {
            //Insert the new values.
            $wpdb->insert( 
            $table, 
            array( 
                'object_id' => $num_object_id, 
                'term_taxonomy_id' => $num_taxo_id,
                'term_order' => 0
                ), 
            array(
                '%d', 
                '%d', 
                '%d'
                ) 
            );
        }

        //Set the variables for the count update.
        $cb_t2c_term_taxonomy_table = $prefix . 'term_taxonomy';
        $cb_t2c_update_data = $wpdb->get_var("
            SELECT count(term_taxonomy_id) as 'new_count'
            FROM ".$prefix."term_relationships
            WHERE term_taxonomy_id = ".$num_taxo_id."
        ",0,0); //returning NULL

        //var_dump($cb_t2c_update_data);

        //Update the count in the term_taxonomy table.
        $wpdb->query("
            UPDATE ".$prefix."term_taxonomy
            SET count = ".$cb_t2c_update_data."
            WHERE term_taxonomy_id = ".$num_taxo_id."
        ");
...