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 :: mysql_query SELECT and INSERT

 PHP.SU

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


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

> Описание: 2 в 1
LEONeso
Отправлено: 23 Марта, 2011 - 10:01:57
Post Id



Посетитель


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


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




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


Допустим, есть переменная $name и ей присвоено значение 'Игорь'. Требуется, проверить наличие значения переменной $name в базе данных mysql, если совпадения не найдены, то добавить новую запись.


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
garvey
Отправлено: 23 Марта, 2011 - 10:05:33
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


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




Как я понял, поле NAME у вас уникальное? Тогда в чем проблема? MySQL не позволит записать в базу 2 записи с одинаковым значением для уникального поля.
 
 Top
LEONeso
Отправлено: 23 Марта, 2011 - 10:08:54
Post Id



Посетитель


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


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




garvey, нет, поле не является уникальным. Требуется именно проверка. Правда я не знаю, что будет, когда придется проверять более 50000 записей


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Марта, 2011 - 10:12:52
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




LEONeso пишет:
когда придется проверять

А их так и так проверять придется..
Тем или иным способом. Так ведь проще когда за вас это делается внутри mysql
 
 Top
garvey
Отправлено: 23 Марта, 2011 - 10:14:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


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




Странно, что не уникальное. У вас поведение идентичное поведению уникального поля. Есть такое - не добавляем, нету - добавляем. Или это только в одном месте, а в других можно записать с таким именем?
 
 Top
LEONeso
Отправлено: 23 Марта, 2011 - 10:18:20
Post Id



Посетитель


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


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




garvey, допустим, будут еще поля типа фамилии и отчества и потребуется, чтобы все 3 значения фамилия имя и отчество не совпадали с предлагаемыми данными из переменных. Тогда уникальные, будут бесполезны т.к. если друг у одного человека имя "Игорь" и Ф.О разные и тут же встречается еще один "Игорь", то второго Игоря и не добавит.

Что в таком случае? Какой должен быть запрос?

Степаненко Игорь Владимирович и Смирнов Игорь Владимирович (2 разных человека и они хотят быть в базе данных и Ф.И.О. должны храниться отдельно)

(Отредактировано автором: 23 Марта, 2011 - 10:20:10)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Марта, 2011 - 10:25:48
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Двумя запросами
Первый по точному совпадению
Если первый вернул 0 строк - делаем второй запрос на запись.
 
 Top
LEONeso
Отправлено: 23 Марта, 2011 - 10:26:58
Post Id



Посетитель


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


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




Так?
PHP:
скопировать код в буфер обмена
  1. mysql_query ("IF (SELECT * FROM test WHERE name='$name',,INSERT INTO test (name) VALUES ('$name'))");

(Отредактировано автором: 23 Марта, 2011 - 10:27:32)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
garvey
Отправлено: 23 Марта, 2011 - 10:38:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 528
Дата рег-ции: Май 2010  
Откуда: Minsk


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




Есть способ, который может вам помочь. Возможно он вам поможет:
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO `table` (`field`) VALUES ('value') WHERE NOT EXISTS (SELECT `id` FROM `table` WHERE `field`='value')
 
 Top
LEONeso
Отправлено: 23 Марта, 2011 - 10:47:49
Post Id



Посетитель


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


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




garvey, не работает и не очень понятно как оно вообще работает.

Оператор NOT EXISTS работает так же, как и оператор EXISTS, за исключением того, что предложение WHERE, в котором используется этот оператор, выполняется, если вложенный запрос не возвращает ни одной строки.
(Добавление)
Пробую:
CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE  `test`.`table` (
  2. `id` INT NOT NULL AUTO_INCREMENT ,
  3. `field` VARCHAR( 255 ) NOT NULL ,
  4. PRIMARY KEY (  `id` )
  5. ) ENGINE = MYISAM ;


PHP:
скопировать код в буфер обмена
  1. $tttt = mysql_query ("INSERT INTO `table` (`field`) VALUES ('value') WHERE NOT EXISTS (SELECT `id` FROM `table` WHERE `field`='value')");
  2. if ($tttt==true) {echo 'true ';} else {echo 'false ';}

или
PHP:
скопировать код в буфер обмена
  1. $tttt = mysql_query ("INSERT INTO `table` (`field`) VALUES ('value') WHERE NOT EXISTS (SELECT * FROM `table` WHERE `field`='value')");
  2. if ($tttt==true) {echo 'true ';} else {echo 'false ';}

результат FALSE

(Отредактировано автором: 23 Марта, 2011 - 12:05:27)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Марта, 2011 - 12:10:21
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




LEONeso
Даже если у тебя получится все включить в один запрос.
Как ты будешь говорить юзеру о том что сохранение не произошло по причине существования идентичных данных?
По мне так правильнее сделать запрос на проверку.
Если такие данные есть - вывести сообщение об ошибке добавления.
Если нет - добавить данные и вывести сообщение об успешном добавлении.
 
 Top
LEONeso
Отправлено: 23 Марта, 2011 - 12:26:34
Post Id



Посетитель


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


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




DeepVarvar, за чем мне писать самому себе то, что мне не надо?

Если я делаю первый запрос проверяя есть ли запись в бд, потом еще запрос (запись данных) и это все повторяется 50000+ раз, у меня вылетает ошибка... время работы превышено 30с или же ошибка 500.


-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
Мелкий Супермодератор
Отправлено: 23 Марта, 2011 - 12:27:13
Post Id



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


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




DeepVarvar пишет:
Как ты будешь говорить юзеру о том что сохранение не произошло по причине существования идентичных данных?

mysql_affected_rows

LEONeso пишет:
результат FALSE

Значит, ругается парсер SQL. На что ругается - скажет mysql_error. Вероятно, на всю конструкцию where.

LEONeso пишет:
допустим, будут еще поля типа фамилии и отчества и потребуется, чтобы все 3 значения фамилия имя и отчество не совпадали с предлагаемыми данными из переменных. Тогда уникальные, будут бесполезны т.к. если друг у одного человека имя "Игорь" и Ф.О разные и тут же встречается еще один "Игорь", то второго Игоря и не добавит.

MySQL поддерживает уникальные индексы по нескольким полям одновременно. И отсеивать будет только совпадение по всем входящим в индекс полям.
Другое дело, что относительно ФИО уникальность недопустима, т.к. существуют люди с полностью совпадающими ФИО.


-----
PostgreSQL DBA
 
 Top
LEONeso
Отправлено: 23 Марта, 2011 - 13:53:37
Post Id



Посетитель


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


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




Сделал так:
PHP:
скопировать код в буфер обмена
  1.     $result=mysql_query ("SELECT * FROM `table` WHERE `field`='value'");
  2.     if (($myrow=mysql_fetch_array($result)) == FALSE) {mysql_query ("INSERT INTO `table` (`field`) VALUES ('value')");}


так работает. а вот одним запросом никак.

(Отредактировано автором: 23 Марта, 2011 - 13:57:59)



-----
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть _опой на клавиатуру.
 
 Top
DeepVarvar Супермодератор
Отправлено: 23 Марта, 2011 - 16:18:22
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Мелкий пишет:
mysql_affected_rows

Хорошо - сообщение выведем...
А одним запросом и прочитать и записать?
LEONeso пишет:
повторяется 50000+ раз, у меня вылетает ошибка...

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


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB