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]))."
".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`) |
А это зачем?

Спустя 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 их удаляет:
Ну или уж чтобы точно на 100% соответствовало, то через цикл на PHP:
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`'); |
Спасибо. Можно вопрос: А что соответствовало?
Спустя 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) как убрать строки, которые в базе кракозаблами (раньше их не видел, сейчас нашел)?
Теперь возник вопрос.... и даже не один
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 и останется в базе.