Есть запрос
<?php
$username=arg(1);
$result = db_query_range("SELECT u.uid FROM {users} u WHERE LOWER(u.name) = LOWER('%s')", $username, 0, 1);
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)) всегда возвращают положительный результат... как можно проверить иначе???
Комментарии
Рекомендуют такую конструкцию:
SELECT count(u.uid) FROM {users} u WHERE LOWER(u.name) = LOWER('%s')
Без db_result() не обойтись в любом случае
Ошибочная конструкция, сразу видно, что на Си не программировали
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
На Си нет )) На делфях когда то давно учился... Но SQL не работали..
Это я понял сразу, бывают такие задачи. Как раз, с месяц назад читал топик на dev.mysql.com, большинство сошлось на том, что нужно делать как я в примере привёл. Но здесь теперь видится немного другой случай.
Можно попробовать так:
$result = db_query("SELECT u.uid FROM {users} u WHERE LOWER(u.name) = LOWER('%s')", $username);
$account = db_result($result);
и тут уже посмотри var_dump'ом содержимое переменной $account для обоих случаев, т.е. для случае если юзер есть и если нет, там NULL будет во втором случае
Тут SQL не важен, почитай в мануале про тип данных "MySQL-ресурс" и вспомни курс делфи, поймёшь почему твой if не имеет смысла
Да и нахрена db_query_range()?
Просто как я понимаю select прекращает работу после набора лимита, а лимит 1... типа оптимизация )) Возможно ошибаюсь
на сайте будет отключено кэширование... поэтому хочу по максимуму снизить лишние движения... будут только анонимы и пара админов....
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); ?>Да
не совсем понял, но думаю что нет, так как данный запрос будет постоянно возвращать 0 строк
Не в тех местах экономишь, алгоритмы оптимизируй, я за тобой давно наблюдаю
)) Мы будем стремиться к мудрости и силе, не ведая других желаний (с)
Очередное спасибо!
Не знаю насколько оптимальней (может все же с 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));
}
?>
olk
Вариант но смотрите
if полюбому будет в обоих случаях в вашем варианте к этому if еще и запрос...
но учитывая что на сайте специфика такова что результатом в 70% первого запроса будет 0, поэтому возможно ваш варианта будет создавать меньше нагрузки (учитывая что COUNT насколько я знаю одна из самых быстрых процедур)
Спасибо за вариант!