[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление конечных и начальных пробелов
vertraut
Подскажите пожалуйста, нужно сделать 2 вещи
1) Удалить конечный и начальный пробел у каждой строки в БД
2) Есть скрипт, в который через форму заносится список строк, которые поочередно потом проверяются на наличие в БД. Как эти строки очистить от пробелов перед проверкой?
Проверка делается так
SELECT name_sound FROM `top1000` WHERE `name_sound` = '".mysql_real_escape_string($array[$i])."'




Спустя 3 минуты, 11 секунд (24.02.2012 - 19:47) Winston написал(а):
trim($var);

Спустя 5 минут, 37 секунд (24.02.2012 - 19:52) vertraut написал(а):
Цитата (Winston @ 24.02.2012 - 16:47)
trim($var);


Спасибо, функция мне известна, а вот как её применить не понятно.

Спустя 14 минут, 44 секунды (24.02.2012 - 20:07) Игорь_Vasinsky написал(а):
при выводе или UPDATE

Спустя 14 минут, 55 секунд (24.02.2012 - 20:22) Rand написал(а):
$array = array_map('trim', $array);
:D

Спустя 13 секунд (24.02.2012 - 20:22) Winston написал(а):
А не проще при вставке записи удалять пробелы?
".mysql_real_escape_string(trim($array[$i]))."

Спустя 20 минут, 4 секунды (24.02.2012 - 20:42) Rand написал(а):
По первому пункту :
Выполнить один раз такой запрос к базе:
UPDATE `top1000` SET `name_sound` = TRIM(`name_sound`)

И в следующий раз при добавлении записи, добавлять уже без пробелов.

Но если есть какие-то специфические особенности и пробелы нужны, то при проверке так:
SELECT name_sound FROM `top1000` WHERE TRIM(`name_sound`) = '".mysql_real_escape_string(trim($array[$i]))."'

Спустя 4 минуты, 14 секунд (24.02.2012 - 20:47) Winston написал(а):
Цитата (Rand @ 24.02.2012 - 19:42)
TRIM(`name_sound`)

А это зачем? huh.gif

Спустя 11 минут, 7 секунд (24.02.2012 - 20:58) Rand написал(а):
Winston, я же написал:
Цитата
если есть какие-то специфические особенности и пробелы нужны

Это с учетом того, что в базе лежат строки с пробелами.

Спустя 19 часов, 26 минут, 41 секунда (25.02.2012 - 16:24) vertraut написал(а):
Цитата (Rand @ 24.02.2012 - 17:42)
По первому пункту :
Выполнить один раз такой запрос к базе:
UPDATE `top1000` SET `name_sound` = TRIM(`name_sound`)


Пишет: Затронуто строк: 0. ( запрос занял 0.0049 сек. )

Спустя 13 минут, 48 секунд (25.02.2012 - 16:38) Rand написал(а):
Ну значит в базе лежат без пробелов уже.

Спустя 7 часов, 7 минут, 49 секунд (25.02.2012 - 23:46) vertraut написал(а):
Цитата (Rand @ 25.02.2012 - 13:38)
Ну значит в базе лежат без пробелов уже.

когда делаю бэкап, то поиском находит 127 строк с пробелом. Ищу так " \r".

Спустя 33 минуты, 31 секунда (26.02.2012 - 00:20) Rand написал(а):
vertraut, по умолчанию trim в mysql только пробелы удаляет. Возврат каретки и другие управляющие символы надо удалять отдельно. http://www.mysql.ru/docs/man/String_functions.html
А вообще не совсем понял, как и чем ты искал. В тексте дамп-файла что-ли? Почему ты решил, что это именно в данных?

Спустя 13 минут, 44 секунды (26.02.2012 - 00:33) ADiel написал(а):
Цитата
Ищу так " \r".

так это перевод каретки. Виндовое \r\n вместо линуксового \n.

Пробел - это \s

Спустя 1 день, 12 часов, 11 минут, 18 секунд (27.02.2012 - 12:45) Guest написал(а):
У меня есть скрипт, который проверяет наличие строки в базе. Эта база периодически пополняется новыми записями (то, чего раньше не было). Проверяю не 1 строку, а массив строк. Вставляю в текстовое поле список, он разбивается на массив. И также добавляю в базу. В базе не должно быть дубликатов. Я в phpmyadmin сделал поле уникальным (кнопочку нажал, не знаю на сколько это правильно). Но в базу все равно попадают дубликаты. Отличаются они пробелом, который стоит перед переводом каретки ( "СтрокаПробел/r" или "Строка/r").
Сейчас скрипт стал страшно глючить, показывает что в базе нет строки (хотя она реально есть). Подумал что надо при проверке обрезать пробелы. И в базе все пробелы убрать.

Спустя 1 минута, 16 секунд (27.02.2012 - 12:46) vertraut написал(а):
Цитата (Guest @ 27.02.2012 - 09:45)
У меня есть скрипт, который проверяет наличие строки в базе. Эта база периодически пополняется новыми записями (то, чего раньше не было). Проверяю не 1 строку, а массив строк. Вставляю в текстовое поле список, он разбивается на массив. И также добавляю в базу. В базе не должно быть дубликатов. Я в phpmyadmin сделал поле уникальным (кнопочку нажал, не знаю на сколько это правильно). Но в базу все равно попадают дубликаты. Отличаются они пробелом, который стоит перед переводом каретки ( "СтрокаПробел/r" или "Строка/r").
Сейчас скрипт стал страшно глючить, показывает что в базе нет строки (хотя она реально есть). Подумал что надо при проверке обрезать пробелы. И в базе все пробелы убрать.

Забыл залогиниться

Спустя 35 минут, 43 секунды (27.02.2012 - 13:22) Rand написал(а):
Возврат каретки тоже удали из строк в базе, т.к. php-ная функция trim их удаляет:
UPDATE `top1000` SET `name_sound` = TRIM(BOTH '\n' FROM `name_sound`);
UPDATE `top1000` SET `name_sound` = TRIM(BOTH '\r' FROM `name_sound`);
UPDATE `top1000` SET `name_sound` = TRIM(BOTH '\t' FROM `name_sound`);
UPDATE `top1000` SET `name_sound` = TRIM(`name_sound`);

Ну или уж чтобы точно на 100% соответствовало, то через цикл на PHP:
$res = mysq_query('SELECT `name_sound` FROM `top1000`');
while($row = mysql_fetch_assoc($res)) {
mysql_query('UPDATE `top1000` SET `name_sound` =' . trim($row['name_sound']));
}

Спустя 3 часа, 5 минут, 14 секунд (27.02.2012 - 16:27) vertraut написал(а):
Цитата (Rand @ 27.02.2012 - 10:22)

Ну или уж чтобы точно на 100% соответствовало, то через цикл на PHP:
$res = mysq_query('SELECT `name_sound` FROM `top1000`');
while($row = mysql_fetch_assoc($res)) {
mysql_query('UPDATE `top1000` SET `name_sound` =' . trim($row['name_sound']));
}

Спасибо. Можно вопрос: А что соответствовало?

Спустя 2 минуты, 52 секунды (27.02.2012 - 16:30) Visman написал(а):
mysql_query('UPDATE `top1000` SET `name_sound` =' . trim($row['name_sound']));

В запросе потеряли условие!

Спустя 32 минуты, 50 секунд (27.02.2012 - 17:02) Rand написал(а):
Цитата (vertraut @ 27.02.2012 - 19:27)
Спасибо. Можно вопрос: А что соответствовало?

Запись в БД со строкой из формы.
Когда идет проверка строк из формы, должна использоваться php функция trim. Это функция удаляет не только пробелы, но и другие управляющие символы, а в MySQL - функция TRIM удаляет только один символ указанный ей как параметр, или пробел по умолчанию. Если в строке будет идти пробел, потом символ табуляции и опять пробел, то MySQL удалит только крайний пробел до табуляции. А PHP удалит все эти символы в каком бы они порядке не шли.

Цитата
В запросе потеряли условие!

Да, спасибо за поправку. Не знаю, какое там имя у первичного ключа, что-то типо того, если первичный ключ на поле id:
$res = mysq_query('SELECT `id`, `name_sound` FROM `top1000`');
while($row = mysql_fetch_assoc($res)) {
mysql_query('UPDATE `top1000` SET `name_sound` =' . trim($row['name_sound']) . 'WHERE `id` = ' . $row['id']);
}

Спустя 35 минут, 21 секунда (27.02.2012 - 17:38) vertraut написал(а):
это жесть, уже не знаю что делать. сделал запрос в базу
UPDATE `top1000` SET `name_sound` = TRIM(BOTH '\n' FROM `name_sound`);
UPDATE `top1000` SET `name_sound` = TRIM(BOTH '\r' FROM `name_sound`);
UPDATE `top1000` SET `name_sound` = TRIM(BOTH '\t' FROM `name_sound`);
UPDATE `top1000` SET `name_sound` = TRIM(`name_sound`);

Убрал все лишнее. При проверке пишет что ничего нет в базе, кроме последней строки.
Если в запрос сделать не так
$query = mysql_query("SELECT name_sound FROM `top1000` WHERE `name_sound` = '".mysql_real_escape_string($array[$i])."'");

а
$query = mysql_query("SELECT name_sound FROM `top1000` WHERE `name_sound` = '".mysql_real_escape_string(trim($array[$i]))."'");
То вроде лучше ищет (по сравнению с базой в которой был перевод каретки). Но все равно какие-то строки не находит, хотя они 10000% в базе есть. Как быть?

Спустя 8 минут, 46 секунд (27.02.2012 - 17:47) Rand написал(а):
$query = mysql_query("SELECT name_sound FROM `top1000` WHERE `name_sound` = '".mysql_real_escape_string(trim($array[$i]))."'");

Только так и надо было использовать. Здесь ты удаляешь пробелы у строки из формы, а в первом случае нет. Если какие-то строки всё такие не совпадают, то сделай через цикл php, как я писал выше и не мучайся.

Спустя 9 минут, 11 секунд (27.02.2012 - 17:56) vertraut написал(а):
Спасибо, я ошибался (поверил жене на слово, что песни в базе есть). Все вроде работает.
Теперь возник вопрос.... и даже не один
1) как удалить образовавшиеся дубликаты в БД (строки отличались пробелом перед переводом каретки, а сейчас нет)
2) как убрать строки, которые в базе кракозаблами (раньше их не видел, сейчас нашел)?

Спустя 26 минут, 59 секунд (27.02.2012 - 18:23) Rand написал(а):
1) Примерно так:
DELETE t1 FROM top1000 t1, top1000 t2 WHERE t1.name_sound = t2.name_sound AND t1.id > t2.id;

Спустя 1 час, 36 минут, 23 секунды (27.02.2012 - 19:59) vertraut написал(а):
Цитата (Rand @ 27.02.2012 - 15:23)
1) Примерно так:
DELETE t1 FROM top1000 t1, top1000 t2 WHERE t1.name_sound = t2.name_sound AND t1.id > t2.id;

Спасибо огромное)) все быстро и без боли) А можно объяснить как это работает? а то я пытался понять.... но не получилось)

Спустя 1 час, 21 минута, 33 секунды (27.02.2012 - 21:21) Rand написал(а):
Присоединяем таблицу саму к себе методом CROSS JOIN. Первое условие - это выбираются только одинаковые записи. Второе условие нужно для того, чтобы запись не соединялась сама с собой. Первая уникальная запись при таком раскладе не выберется в таблицу t1 и останется в базе.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.