Добрый день. Вставляю записи в базу с проверкой, если совпадает ключ со значением у записи с уникальным id, то должно обновить. Однако не пашет. В чем может быть проблема? Код (Text): $wpdb->query("INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES " . implode(',', $VALUES) . " ON DUPLICATE KEY UPDATE meta_value = VALUES(meta_value), meta_key = VALUES(meta_key); ");
SQL запрос пробовал через PHPMyAdmin выполнять? Он может на ошибки указать или сообщить об обновлении записей или пустом результате
@Yankovitz, загляните в описание класса wpdb. Обратите внимание на обработку ошибок ((show/hide/print)_error и last_error)
Понял в чем ошибка. Таблица базы данных выглядит следующим образом: Код (Text): post_id, meta_key, meta_value 1, thumb, 100 1, size, 13 1, weight, 500 Первый индекс не уникальный. Помогите, пожалуйста, составить запрос, чтобы сопоставлял post_id и meta_key. Если эти ключи совпали, и meta_value отличается, то перезаписать, если совпадение отсутствует, то записать новую строку, если ключи и meta_value совпадают, то пропустить. Нашел в сети вот это: https://ru.stackoverflow.com/questi...ющую-запись-с-помощью-on-duplicate-key-update не уверен как прикрутить?
Спасибо, откуда мне взять ALTER TABLE `table_name`? --- Добавлено --- И еще можно ли запросом типа: Код (Text): ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = VALUES(meta_key), VALUES(meta_value) )
Это совсем не то. Тут, при попытке дублирования уникальной записи, будет обновлено старое значение. Чтобы столбец сделать первичным ключом, нужно выполнить запрос, который я дал выше. Что именно брать?. Выполни запрос выше, вместо table_name and columnt_name вставь нужные данные. --- Добавлено --- или же при создании таблицы сразу можно указать: PHP: CREATE TABLE `table_name`( `id` INT PRIMARY KEY AUTO_INCREMENT );
Собственно, мне как раз и нужно просто обновить значение. Либо через условие IF, либо другим путем. Уже весь мозг съел. Прошу помощи. С MySql имею дело крайне редко
PHP: $wpdb->query("INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES " ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' )" ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = VALUES(meta_key), VALUES(meta_value) ); ");
У тебя есть чисто MySQL запрос, без php? Дай больше инфы, какая ошибка вообще? "Не пашет" ни о чем не говорит))
PHP рабочий. Проверял так: Код (Text): $wpdb->query("INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES " ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) "); Вставка строк происходит. Здесь все пучком. Попробовал прямой запрос в phpmyadmin: Код (Text): INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = 2521, VALUES(meta_value), meta_value ) Вставляет новые строки (НО НЕ ОБНОВЛЯЕТ!!!!). Если убрать последний третий параметр в условии IF: meta_value = IF( meta_key = 2521, VALUES(meta_value), "убираю параметр") на сколько мне известно он не обязательный, то происходит ошибка: Код (Text): Статический анализ: Найдено 10 ошибок при анализе. Неизвестное ключевое слово. (near "KEY" at position 199) Неожиданный токен. (near "=" at position 221) Неизвестное ключевое слово. (near "IF" at position 223) Неожиданный токен. (near "(" at position 225) Неожиданный токен. (near "meta_key" at position 227) Неожиданный токен. (near "=" at position 236) Неожиданный токен. (near "2521" at position 238) Неожиданный токен. (near "," at position 242) This type of clause was previously parsed. (near "VALUES" at position 244) Unrecognized statement type. (near "VALUES" at position 244) SQL запрос: INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = 2521, VALUES(meta_value) ) Ответ MySQL: Документация #1064 - У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около ')' на строке 1 --- Добавлено --- Пардон, немного не так: INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', '1567' ),( 2521, 'price', '1049' ),( 2521, '_sku', '35008' ),( 2521, 'country', 'Россия' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = price, VALUES(meta_value), meta_value )
Чистый MySQL: Немного упрощу: Код (Text): INSERT INTO `wp_postmeta`(`post_id`, `meta_key`, `meta_value`) VALUES ( 2521, '_thumbnail_id', 'иии' ),( 2521, 'price', 'иии' ) ON DUPLICATE KEY UPDATE meta_value = IF( meta_key = VALUES(meta_key), VALUES(meta_value), meta_value)
Разницы нету, что предыдущий что этот, я думаю, если все правильно понял, тут IF не нужен, если какой то столбец в базе у тебя уникальный, то если будет попытка дублирования сработает часто ON DUPLICATE KEY тут и обновляй запись, которая требует обновелния. Теперь, надо убедиться, есть ли у тебя в базе уникальные столбцы?
Покажи структуру таблицы, не данные. И там внизу есть пункт "Индексы" его тоже разверни, чтобы можно было глянуть есть ли там индексы
Ладно, я уж тогда попробую заморочиться с meta_id. Просто, я думал, что есть адекватный способ, как по не уникальным post_id и meta_key обновить meta_value. Все равно благодарю за помощь.