[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: необходимо узнать, есть строка в БД или нет.
vertraut
Появилась необходимость проверять, есть ли в базе определенные строки или нет.
Сделал два файла, один с формой, другой обработчик.
Я вставляю список в текстовое поле, и отправляю это на обработчик. После чего делаю массив строк и проверяю каждую строку по очереди. Но почему-то не очень это все работает. Зависит от последовательности проверки. То показывает что запись есть в базе, то показывает что нет. Подскажите что делать?
Похожие два файла позволяют добавлять строки в бд (аналогичным способом).
В phpmyadmin установлена уникальность для поля с название песни. Но иногда строку можно добавить дважды. Значит есть различие. Но какое? Если строки идентичные. Помогите!

Файл с формой:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Список проверяемых песен</title>
</
head>

<
body>
<
form id="form1" name="form1" method="post" action="testing.php">
<
p>
<
label>Введите название песнен:<br />
<
textarea name="list_sound" id="list_sound" cols="100" rows="20"></textarea>
</
label>
</
p>
<
p>
<
label>
<
input type="submit" name="submit" id="submit" value="Проверить песни" />
</
label>
</
p>
</
form>
<
p><a href="/index.php">Главная</a></p>
</
body>
</
html>


Файл обработчик:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Проверка песен</title>
</
head>

<
body><?php

include ("settings.php");
if (isset($_POST['list_sound'])) {$list_sound = $_POST['list_sound'];
$list_sound=trim($list_sound);
if($list_sound == '') {unset($list_sound);}}


if (isset($list_sound))
{
echo "<table border='1'>";
$array = explode("\n", $list_sound);
for ( $i=0; $i<count($array); $i++)
{
$pesni = mysql_query ("SELECT name_sound FROM `top1000` WHERE (name_sound='$array[$i]')" ,$link);
$myrow_pesni = mysql_fetch_array ($pesni);
if (mysql_num_rows($pesni)) {
echo "<tr><td>".$myrow_pesni['name_sound']."</td><td style='background-color:#0F0' width='80'>Есть в базе!</td></tr>";
} else {
echo "<tr><td><b>".$array[$i]."</b></td><td style='background-color:#F00; color:#fff;' width='80'>Нет в базе!</td></tr>";}

}

echo "</table>";
}
else {echo "<p>Вы не ввели название песни<p>";}

mysql_close($link);

?>
<p><a href="/index.php">Главная</a></p>
</
body>
</
html>





Спустя 4 минуты, 31 секунда (28.12.2011 - 15:21) Winston написал(а):
Вот так проверять нужно.
$query = mysql_query("SELECT ..... WHERE `field` = '".mysql_real_escape_string($search)."'");
if(mysql_num_rows($query) > 0)
echo 'есть';
else
echo 'Нету';

Спустя 1 минута, 48 секунд (28.12.2011 - 15:23) vertraut написал(а):
Цитата (Winston @ 28.12.2011 - 12:21)
Вот так проверять нужно.
$query = mysql_query("SELECT ..... WHERE `field` = '".mysql_real_escape_string($search)."'");
if(mysql_num_rows($query) > 0)
echo 'есть';
else
echo 'Нету';

Спасибо большое) Но можно чуть подробнее, почему именно так? а не так как я?

Спустя 23 минуты, 21 секунда (28.12.2011 - 15:46) rooor написал(а):
Цитата (vertraut @ 28.12.2011 - 12:17)
$pesni = mysql_query ("SELECT name_sound FROM `top1000` WHERE (name_sound='$array[$i]')" ,$link);
$myrow_pesni = mysql_fetch_array ($pesni);
if (mysql_num_rows($pesni)) {...

Сначала загоняешь данные из базы, а потом проверяешь есть ли эти данные? о_О

Спустя 1 минута, 12 секунд (28.12.2011 - 15:48) vertraut написал(а):
Winston, вставил все как Вы сказали. Ничего не поменялось. Если искать в том же порядке, в котором я их занес в базу, то все нормально. Если изменить порядок, то уже не на всех показывает правильно.

Спустя 1 минута, 38 секунд (28.12.2011 - 15:49) vertraut написал(а):
Цитата (rooor @ 28.12.2011 - 12:46)

Сначала загоняешь данные из базы, а потом проверяешь есть ли эти данные? о_О

Я вставляю строки которые нужно проверить в текстовое поле, после чего поочередно пытаюсь выбрать строку в бд, если удается, значит есть строка, если не удается, то строки в базе нет.

Спустя 1 минута, 4 секунды (28.12.2011 - 15:50) rooor написал(а):
$sql = mysql_query(" запрос ");
if(mysql_num_rows($sql) > 0) // сначала надо проверить - есть данные или нет
{
$result = mysql_fetch_assoc($sql); // только потом загонять в массив, если есть запись
}


Спустя 12 минут, 59 секунд (28.12.2011 - 16:03) vertraut написал(а):
хм... не совсем понял для чего это? Зачем мне загонять в массив данные из БД?

Спустя 2 минуты, 48 секунд (28.12.2011 - 16:06) rooor написал(а):
<?php

include './settings.php';
if (isset($_POST['list_sound']) && !empty(trim($_POST['list_sound'])))
$list_sound = trim($_POST['list_sound']);


if (isset($list_sound))
{
echo "<table border='1'>";
$array = explode("\n", $list_sound);
foreach ( $array as $value)
{
$pesni = mysql_query ("SELECT `name_sound` FROM `top1000` WHERE `name_sound` = '".mysql_escape_string($value)."' LIMIT 1");
if (mysql_num_rows($pesni) > 0)
{
$myrow_pesni = mysql_fetch_assoc($pesni);
echo "<tr><td>".$myrow_pesni['name_sound']."</td><td style='background-color:#0F0' width='80'>Есть в базе!</td></tr>";
}
else
{
echo "<tr><td><b>".$value."</b></td><td style='background-color:#F00; color:#fff;' width='80'>Нет в базе!</td></tr>";}
}

echo "</table>";
}
}

else
echo "<p>Вы не ввели название песни<p>";

?>

Спустя 1 день, 6 часов, 11 минут, 4 секунды (29.12.2011 - 22:17) vertraut написал(а):
Спасибо! Вроде все работает! Только при проверке последняя строка всегда "отсутствует". Хотя она есть в базе. Подскажите почему?

Спустя 1 минута, 44 секунды (29.12.2011 - 22:19) vertraut написал(а):
И по поводу повторного добавления строк в базу. Поставил в phpmyadmin чтобы поле было уникальным, но в зависимости от того откуда скопируешь строки они могут занестись в базу повторно. Как избежать дубликатов! В базе строки выглядят одинаково.

Спустя 1 час, 30 минут, 32 секунды (29.12.2011 - 23:50) Guest написал(а):
Неужели никто не знает? Подскажите пожалуйста)

Спустя 1 час, 26 минут, 6 секунд (30.12.2011 - 01:16) inpost написал(а):
Ну а как ты код исправил, показывай. И запись из БД покажи, что существует.

Спустя 7 часов, 54 минуты, 13 секунд (30.12.2011 - 09:10) vertraut написал(а):
Цитата (inpost @ 29.12.2011 - 22:16)
Ну а как ты код исправил, показывай. И запись из БД покажи, что существует.

В смысле запись из БД?

Спустя 8 минут, 15 секунд (30.12.2011 - 09:18) vertraut написал(а):
Файлы моего скрипта:

Форма добавления строк в базу:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=Windows-1251" />
<
title>Добавление песен в базу</title>
</
head>

<
body>
<
h1>ДОБАВЛЕНИЕ</h1>
<
form id="form1" name="form1" method="post" action="1.php">
<
p>
<
label>Введите название песнен:<br />
<
textarea name="list_sound" id="list_sound" cols="100" rows="20"></textarea>
</
label>
</
p>
<
p>
<
label>
<
input type="submit" name="submit" id="submit" value="Занести песни в базу" />
</
label>
</
p>
</
form>
<
p><a href="/index.php">Главная</a></p>
</
body>
</
html>

Добавление в базу (обработчик):
<?php

include ("settings.php");
if (isset($_POST['list_sound'])) {$list_sound = $_POST['list_sound'];
$list_sound=trim($list_sound);
if($list_sound == '') {unset($list_sound);}}


if (isset($list_sound))
{
$array = explode("\n", $list_sound);
for ( $i=0; $i<count($array); $i++)
{
$result1 = mysql_query ("INSERT INTO top1000 (name_sound) VALUES ('".mysql_real_escape_string($array[$i])."')");
if ($result1 <> 'true') {echo $array[$i]."<br>";}
}

}


else {echo "<p>Вы не ввели название песни<p>";}

mysql_close($link);
?>
<p><a href="/index.php">Главная</a></p>

Проверка строк (форма):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Список проверяемых песен</title>
</
head>

<
body><h1>ПРОВЕРКА</h1>
<
form id="form1" name="form1" method="post" action="testing.php">
<
p>
<
label>Введите название песнен:<br />
<
textarea name="list_sound" id="list_sound" cols="100" rows="20"></textarea>
</
label>
</
p>
<
p>
<
label>
<
input type="submit" name="submit" id="submit" value="Проверить песни" />
</
label>
</
p>
</
form>
<
p><a href="/index.php">Главная</a></p>
</
body>
</
html>



Проверка строк (обработчик):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<
title>Проверка песен</title>
</
head>

<
body><?php

include ("settings.php");
if (isset($_POST['list_sound'])) {$list_sound = $_POST['list_sound'];
$list_sound=trim($list_sound);
if($list_sound == '') {unset($list_sound);}}


if (isset($list_sound))
{

$array = explode("\n", $list_sound);
echo "<table border='1'>";
for ( $i=0; $i<count($array); $i++)
{
$query = mysql_query("SELECT name_sound FROM `top1000` WHERE `name_sound` = '".mysql_real_escape_string($array[$i])."'");

if(mysql_num_rows($query) > 0){
$myrow_pesni = mysql_fetch_assoc($query);
echo "<tr><td>".$myrow_pesni['name_sound']."</td><td style='background-color:#0F0' width='80'>Есть в базе!</td></tr>";}
else
{echo "<tr><td><b>".$array[$i]."</b></td><td style='background-color:#F00; color:#fff;' width='80'>Нет в базе!</td></tr>";}


}

echo "</table>";
}
else {echo "<p>Вы не ввели название песни<p>";}

mysql_close($link);

?>
<p><a href="/index.php">Главная</a></p>
</
body>
</
html>

Спустя 1 день, 4 часа, 40 минут, 3 секунды (31.12.2011 - 13:58) vertraut написал(а):
Никто не знает? Ошибки пустяковые для знатаков) Может какие функции нужно использовать, которые приведут строку всегда к одному виду?

Спустя 1 час, 12 минут, 11 секунд (31.12.2011 - 15:10) inpost написал(а):
Что будет делаться, если человек введёт дубль? Что тебе надо?
1) Обновить старую запись:
insert on duplicate key update

2) Старую запись не трогать:
В начале делаешь запрос №1:
SELECT `name` FROM `table` WHERE name IN (тут перечисляешь все имена: используй implode(''), не забываем кавычки!)
В цикле while формируешь второй массив имён `name`. Далее 2 массива сравниваешь между собой и выбираешь ТОЛЬКО уникальные значения. Функция: http://php.su/functions/?array-diff (array_diff)
Вуаля, теперь спокойно в БД будут вставляться только УНИКАЛЬНЫЕ записи.

Спустя 2 дня, 6 часов, 19 минут, 40 секунд (3.01.2012 - 21:30) vertraut написал(а):
Спасибо! Интересует именно второй случай. Я в базе поставил полю с названием песни "уникальный". Это не заменяет сравнение массивов? Зачастую это работает, но иногда строка добавляется дважды. Возможно она просто чем-то отличается от предыдущей (какие-то невидимые символы). Есть функция которая очищает от всех пробелов и других символов?

Спустя 1 час, 14 минут, 33 секунды (3.01.2012 - 22:45) rooor написал(а):
trim - Удаляет пробелы из начала и конца строки

Спустя 20 минут, 34 секунды (3.01.2012 - 23:05) Игорь_Vasinsky написал(а):
не только wink.gif
http://php.su/functions/?trim

Спустя 1 час, 27 минут, 18 секунд (4.01.2012 - 00:32) v.ru.n32 написал(а):
ты кстати небоишься ошибки с кодировками. смотри а то есть вероятность ошибки при использовании русского апача. апач увидит заголовок передан в формате windows1251 а кодировка на апатче русском будит стоять кодировка например KIO8. в итоге апач поменяет кодировку windows на koi8 но <meta> изменить неможет. пользователь увидит текст кодировки windows в кодировки kio.

Спустя 18 часов, 26 минут, 47 секунд (4.01.2012 - 18:59) vertraut написал(а):
Цитата (v.ru.n32 @ 3.01.2012 - 21:32)
ты кстати небоишься ошибки с кодировками. смотри а то есть вероятность ошибки при использовании русского апача. апач увидит заголовок передан в формате windows1251 а кодировка на апатче русском будит стоять кодировка например KIO8. в итоге апач поменяет кодировку windows на koi8 но <meta> изменить неможет. пользователь увидит текст кодировки windows в кодировки kio.

Да, у меня постоянные проблемы с кодировкой, мучаюсь, думаю как исправиль

Спустя 1 минута, 3 секунды (4.01.2012 - 19:00) inpost написал(а):
снести сайт и переписать на UTF-8, это стандартная кодировка.

Спустя 1 час, 14 минут, 34 секунды (4.01.2012 - 20:15) v.ru.n32 написал(а):
vertraut

ты ща серьезно или типо пошутил? если серьезно поставь другой атач и все. если вломно ставить ребята собрали достойную замену называеться ДЕНВЕР. можешь попробовать.

Спустя 21 час, 1 минута, 27 секунд (5.01.2012 - 17:16) vertraut написал(а):
Цитата (v.ru.n32 @ 4.01.2012 - 17:15)
vertraut

ты ща серьезно или типо пошутил? если серьезно поставь другой атач и все. если вломно ставить ребята собрали достойную замену называеться ДЕНВЕР. можешь попробовать.

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

Спустя 14 минут, 15 секунд (5.01.2012 - 17:30) vertraut написал(а):
На счет дублирования строк...
Сделал экспорт, чтобы посмотреть чем же отличаются строки. И различие действительно есть... Например,
(1022, 'Arash & Блестящие - Восточные Сказки 4.88 Мб \r')
(906, 'Arash & Блестящие - Восточные Сказки 4.88 Мб\r').
В первой строке есть пробел после Мб, во второй нет.
Есть еще, но это лучше сделать скриншотом, т.к. когда вставляешь текст, то теряются различия:
user posted image
Как это исправить? Какую функцию использовать?

Спустя 3 дня, 17 часов, 47 секунд (9.01.2012 - 10:31) vertraut написал(а):
Пожалуйста, подскажите)

Спустя 3 часа, 3 минуты, 16 секунд (9.01.2012 - 13:35) nugle написал(а):
у тебя перед внесение данных в бд остаются пробелы, обрабатывай функцией trim
Быстрый ответ:

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