Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как сравнить строки взятые из mysql и массива $_POST?
 
 автор: sega_z   (03.08.2011 в 13:12)   письмо автору
 
 

Как сравнить строки взятые из mysql и массива $_POST?

Весь смысл в том, чтобы в базу данных не заносили объявления с одинаковым заголовком "zagolovok" и текстом объявления "text_obyavl"


$pochta = $_POST['e_mail'];
$text_ob = trim($_POST['text_obyavl']);
$result555 = mysql_query ("SELECT id,text_obyavl,zagolovok,gorod FROM doska WHERE e_mail='$pochta'",$db);
$myrow555 = mysql_fetch_array ($result555);
$text_dubl = trim($myrow555["text_obyavl"]);
if (($_POST['zagolovok'] == $myrow555["zagolovok"]) and ($text_dubl == $text_ob) and ($_POST['gorod'] == $myrow555["gorod"]))
{
$id_kopii = $myrow555["id"];
echo "<Script Language='JavaScript'>alert('Данное объявление уже существует на сайте! Ссылка на дубликат внизу этой страницы.');</Script>";
}


Данное сравнение говорит о том, что они разные (хотя тексты абсолютно одинаковые). Если текст без переноса строки, то все работает!

Пробовал удалять переносы, но все равно значения переменных $text_dubl и $text_ob чем то отличаются?


$pochta = $_POST['e_mail'];
$text_ob = trim($_POST['text_obyavl']);
$result555 = mysql_query ("SELECT id,text_obyavl,zagolovok,gorod FROM doska WHERE e_mail='$pochta'",$db);
$myrow555 = mysql_fetch_array ($result555);
$text_dubl = trim($myrow555["text_obyavl"]); $text_dubl = str_replace("<br />","","$text_dubl");
if (($_POST['zagolovok'] == $myrow555["zagolovok"]) and ($text_dubl == $text_ob) and ($_POST['gorod'] == $myrow555["gorod"]))
{
$id_kopii = $myrow555["id"];
echo "<Script Language='JavaScript'>alert('Данное объявление уже существует на сайте! Ссылка на дубликат внизу этой страницы.');</Script>";
}

  Ответить  
 
 автор: julpierto   (03.08.2011 в 14:10)   письмо автору
 
   для: sega_z   (03.08.2011 в 13:12)
 

Не уверен, можно ли так сравнивать значения текстовых переменных? Попробуй сделать проверку таким образом:

if(substr_count($_POST['zagolovok'],$myrow555["zagolovok"])>0 and substr_count($text_dub,$text_ob)>0 and substr_count($_POST['gorod'],$myrow555["gorod"])>0) { .... }

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:15)   письмо автору
 
   для: julpierto   (03.08.2011 в 14:10)
 

А выражение "substr_count($_POST['zagolovok'],$myrow555["zagolovok"])>0" учитывает буквы и цифры или оно просто сравнивает по количеству символов?

  Ответить  
 
 автор: julpierto   (03.08.2011 в 14:17)   письмо автору
 
   для: sega_z   (03.08.2011 в 14:15)
 

Справочник функций php вам в помощь:
Функция substr_count — Подсчитывает число вхождений подстроки в строку

Синтаксис
int substr_count (string haystack, string needle)
Функция substr_count() подсчитывает и возвращает число вхождений подстроки needle в строку haystack.

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:22)   письмо автору
 
   для: julpierto   (03.08.2011 в 14:17)
 

Попробовал так, как вы написали - не работает.

А вот так - сработало. Только все ли элементы учитывает данное выражение?

$text_dubl = trim($myrow555["text_obyavl"]); $text_dubl = preg_replace("#([^\w]+)#iu", '', $text_dubl);
$text_ob = trim($_POST['text_obyavl']); $text_ob = preg_replace("#([^\w]+)#iu", '', $text_ob);
if (($_POST['zagolovok'] == $myrow555["zagolovok"]) and ($text_dubl == $text_ob) and ($_POST['gorod'] == $myrow555["gorod"]))

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:28)   письмо автору
 
   для: julpierto   (03.08.2011 в 14:17)
 

Нет данное выражение считает все строки одинаковыми. Как быть?

  Ответить  
 
 автор: julpierto   (03.08.2011 в 14:34)   письмо автору
 
   для: sega_z   (03.08.2011 в 14:28)
 

У php большой "арсенал" функций работы со строками. Попробуй написать проверочный скрипт, например:
<?php
$a 
"Во поле береза стояла";
$b "Во поле кудрявая стояла";
if (
substr_count($a$b)==0) { echo "Строки не идентичны" };  // здесь можно пробовать разные способы сравнения 
                                                             // в зависимости от ситуации                             
?>

запустить на локалхосте и найти подходящий способ.

  Ответить  
 
 автор: Drago   (03.08.2011 в 14:42)   письмо автору
 
   для: julpierto   (03.08.2011 в 14:34)
 

По вашему, оператор сравнения "==" сравнивает недостаточно хорошо?

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:42)   письмо автору
 
   для: julpierto   (03.08.2011 в 14:34)
 

Да, но в базе данных хранится следующий текст:

"продам холодильник СТИНОЛ высота 1,70, с отдельной камерой 12т.р.<br />
кухонный гарнитур 6т.р.<br />
уголок кухонный 2т.р."

а в массиве $_POST следующий:

"продам холодильник СТИНОЛ высота 1,70, с отдельной камерой 12т.р.
кухонный гарнитур 6т.р.
уголок кухонный 2т.р."

Поэтому выражение
if(substr_count($_POST['zagolovok'],$myrow555["zagolovok"])>0 and substr_count($text_dubl,$text_ob)>0 and substr_count($_POST['gorod'],$myrow555["gorod"])>0)


считает строки разными

  Ответить  
 
 автор: Lotanaen   (03.08.2011 в 14:53)   письмо автору
 
   для: sega_z   (03.08.2011 в 14:42)
 

видимо нужно заменять на пробелы теги <br> и символы табуляции, конца строки и перевода каретки

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:58)   письмо автору
 
   для: Lotanaen   (03.08.2011 в 14:53)
 

А можно ли как то вообще очистить строки от всех пробелов и переносов, а потом сравнивать простым сравнением "=="

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:55)   письмо автору
 
   для: julpierto   (03.08.2011 в 14:34)
 

Здесь есть какие то ошибки:


<?php
$a 
"Во поле береза стояла";
$b "Во поле кудрявая стояла";
if (
substr_count($a$b)==0) { echo "Строки не идентичны" };  // здесь можно пробовать разные способы сравнения 
                                                             // в зависимости от ситуации                             
?> 

  Ответить  
 
 автор: Drago   (03.08.2011 в 14:48)   письмо автору
 
   для: sega_z   (03.08.2011 в 13:12)
 

Для чего нужна строка?
$text_dubl = str_replace("<br />","","$text_dubl");
Вы храните в базе обработанный функцией nl2br() текст? Эту функцию лучше использовать при выводе в браузер, а в базе хранить исходный текст.
Чтобы увидеть чем отличаются ваши переменные, напишите:
var_dump($text_ob);
var_dump($text_dubl);

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:52)   письмо автору
 
   для: Drago   (03.08.2011 в 14:48)
 


$pochta = $_POST['e_mail'];
$result555 = mysql_query ("SELECT id,text_obyavl,zagolovok,gorod FROM doska WHERE e_mail='$pochta'",$db);
$myrow555 = mysql_fetch_array ($result555);
$text_dubl = trim($myrow555["text_obyavl"]); $text_dubl = str_replace("<br />","","$text_dubl");
$text_ob = trim($_POST['text_obyavl']);
if(substr_count($_POST['zagolovok'],$myrow555["zagolovok"])>0 and substr_count($text_dubl,$text_ob)>0 and substr_count($_POST['gorod'],$myrow555["gorod"])>0)


Так тоже не работает!!!!

  Ответить  
 
 автор: Drago   (03.08.2011 в 14:53)   письмо автору
 
   для: sega_z   (03.08.2011 в 14:52)
 

А что изменилось? Вы проверили, что у вас находится в переменных?

  Ответить  
 
 автор: sega_z   (03.08.2011 в 14:54)   письмо автору
 
   для: Drago   (03.08.2011 в 14:53)
 

Вот ответ:

string(106) "продам холодильник высота 1,70, с отдельной камерой 12т.р. кухонный гарнитур 6т.р. уголок кухонный 2т.р." string(115) "продам холодильник СТИНОЛ высота 1,70, с отдельной камерой 12т.р. кухонный гарнитур 6т.р. уголок кухонный 2т.р."

  Ответить  
 
 автор: Drago   (03.08.2011 в 14:58)   письмо автору
 
   для: sega_z   (03.08.2011 в 14:54)
 

Поиграем в игру "Найди 10 отличий"? :)

string(106) "продам холодильник высота 1,70, с отдельной камерой 12т.р. кухонный гарнитур 6т.р. уголок кухонный 2т.р." 
string(115) "продам холодильник СТИНОЛ высота 1,70, с отдельной камерой 12т.р. кухонный гарнитур 6т.р. уголок кухонный 2т.р."

  Ответить  
 
 автор: sega_z   (03.08.2011 в 15:02)   письмо автору
 
   для: Drago   (03.08.2011 в 14:58)
 

Прошу прошения за ошибку, но вот теперь какой ответ:

string(113) "продам холодильник СТИНОЛ высота 1,70, с отдельной камерой 12т.р. кухонный гарнитур 6т.р. уголок кухонный 2т.р." string(115) "продам холодильник СТИНОЛ высота 1,70, с отдельной камерой 12т.р. кухонный гарнитур 6т.р. уголок кухонный 2т.р."

и все равно почему то разные????

Вот пример кода:


$pochta = $_POST['e_mail'];
$result555 = mysql_query ("SELECT id,text_obyavl,zagolovok,gorod FROM doska WHERE e_mail='$pochta'",$db);
$myrow555 = mysql_fetch_array ($result555);
$text_dubl = trim($myrow555["text_obyavl"]); $text_dubl = str_replace("<br />","","$text_dubl");
$text_ob = trim($_POST['text_obyavl']);
var_dump($text_ob);
var_dump($text_dubl);
if(substr_count($_POST['zagolovok'],$myrow555["zagolovok"])>0 and substr_count($text_dubl,$text_ob)>0 and substr_count($_POST['gorod'],$myrow555["gorod"])>0)

  Ответить  
 
 автор: MHz   (03.08.2011 в 15:12)   письмо автору
 
   для: sega_z   (03.08.2011 в 15:02)
 

similar_text() или levenshtein() не подойдут?

  Ответить  
 
 автор: Drago   (03.08.2011 в 15:17)   письмо автору
 
   для: sega_z   (03.08.2011 в 15:02)
 

Разные, потому что кол-во символов отличается. Попробуйте написать так:
<?
//var_dump($text_ob); 
//var_dump($text_dubl);
var_dump(implode(', 'array_map('ord'str_split($text_ob))));
var_dump(implode(', 'array_map('ord'str_split($text_dubl))));


И покажите результат.

  Ответить  
 
 автор: sega_z   (03.08.2011 в 15:19)   письмо автору
 
   для: Drago   (03.08.2011 в 15:17)
 

Вот результат:

string(532) "239, 240, 238, 228, 224, 236, 32, 245, 238, 235, 238, 228, 232, 235, 252, 237, 232, 234, 32, 209, 210, 200, 205, 206, 203, 32, 226, 251, 241, 238, 242, 224, 32, 49, 44, 55, 48, 44, 32, 241, 32, 238, 242, 228, 229, 235, 252, 237, 238, 233, 32, 234, 224, 236, 229, 240, 238, 233, 32, 49, 50, 242, 46, 240, 46, 13, 10, 234, 243, 245, 238, 237, 237, 251, 233, 32, 227, 224, 240, 237, 232, 242, 243, 240, 32, 54, 242, 46, 240, 46, 13, 10, 243, 227, 238, 235, 238, 234, 32, 234, 243, 245, 238, 237, 237, 251, 233, 32, 50, 242, 46, 240, 46" string(540) "239, 240, 238, 228, 224, 236, 32, 245, 238, 235, 238, 228, 232, 235, 252, 237, 232, 234, 32, 209, 210, 200, 205, 206, 203, 32, 226, 251, 241, 238, 242, 224, 32, 49, 44, 55, 48, 44, 32, 241, 32, 238, 242, 228, 229, 235, 252, 237, 238, 233, 32, 234, 224, 236, 229, 240, 238, 233, 32, 32, 49, 50, 242, 46, 240, 46, 13, 10, 234, 243, 245, 238, 237, 237, 251, 233, 32, 227, 224, 240, 237, 232, 242, 243, 240, 32, 32, 54, 242, 46, 240, 46, 13, 10, 243, 227, 238, 235, 238, 234, 32, 234, 243, 245, 238, 237, 237, 251, 233, 32, 50, 242, 46, 240, 46"

  Ответить  
 
 автор: Drago   (03.08.2011 в 15:27)   письмо автору
 
   для: sega_z   (03.08.2011 в 15:19)
 

У вас в строке, которая хранится в базе 2 лишних пробела между словами.

продам холодильник СТИНОЛ высота 1,70, с отдельной камерой 12т.р.
кухонный гарнитур 6т.р.
уголок кухонный 2т.р.

// после слов "камерой" и "гарнитур"
продам холодильник СТИНОЛ высота 1,70, с отдельной камерой  12т.р.
кухонный гарнитур  6т.р.
уголок кухонный 2т.р.

  Ответить  
 
 автор: sega_z   (03.08.2011 в 15:35)   письмо автору
 
   для: Drago   (03.08.2011 в 15:27)
 

Ага понял.

А можно как нибудь сделать, чтобы удалялись вообще все пробелы перед сравнением строк?
Иначе пользователь напишет тоже самое объявление и поставит лишний пробел - программа посчитает эти тексты разными.

  Ответить  
 
 автор: Drago   (03.08.2011 в 15:42)   письмо автору
 
   для: sega_z   (03.08.2011 в 15:35)
 

А если пользователь добавит лишнюю точку или букву, что тогда?
Лучше, в таком случае, воспользоваться алгоритмами сравнения текста, которые посоветовал MHz.

  Ответить  
 
 автор: sega_z   (03.08.2011 в 15:47)   письмо автору
 
   для: Drago   (03.08.2011 в 15:42)
 

А можно поподробнее, я первый раз слышу о таких алгоритмах.

  Ответить  
 
 автор: Drago   (03.08.2011 в 15:58)   письмо автору
 
   для: sega_z   (03.08.2011 в 15:47)
 

Эти функции вычисляют степень похожести двух строк. Подробнее можно почитать в мануале: similar_text(), levenshtein().

  Ответить  
 
 автор: sega_z   (03.08.2011 в 16:03)   письмо автору
 
   для: Drago   (03.08.2011 в 15:58)
 

Не понял а что именно возвращает функция similar_text?

  Ответить  
 
 автор: sega_z   (03.08.2011 в 17:42)   письмо автору
 
   для: sega_z   (03.08.2011 в 16:03)
 

Все работает нормально, спасибо вам за помощь!

Но если тот же самый текст написать без переноса строки, то уже не срабатывает. Не могу понять почему?

  Ответить  
 
 автор: sega_z   (03.08.2011 в 15:17)   письмо автору
 
   для: sega_z   (03.08.2011 в 15:02)
 

Ну так в чем отличия?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования