Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Замена значений в БД

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
zmeyx
Отправлено: 26 Января, 2015 - 11:59:54
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Друзья помогите плиз решить проблему.
Нужно взять из одной таблицы БД, все значения одного столбца, прогнать их через функцию транслитерации (здесь подсказали такую:
PHP:
скопировать код в буфер обмена
  1.     function russian_transliterate($string)
  2.     {
  3.         $converter = array(
  4.             'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd', 'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i', 'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'ts', 'ч' => 'ch', 'ш' => 'sh', 'щ' => 'sch', 'ь' => '\'', 'ы' => 'y', 'ъ' => '\'', 'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
  5.             'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D', 'Е' => 'E', 'Ё' => 'E', 'Ж' => 'ZH', 'З' => 'Z', 'И' => 'I', 'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N', 'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T', 'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'TS', 'Ч' => 'CH', 'Ш' => 'SH', 'Щ' => 'SCH', 'Ь' => '\'', 'Ы' => 'Y', 'Ъ' => '\'', 'Э' => 'E', 'Ю' => 'YU', 'Я' => 'YA'
  6.         );
  7.         return strtr($string, $converter);
  8.     }

PHP:
скопировать код в буфер обмена
  1.  
  2.     $a = 'Привет';
  3.     echo russian_transliterate($a);
  4.      
  5.     // Privet

и записать транслитерированные значения на место тех, которые сейчас существуют

Помогите плиз со скриптом..
ЗЫ - это нужно сделать один раз, т.е. скрипт одноразовый
ЗЗЫ - просьба объяснить как младенцу
структура таблицы: (скопировано из дампа)
CODE (htmlphp):
скопировать код в буфер обмена
  1. -- Структура таблицы `j25_virtuemart_products_ru_ru`
  2. --
  3.  
  4. CREATE TABLE IF NOT EXISTS `j25_virtuemart_products_ru_ru` (
  5.   `virtuemart_product_id` int(1) unsigned NOT NULL,
  6.   `product_s_desc` varchar(2000) NOT NULL DEFAULT '',
  7.   `product_desc` varchar(18400) NOT NULL DEFAULT '',
  8.   `product_name` char(180) NOT NULL DEFAULT '',
  9.   `metadesc` varchar(400) NOT NULL DEFAULT '',
  10.   `metakey` varchar(400) NOT NULL DEFAULT '',
  11.   `customtitle` char(255) NOT NULL DEFAULT '',
  12.   `slug` char(192) NOT NULL DEFAULT '',
  13.   PRIMARY KEY (`virtuemart_product_id`),
  14.   UNIQUE KEY `slug` (`slug`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  16.  

часть данных
CODE (htmlphp):
скопировать код в буфер обмена
  1. INSERT INTO `j25_virtuemart_products_ru_ru` (`virtuemart_product_id`, `product_s_desc`, `product_desc`, `product_name`, `metadesc`, `metakey`, `customtitle`, `slug`) VALUES
  2. (1, 'бла бла бла.', 'бла бла бла', 'Свечной гель "Красный" 800гр.', '', '', '', 'свечной-гель-красный-800гр'),

обновление нужно сделать в столбце slug

(Отредактировано автором: 26 Января, 2015 - 12:03:22)

 
 Top
GoDr
Отправлено: 26 Января, 2015 - 14:53:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




Так вроде уже всё ответил в прошлый раз или совсем не понятно что и как? Закатив глазки

PHP:
скопировать код в буфер обмена
  1. // Подключаю обёртку MySQLi
  2. $DB = LCore::getDB();
  3.  
  4. // Получаем данные из таблицы
  5. $rows = $DB->select("SELECT `virtuemart_product_id`, `slug` FROM `j25_virtuemart_products_ru_ru`");
  6. /*
  7. Array
  8. (
  9.     [0] => Array
  10.         (
  11.             [virtuemart_product_id] => 1
  12.             [slug] => Стол
  13.         )
  14.  
  15.     [1] => Array
  16.         (
  17.             [virtuemart_product_id] => 2
  18.             [slug] => Стул
  19.         )
  20.  
  21.     [2] => Array
  22.         (
  23.             [virtuemart_product_id] => 3
  24.             [slug] => свечной-гель-красный-800гр
  25.         )
  26.  
  27. )
  28. */
  29.  
  30. // перебираем массив
  31. foreach($rows as $value){
  32.  
  33.         // Делаем транслитерацию
  34.         $slug_new = russian_transliterate($value['slug']);
  35.  
  36.         // Сохраняем данные в базу
  37.         $sql = "UPDATE `j25_virtuemart_products_ru_ru` SET `slug`=? WHERE  `virtuemart_product_id`= ?;";
  38.         $DB->update($sql, $slug_new, $value['virtuemart_product_id']);
  39. }
  40.  
  41. /*
  42. Array
  43. (
  44.     [0] => Array
  45.         (
  46.             [virtuemart_product_id] => 1
  47.             [slug] => Stol
  48.         )
  49.  
  50.     [1] => Array
  51.         (
  52.             [virtuemart_product_id] => 2
  53.             [slug] => Stul
  54.         )
  55.  
  56.     [2] => Array
  57.         (
  58.             [virtuemart_product_id] => 3
  59.             [slug] => svechnoy-gel'-krasnyy-800gr
  60.         )
  61.  
  62. )
  63.  */



PS
использую свою обёртку для работы с БД, но суть понять можно и переделать под себя


-----
Система управления веб-содержимым Lotos CMS
 
 Top
zmeyx
Отправлено: 26 Января, 2015 - 15:06:50
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




Вся проблема в том, что знания в этой области чуть от нуля отличаются, поэтому и прошу, как с младенцем)))
Сорри)))
 
 Top
LIME
Отправлено: 26 Января, 2015 - 15:18:03
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




GoDr дай чтоли нормальный скрипт
без
GoDr пишет:
$DB = LCore::getDB()
 
 Top
skiphog
Отправлено: 26 Января, 2015 - 15:24:07
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


Помог: 11 раз(а)




Можно попробовать выбрать данные, транслетилировать и запулить одним, длинючим запросом.
PHP:
скопировать код в буфер обмена
  1. //подключаемся к БД
  2. $db = new PDO('mysql:host=localhost;dbname=dbname;charset=utf8','user','password');
  3. //делаем запрос на все записи
  4. $stmt = $db->query('select virtuemart_product_id as id,slug from j25_virtuemart_products_ru_ru');
  5. //подготавливаем следующий запрос
  6. $sql = 'insert into j25_virtuemart_products_ru_ru (virtuemart_product_id,slug) values';
  7. // крутим в цикле результат и заполнаям новый запрос
  8. while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  9.   $sql .= ' ('.$row['id'].', '.$db->quote(russian_transliterate($row['slug'])).'),';
  10. }
  11. // удаляем последнюю запятую
  12. $sql = rtrim($sql,',');
  13. // добавляем duplicate key
  14. $sql .= ' ON DUPLICATE KEY UPDATE slug = values(slug)';
  15. //выполняем запрос
  16. $db->query($sql);


В итоге запрос будет один и выглядеть будет так
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO j25_virtuemart_products_ru_ru (virtuemart_product_id,slug) VALUES (1, 'текст'), (2, 'текст'), (3, 'текст') ON DUPLICATE KEY UPDATE slug = VALUES(slug)


Что в итоге лучше отработает, толпа мелких запросов или один большой - фиг знает Улыбка надо проверять Улыбка
--
Единственный момент. Если вы пытаетесь сделать ЧПУ, то ваша функция траслитерации не подходит. Добавьте в нее удаление апострофов и прочих символов, а пробелы замените на тире, при этом удаляйте последнее тире.
 
My status
 Top
LIME
Отправлено: 26 Января, 2015 - 15:28:04
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




skiphog забыл WHERE
он так все потрет нафиг в одно значение
перепиши
и непонятно почему тримишь после цикла
подумай хорошенько
zmeyx не применяй код выше ни в коем случае
пока не применяй)
(Добавление)
skiphog основной императив в кодинге(стремление если угодно)
сделать все проще
прочему избегаешь WHERE id = ?
это проще и правильнее
загоняешься дупликатом

(Отредактировано автором: 26 Января, 2015 - 15:31:52)

 
 Top
skiphog
Отправлено: 26 Января, 2015 - 15:38:46
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


Помог: 11 раз(а)




LIMEСоздал тестовую базу данных на основе zmeyx
Выполнил запрос, все корректно отработало и ничего не затерлось.
--
ps.
rtrim - что бы убрать последнюю запятую в запросе после (....),(.....),(.....), <- вот эту
 
My status
 Top
LIME
Отправлено: 26 Января, 2015 - 15:43:24
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




skiphog да
это я непотрудился прочесть код
страдаю иногда ленью))
хорошее решение но трудно читаемое
потому лучше всеже WHERE
или есть какой-то профит что я не увидел?
(Добавление)
плохое решение всеже
это я к тому что назвал его хорошим
всеже плохое
 
 Top
GoDr
Отправлено: 26 Января, 2015 - 15:44:13
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




Что значит подробно? До какого уровня? Радость С установки локального сервера?

Ладно, попробую подробно.. Давно не использовал чистый функционал, попробую вспомнить... В обще-где-то так.. Вроде работает
PHP:
скопировать код в буфер обмена
  1.  
  2. // Подключаемся к БД
  3. $mysqli = new mysqli("host", "user", "password", "database");
  4.  
  5. $sql = "SELECT `virtuemart_product_id`, `slug` FROM `j25_virtuemart_products_ru_ru`";
  6.  
  7. if ($result = $mysqli->query($sql)) {
  8.  
  9.         // выборка данных и помещение их в массив
  10.         while ($row = $result->fetch_assoc()) {
  11.                 $slug_new = russian_transliterate($row['slug']);
  12.                 $sql = "UPDATE `j25_virtuemart_products_ru_ru` SET `slug`= '" . $slug_new . "' WHERE `virtuemart_product_id`= ".$row['virtuemart_product_id'];
  13.                 $mysqli->query($sql);
  14.         }
  15.  
  16.         // очищаем результирующий набор
  17.         $result->close();
  18. }
  19.  
  20. // закрываем подключение
  21. $mysqli->close();


-----
Система управления веб-содержимым Lotos CMS
 
 Top
LIME
Отправлено: 26 Января, 2015 - 15:45:44
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




GoDr воот
щас аж плюсану))
ну нубы же...надо понимать или идти мимо
 
 Top
skiphog
Отправлено: 26 Января, 2015 - 15:46:46
Post Id



Частый гость


Покинул форум
Сообщений всего: 139
Дата рег-ции: Дек. 2014  
Откуда: Киров, Россия


Помог: 11 раз(а)




LIME ну смотри, если у тебя в таблице 100 записей, то решение GoDr - это сделать 100 маленьких запросов на изменение.

Мое же решение - всего 1 запрос, но длинный, через duplicate key update

--
Т.е. он в цикле выполняет запросы, а я в цикле только составляю его, а только потом выполняю.

(Отредактировано автором: 26 Января, 2015 - 15:48:55)

 
My status
 Top
GoDr
Отправлено: 26 Января, 2015 - 15:48:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




skiphog пишет:
Если вы пытаетесь сделать ЧПУ, то ваша функция траслитерации не подходит.
Конечно не подходит... Там много ещё чего нужно убрать и проверить Язычок Плюс ко всему, такой принцип создания ссылок породит огромное количество дубликатов
(Добавление)
LIME пишет:
ну нубы же...надо понимать или идти мимо
Просто как-то не понятно когда люди делают сайт (сами так говорят). а как применить готовый запрос не знают.. Ну да ладно... Как ты сказал, ленюсь иногда Язычок

Кстати, задача стоит сделать разовую функцию.. так что мне кажется пофиг какой код использовать. Даже можно не заботиться о нагрузке на сервер и время )))


-----
Система управления веб-содержимым Lotos CMS
 
 Top
zmeyx
Отправлено: 26 Января, 2015 - 15:52:02
Post Id


Гость


Покинул форум
Сообщений всего: 64
Дата рег-ции: Дек. 2012  


Помог: 0 раз(а)




GoDr пишет:
// Подключаемся к БД
$mysqli = new mysqli("host", "user", "password", "database");

$sql = "SELECT `virtuemart_product_id`, `slug` FROM `j25_virtuemart_products_ru_ru`";

if ($result = $mysqli->query($sql)) {

// выборка данных и помещение их в массив
while ($row = $result->fetch_assoc()) {
$slug_new = russian_transliterate($row['slug']);
$sql = "UPDATE `j25_virtuemart_products_ru_ru` SET `slug`= '" . $slug_new . "' WHERE `virtuemart_product_id`= ".$row['virtuemart_product_id'];
$mysqli->query($sql);
}

// очищаем результирующий набор
$result->close();
}

// закрываем подключение
$mysqli->close();

такое решение похерило все данные в таблице

ЗЫ.. таблица всстанавливается мгновенно если нужно. Это происходит не на рабочем сайте, а на копии БД
 
 Top
GoDr
Отправлено: 26 Января, 2015 - 15:57:02
Post Id



Посетитель


Покинул форум
Сообщений всего: 446
Дата рег-ции: Янв. 2015  
Откуда: Тамбов


Помог: 17 раз(а)




zmeyx, ещё раз проверил. у меня всё отлично сработало. Надеюсь в
PHP:
скопировать код в буфер обмена
  1. $mysqli = new mysqli("host", "user", "password", "database");
ты подставил свои значение?


-----
Система управления веб-содержимым Lotos CMS
 
 Top
LIME
Отправлено: 26 Января, 2015 - 15:57:47
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




zmeyx пишет:
такое решение похерило все данные в таблице
Ха-ха Ха-ха Ха-ха
ладно
работайте)))
(Добавление)
GoDr ну если похерило то подставил наверное))
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB