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

Форум MySQL

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

 

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

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

тема: MySQL: проверка на существования записи
 
 автор: ntro123   (17.04.2011 в 10:28)   письмо автору
 
 

Добрый день.

Как рациональнее проверять существует ли записать в бд?

if(mysql_fetch_array(mysql_query("select id from user where mail='".$mail."'")))
 exit(1);
else
 exit(0);


Как видно тут приходится извлекать id да потом еще и сувать в mysql_fetch_array.
Есть ли более рациональные способы?

Спасибо.

  Ответить  
 
 автор: cheops   (17.04.2011 в 10:39)   письмо автору
 
   для: ntro123   (17.04.2011 в 10:28)
 

В однотабличных запросах обычно использую функцию COUNT(*)
<?php
  $query 
"SELECT COUNT(*) FROM user
          WHERE mail = '
$mail'";
  
$cnt mysql_query($query);
  if(!
$cnt) exit("Ошибка выполнения запроса - ".mysql_error()."<br>".$query);
  if(
mysql_result($cnt0)) exit(1);
  else exit(
0);
?>

PS Я бы не рекомендовал использовать вложенные конструкции без проверки правильности выполнения запроса. Они у вас выпьют массу крови, так как в случае возникновения ошибки (а они возникают регулярно по разным причинам и статический запрос не является панацеей), код будет вести себя так, как будто ничего не случилось возвращая 0 записей. Если вам важно осуществлять проверку в одну строку, то лучше оформить обертки для mysql-функций, в которые будут включены механизмы проверки и, например, генерации исключений, которые можно перехватывать во внешнем коде. В любом случае ни один запрос нельзя оставлять без обработки ошибок, так как среды PHP и MySQL разные и не могут друг друга предупреждать о возникших проблемах - это задача программиста.

  Ответить  
 
 автор: ntro123   (17.04.2011 в 11:14)   письмо автору
 
   для: cheops   (17.04.2011 в 10:39)
 

А разве не достаточно проверять при подключении к бд?

просто тот участок что я вам привел это проверка не занят ли email адрес другим пользователем и запрос осуществляется через ajax.

У меня проверяется только перед записью в бд и при подключении бд.

  Ответить  
 
 автор: cheops   (17.04.2011 в 12:02)   письмо автору
 
   для: ntro123   (17.04.2011 в 11:14)
 

Лучше проверять всегда - получится быстрее разрабатывать и в конечном продукте будет меньше ошибок. Запрос может быть модифицирован, в запрос может попасть неэкранированная строка. Блок может пойти в качестве строительного модуля другой системы, где в силу причин не будет подключена база данных с нужной вам таблицей. Запрос отработает, сообщит, что записей 0, а о том, что произошла ошибка и модуль не рабочий вы не сможете узнать, считая, что блок отлажен и ошибок выдавать не может (а они постоянно возникают на стыках технологий, вроде PHP и MySQL). Впрочем, не обязательно это делать прямо сейчас, со временем вы сами все это увидите. Когда у вас засбоит отлаженный модуль или на причину поиска неисправности, о которой модуль молчит у вас уйдет больше часа, просто вспомните, что это можно предотвратить тотальной проверкой правильности выполнения запросов.

  Ответить  
 
 автор: ntro123   (17.04.2011 в 13:24)   письмо автору
 
   для: cheops   (17.04.2011 в 12:02)
 

У меня все строки проверяются регулярными выражениями, и уверен на 100% что в запросы попадет только то что мне нужно (это сделано и против sql inj).

Единственное чего я боюсь это того что сам сервер одаст мне не верные данные (различные сбою на сервере или в самой mysql).

Спасибо за дельные советы.

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

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