Пустой результат запроса

Главные вкладки

Аватар пользователя Bios Bios 9 февраля 2010 в 20:51

Есть запрос

<?php
$username
=arg(1);
  
$result db_query_range("SELECT u.uid FROM {users} u WHERE LOWER(u.name) = LOWER('%s')"$username01);
  if(!empty(
$result)) {
    
$account db_fetch_object($result);
    
$uid $account->uid;
    } else {
$uid 1;

?>

Как узнать не выполняя db_fetch_object или db_fetch_array есть ли в результате запроса хотябы одна строка результата... Или вообще есть ли результат???

конструкции как в примере if(!empty($result)) или if(isset($result)) всегда возвращают положительный результат... как можно проверить иначе???

Комментарии

Аватар пользователя Bios Bios 9 февраля 2010 в 21:10

RxB

Суть функции в том что нужно узнать идентификатор для другого запроса... просто хотелось как то оптимизировать код чтобы не делать лишних движений...

ниже можно понять взаимодействие:

<?php

function zakup_navigate_get_user_id() {
  
$username=arg(1);
  
$result db_query("SELECT u.uid FROM {users} u WHERE LOWER(u.name) = LOWER('%s')"$username);
if(!empty(
$result)) {
    
$account db_fetch_object($result);
    
$uid $account->uid;
    } else {
    
$uid null;
  }
 return 
$uid;
}

function 

zakup_navigate_tenders_page() {
  
$uid zakup_navigate_get_user_id ();
  if (!empty(
$uid)) {
    
$result db_query("SELECT n.nid, n.title, n.uid, n.created FROM {node} n WHERE n.type='%s' AND n.uid = '%s' AND n.status = 1"'contest',  $uid);
    while (
$node db_fetch_object($result)) {
    
$output .= l($node->title'node/'.$node->nid).'<br>';
    }
  } else {
  
$output .= (t("Не обнаружен идентификатор компании, либо идентификатор не верен...") ."<br />" t("Вернитесь на главную страницу и выберите компанию...."));
  }
  return 
$output;
}

?>
Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 9 февраля 2010 в 21:17

"Bios" wrote:
Суть функции в том что нужно узнать идентификатор для другого запроса...

Это я понял сразу, бывают такие задачи. Как раз, с месяц назад читал топик на dev.mysql.com, большинство сошлось на том, что нужно делать как я в примере привёл. Но здесь теперь видится немного другой случай.
Можно попробовать так:

$username=arg(1);
  $result = db_query("SELECT u.uid FROM {users} u WHERE LOWER(u.name) = LOWER('%s')", $username);
  $account = db_result($result);
и тут уже посмотри var_dump'ом содержимое переменной  $account для обоих случаев, т.е. для случае если юзер есть и если нет, там NULL будет во втором случае
Аватар пользователя Bios Bios 9 февраля 2010 в 21:33

RxB wrote:
Да и нахрена db_query_range()?

Просто как я понимаю select прекращает работу после набора лимита, а лимит 1... типа оптимизация )) Возможно ошибаюсь

на сайте будет отключено кэширование... поэтому хочу по максимуму снизить лишние движения... будут только анонимы и пара админов....

Аватар пользователя Bios Bios 9 февраля 2010 в 21:29

RxB

Попробовал наверное это самый оптимальный способ в данном случае... Спасибо...

Еще если не трудно есть пара вопросов:
1. В Друпале всегда 0 пользователь заполняется пустыми полями т. е. он как бы есть, но он не существует???
2. Есть ли смысл в данном случае в запрос добавить: u.name <> '' т.е. чтобы запрос выглядел (учитывая что идентификатор определяется аргументом который может быть пустым):

<?php

  $result 

db_query("SELECT u.uid FROM {users} u WHERE LOWER(u.name) = LOWER('%s') AND u.name <> ''"$username);

?>
Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 9 февраля 2010 в 21:31

"Bios" wrote:

1. В Друпале всегда 0 пользователь заполняется пустыми полями т. е. он как бы есть, но он не существует???

Да
"Bios" wrote:
2. Есть ли смысл в данном случае в запрос добавить: u.name <> '' т.е. чтобы запрос выглядел (учитывая что идентификатор определяется аргументом который может быть пустым):

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

Аватар пользователя olk olk 9 февраля 2010 в 21:52

Не знаю насколько оптимальней (может все же с db_fetch_object(array) будет и оптимальней, но можно попробовать следующий вариант

<?php
$result 
db_result(db_query("SELECT COUNT(*) FROM {users} u WHERE LOWER(u.name) = LOWER('%s')"$username));
 if (
$result) {
    
$uid db_result(db_query("SELECT u.uid FROM {users} u WHERE LOWER(u.name) = LOWER('%s')"$username));
 }
?>
Аватар пользователя Bios Bios 9 февраля 2010 в 22:39

olk

Вариант но смотрите

if полюбому будет в обоих случаях в вашем варианте к этому if еще и запрос...

но учитывая что на сайте специфика такова что результатом в 70% первого запроса будет 0, поэтому возможно ваш варианта будет создавать меньше нагрузки (учитывая что COUNT насколько я знаю одна из самых быстрых процедур)

Спасибо за вариант!