Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пользовательские закладки (добавление/удаление), Создание пользовательских закладок 
:(
    Опции темы
Valdo
Дата 10.5.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Доброго времени суток!

Встал передо мной следующий вопрос: "Как создаются пользовательские закладки?"

Постараюсь обрисовать ситуацию как можно подробнее:

Сайт. Есть зарегистрированные пользователи. Есть страницы с публикациями (к примеру, новости, статьи, заметки). Как обычно - есть краткая публикация с ссылкой на полную публикацию. Ниже каждой краткой публикации есть текстовая ссылка (либо кнопка) с надписью "Добавить в закладки". Зарегистрированный пользователь жмет ссылку, тем самым, добавляя публикацию в закладки для последующего прочтения. Тут же, возле краткой публикации ссылка "Добавить в закладки" тут же сменяется следующей "Убрать из закладок". Пройдя по ссылке "Мои закладки" в пользовательском меню, он попадает на страницу своих закладок, где лежат выбранные им публикации. Возле каждой публикации есть ссылочки "Убрать из закладок". Прочтя ту или иную публикацию, пользователь жмет на ссылку - закладка удаляется.

Вторые сутки "ковыряю" DLE - ничего не получается. Слишком мудренный код для того, кто с начала сего года изучает php. Бьюсь как рыба об лед, а отдачи нет.

Разобрал лишь то, что в таблицу с пользователями (назовем ее "users"), в поле "favorites" (к примеру), добавляются id этих самых публикаций, которые перечисляются через запятую. При каждом добавлении/удалении, таблица "users" (поле "favorites") обновляется. Ситуацию с изучением закладок на DLE усугубляет то, что там используется Ajax (чтобы страничка не перезагружалась при нажатии на ссылку/кнопку добавления/удаления закладок). Наверняка так и используется повсеместно, пусть не Ajax, но Javascript уж точно.

В подведении итогов, хотелось бы узнать:

1. По какому принципу создаются пользовательские закладки? 

2. Если есть возможность, покажите на примере (код), как они создаются? Быть может какие-то статьи на соответствующую тему, возможно у кого есть готовый код, по которому можно было бы учиться (не используя его как готовый материал по принципу "получил на руки - вставил - пользуюсь, незная каким образом он работает").

Зачастую встречаю сайты, где используется функция добавления/удаления закладок, но как все это реализуется на практике (как, впрочем, и в теории) очень хотелось бы знать...

Заранее огромное спасибо за любую помощь по данным вопросам!
PM MAIL   Вверх
BuShaRt
Дата 10.5.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Честно говоря не когда не видел таких "фичей" на сайтах, но примерно могу подсказать как это реализуется с нуля.
Для начал забудьте раз и на всегда о идее перечислять в базе данных данные в поле через запятую - это не профессионализм высшей степени.
В остальном Вы близке к истине. Нам понадобиться таблица "bookmark", у нее будет 3 поля id_bookmark, id_users, id_new (уникальные номера закладки, пользователя, статьи соответственно).
Когда Вы будете писать скрипт вывода закладок определенного пользователя, Вам понадобиться построить сложный SQL запрос объединяющей таблицы bookmark и new с выборкой только по определенному значению поля id_users.

О объеденение таблиц.

Добавлено @ 23:18
Возможно я мог не правильно оценить глубину вопроса, но боюсь, что если вопрос куда более сложный, то Вам стоит почитать литературу т.к. работа с AJAX предполагает хотя бы средние навыки работы с php, mysql, javascript и как следствие понимание DOM.

Это сообщение отредактировал(а) BuShaRt - 10.5.2010, 23:21
PM MAIL   Вверх
NewDima
Дата 11.5.2010, 05:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Задача тривиальна. С jquery будет так
Client-side:
Код

function toggleBookmark(a) {
    $(a).load('server-script-path/toggle/'+$(a).attr('id'));
    return false;
}

Код

<a href="this-script-address/toggle/1" onclick="return toggleBookmark(this);" id="1">Добавить в закладки</a>

Server-side:
Код

//$id - из строки запроса
//$user ~ $_SESSION['userId']
$ret = $bookmarks->toggle($user, $id);
$this->view->text = ($ret === true)?'Добавить в закладки':'Удалить из закладок';

В ссылке прописываем id в href для роутера (если яваскрипт будет отключен, обрабатываем на стороне сервера и выплюнем результат). И устанавливаем атрибут id в ней же для функции.
Все.
P.S. Может где какая помарка, писал на коленке

Это сообщение отредактировал(а) NewDima - 11.5.2010, 05:28
PM ICQ   Вверх
BuShaRt
Дата 11.5.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Оффтоп..
Зачем писать? 
Код

($ret === true)?'Добавить в закладки':'Удалить из закладок';

чем не устраивает просто?
Код

($ret)?'Добавить в закладки':'Удалить из закладок';

PM MAIL   Вверх
NewDima
Дата 11.5.2010, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



BuShaRt, а если функция возвращает код ошибки? Не придирайтесь к мелочам, это не важно
PM ICQ   Вверх
BuShaRt
Дата 11.5.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



NewDima, 
Я не придираюсь, я интересуюсь, для того пометку "оффтоп" и поставил.  smile 
PM MAIL   Вверх
Valdo
Дата 11.5.2010, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Цитата(BuShaRt @ 10.5.2010,  23:08)
Честно говоря не когда не видел таких "фичей" на сайтах, но примерно могу подсказать как это реализуется с нуля. 


Спасибо Вам за помощь! Сегодня я продвинулся немного вперед в решении наболевшего вопроса...  smile 

Цитата(BuShaRt @ 10.5.2010,  23:08)
Для начал забудьте раз и на всегда о идее перечислять в базе данных данные в поле через запятую - это не профессионализм высшей степени.


Хорошо. Буду знать.

Цитата(BuShaRt @ 10.5.2010,  23:08)
В остальном Вы близке к истине. Нам понадобиться таблица "bookmark", у нее будет 3 поля id_bookmark, id_users, id_new (уникальные номера закладки, пользователя, статьи соответственно).


Написал код, который вносит выбранные статьи в таблицу закладок (ниже прикрепленного кода опишу появившиеся недочеты, которые решить я так и не смог):

Небольшие уточнения:

1. Есть две таблицы:

a. bookmark (id_bookmark(int(30)), id_user(int(30)), id_news(int(30)))
b. news (id(int(30)), name(varchar(255)), ... остальные поля)

2. $dbcnx - соединение с DB;

Код

if( isset( $_COOKIE['nickname'] ) ) {
    $nickname = $_COOKIE['nickname'];
}


$sel_member = "SELECT id FROM members WHERE name = '{$nickname}'";
    $res_member = mysql_query($sel_member, $dbcnx);
    $member_id = mysql_fetch_array($res_member);
    // Получаем id_пользователя
    $id_user = $member_id['id'];
    
        $sel_news = "SELECT * FROM news ORDER BY id DESC";
        $res_news = mysql_query($sel_news, $dbcnx);
        while($sql_row = mysql_fetch_array($res_news)) {
            echo "" . $sql_row['name'] . "";
            echo "<br /><br />";
            if(isset($id_user)) {
                // Проверка: если id с выбранной статьей уже найдена в поле "id_new" таблицы "bookmark", показывать ссылку "Удалить из закладок",
                // иначе ссылку "Добавить в закладки"
                if( /**/ ) {
                    echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?do=del&amp;id=" . $sql_row['id'] . "\">Удалить из закладок</a>";
                } else {
                    echo "<a href=\"" . $_SERVER['PHP_SELF'] . "?do=add&amp;id=" . $sql_row['id'] . "\">Добавить в закладки</a>";
                }
            }
            echo "<br /><br />";
        }

    if(isset($_REQUEST['add'])) {
        $add = $_REQUEST['add'];
    } else {
        $add = "";
    }
        
    if(isset($add) == "add") {
        if(isset($_GET['id'])) {
            $id = intval($_GET['id']);
            $sql = "INSERT INTO bookmark (id_bookmark, id_user, id_new) VALUES (NULL, '{$id_user}', '{$id}')";
            $sql_res = mysql_query($sql, $dbcnx);
        } else {
            $id = "";
        }
    }
    
    // ВЫВОД ЗАКЛАДОК:
    
    $sel_fav = "SELECT news.name FROM news,bookmark WHERE news.id = bookmark.id_new AND bookmark.id_user = '{$id_user}'";
    $res_fav = mysql_query($sel_fav, $dbcnx);
    while($row_fav = mysql_fetch_array($res_fav)) {
        echo $row_fav['name'];
        echo "<br />";
    }


По этому коду, закладки без проблем добавляются в таблицу "bookmark". Хотя, может есть какие-либо кривые моменты...
        
Затруднения у меня вот на каких этапах:

1. Не могу понять, каким образом осуществить проверку на предмет того, существует ли в поле "id_new" id той статьи, которую хотим добавить в закладки? С тем, чтобы выводить соответствующую ссылку - если id в поле "id_new" совпадает с id выбранной статьи, вывести "Удалить из закладок", иначе "Добавить в закладки". Т.к. после нажатия "Добавить в закладки", ссылка не изменяется на "Удалить из закладок".

2. После того, как закладка добавлена - перезагружаю страницу, а выбранная статья вновь помещается в таблицу "bookmarks", ибо в адресной строке браузера все время показывает, как ...index.php?do=add&id=1 (к примеру). И так до бесконечности - 10 раз перезагружаешь, 10 раз добавляется одна и та же статья.

Цитата(BuShaRt @ 10.5.2010,  23:08)
Когда Вы будете писать скрипт вывода закладок определенного пользователя, Вам понадобиться построить сложный SQL запрос объединяющей таблицы bookmark и new с выборкой только по определенному значению поля id_users.

О объеденение таблиц.


Спасибо. Статью прочел несколько раз, но, честно говоря, практически ничего из нее не понял. Благодаря ей, поискал в сети несколько статей о LEFT JOIN, RIGHT JOIN, INNER JOIN. И там же наткнулся на один из способов связки двух таблиц (применил ее в своем коде). Во всяком случае работает, хотя, незнаю, правильно ли делать выборку тем образом, что я представил на примере? Как Вы считаете?

Цитата(BuShaRt @ 10.5.2010,  23:08)
Возможно я мог не правильно оценить глубину вопроса, но боюсь, что если вопрос куда более сложный, то Вам стоит почитать литературу т.к. работа с AJAX предполагает хотя бы средние навыки работы с php, mysql, javascript и как следствие понимание DOM.


С Ajax'ом решил пока повременить. Врядли сейчас я его смогу потянуть. Но изучать обязательно буду...

Цитата(NewDima @ 11.5.2010,  05:24)
Задача тривиальна. С jquery будет так
В ссылке прописываем id в href для роутера (если яваскрипт будет отключен, обрабатываем на стороне сервера и выплюнем результат). И устанавливаем атрибут id в ней же для функции.
Все.
P.S. Может где какая помарка, писал на коленке


Спасибо! Вместо строки "this-script-address/toggle/1" вписывается урл-странички?

Обязательно изучу подробнее, сразу же после того, как "разделаюсь" с php-кодом...  smile 

Это сообщение отредактировал(а) Valdo - 11.5.2010, 14:52
PM MAIL   Вверх
NewDima
Дата 11.5.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Valdo, во-первых, сделайте естественный ключ из идентификатора пользователя и идентификатора новости, тогда добавить вторично не получится.
Во-вторых, хотя-бы вынесите часть, отвечающую за добавление закладки в другой файл, самому же удобнее будет.
В-третьих, когда передаете параметр do, сделайте все, что требуется, приняв его. А дальше выбросьте заголовок
Код

header('location: index.php');

и прекратите выполнение скрипта (die). Тогда не будет проблем с повторным обращением с теми же параметрами.

А вообще для лучшей структуризации хорошо было бы познакомиться с оператором выбора switch.
P.S. в коде много комментировать
PM ICQ   Вверх
Valdo
Дата 12.5.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Цитата(NewDima @ 11.5.2010,  16:57)
Valdo, во-первых, сделайте естественный ключ из идентификатора пользователя и идентификатора новости, тогда добавить вторично не получится.
Во-вторых, хотя-бы вынесите часть, отвечающую за добавление закладки в другой файл, самому же удобнее будет.
В-третьих, когда передаете параметр do, сделайте все, что требуется, приняв его. А дальше выбросьте заголовок
Код

header('location: index.php');

и прекратите выполнение скрипта (die). Тогда не будет проблем с повторным обращением с теми же параметрами.

А вообще для лучшей структуризации хорошо было бы познакомиться с оператором выбора switch.
P.S. в коде много комментировать


Большое спасибо за рекомендации! Постарался все учесть. Вот, что в итоге получилось:

Файл: index.php

Код

// Tables:

// bookmark (id_bookmark(int(30))(auto_increment)), id_user(int(30)), id_news(int(30)))
// articles (id(int(30))(auto_increment)), name(varchar(255)), ... остальные поля)

// $dbcnx - соединение с базой данных

if( isset( $_COOKIE['nickname'] ) ) {
    $nickname = $_COOKIE['nickname'];
}

// Выбираем из таблицы с пользователями (members) id пользователя
$sel_member = "SELECT id FROM members WHERE name = '{$nickname}'";
$res_member = mysql_query($sel_member, $dbcnx);
$member_id = mysql_fetch_array($res_member);
// Получаем id_пользователя
$id_user = $member_id['id'];

// Выбираем все поля из таблицы статей
$sel_art = "SELECT * FROM articles ORDER BY name DESC";
$res_art = mysql_query($sel_art, $dbcnx);
// Выводим краткое описание статей в цикле (в качестве примера, выводим лишь наименования)
while($row_art = mysql_fetch_array($res_art)) {
    echo "" . $row_art['name'] . "";
    echo "<br /><br />";
    // Если статьи просматривает зарегистрированный пользователь - выводим ссылки на добавления/удаления из закладок
    if(isset($id_user)) {
        // Проверка: если id с выбранной статьей уже найдена в поле "id_new", показывать ссылку "Удалить из закладок",
        // иначе ссылку "Добавить в закладки"
        if(/**/) {
            echo "<a href=\"bookmark.php?action=remove_bookmark&amp;id=" . $row_art['id'] . "\">Удалить из закладок</a>";
        } else {
            echo "<a href=\"bookmark.php?action=add_bookmark&amp;id=" . $row_art['id'] . "\">Добавить в закладки</a>";
        }
    }
    echo "<br /><br />";
}
    
// Ссылка в раздел "Мои закладки"
echo "<br />";
echo "<a href=\"my_bookmarks.php\">Мои закладки</a>";
echo "<br /><br />";


Файл: bookmark.php

Код

if( isset( $_COOKIE['nickname'] ) ) {
    $nickname = $_COOKIE['nickname'];
}

// Выбираем из таблицы с пользователями (members) id пользователя
$sel_member = "SELECT id FROM members WHERE name = '{$nickname}'";
$res_member = mysql_query($sel_member, $dbcnx);
$member_id = mysql_fetch_array($res_member);
// Получаем id_пользователя
$id_user = $member_id['id'];

// В зависимости от действия (нажатия на ссылку "Добавить" либо "Удалить" закладки), выводим необходимую функцию

switch($_GET['action']) {

    case "add_bookmark": {
        AddItem($_GET['id'], $id_user);
        break;
    }
    case "remove_bookmark": {
        RemoveItem($_GET['id']);
        break;
    }
}

// Функция AddItem добавляет выбранную статью в закладки
function AddItem($ItemId, $id_user) {
        // $dbcnx - результат соединения с базой данных
        global $dbcnx;
        // Выбираем все поля из таблицы закладок (bookmark)
        $sel_bookmarks = "SELECT * FROM bookmark WHERE id_new = '{$ItemId}' AND id_user = '{$id_user}'";
        $res_bookmarks = mysql_query($sel_bookmarks, $dbcnx);
        $rows_bookmarks = mysql_num_rows($res_bookmarks);
        $numRows = $rows_bookmarks;
        
        // Если, в таблице "bookmark" не существует строки, в поле "id_new" которой содержится id выбранной статьи - вносим id
        // выбранной статьи в таблицу "bookmark"
        if($numRows == 0) {
            $add_bookmark = "INSERT INTO bookmark (id_bookmark, id_user, id_new) VALUES (NULL, '{$id_user}', '{$ItemId}')";
            $res_add_bookmark = mysql_query($add_bookmark, $dbcnx);
            // Если не удалось внести статью в закладки - выводим ошибку, иначе редиректимся на предыдущую страницу
            // (в данном случае, "index.php")
            if(!$res_add_bookmark) {
                exit("ERROR!");
            } else {
                header("Location: index.php");
                exit();
            }
            // Если id выбранной статьи уже лежит в закладках (в поле "id_new"), редиректимся на предыдущую страницу
            // (в данном случае, "index.php")
        } else {
            header("Location: index.php");
            exit();
        }
    }
    
// Функция AddItem удаляет выбранную статью из закладок 
function RemoveItem($ItemId) {
    global $dbcnx;
    $remove_bookmark = "DELETE FROM bookmark WHERE id_new = '{$ItemId}'";
    $res_remove_bookmark = mysql_query($remove_bookmark, $dbcnx);
    // Если удаление статьи прошло успешно - редиректимся на предыдущую страницу (в данном случае, "index.php")
    if(isset($res_remove_bookmark)) {
        header("Location: index.php");
        exit();
    }
}


Файл: my_bookmarks.php

Код

// Получаем id пользователя
if(isset($_COOKIE['nickname'])) {
    $nickname = $_COOKIE['nickname'];
    $sel_members = "SELECT id FROM members WHERE name = '$nickname'";
    $res_members = mysql_query($sel_members, $dbcnx);
    $row = mysql_fetch_array($res_members);
    $id_user = $row['id'];
}
    
// Выбираем все, внесенные в закладки, статьи
$sel_bookmarks = "SELECT articles.name FROM articles,bookmark WHERE articles.id = bookmark.id_new AND id_user = '{$id_user}'";
$res_bookmarks = mysql_query($sel_bookmarks, $dbcnx);
while($row_bookmarks = mysql_fetch_array($res_bookmarks)) {
    echo $row_bookmarks['name'];
    echo "<br />";
}


Код работает. Код, отвечающий за добавление закладок, вывел в отдельный файл. После выполнения кода, происходит редирект на страницу статей. Проблема с повторным добавлением закладок успешно решена!  smile 

Остается всего лишь одна загвоздка - это решить, что прописывать в условии if, в зависимости от которого выводить соответствующую ссылку: "Добавить в закладки" либо "Удалить из закладок". Двое суток уже ломаю голову, но так ни к чему и не пришел...

Прошу помочь с рекомендациями, напутствиями, если есть таковая возможность. Заранее спасибо!  smile 

Это сообщение отредактировал(а) Valdo - 12.5.2010, 15:19
PM MAIL   Вверх
Valdo
Дата 13.5.2010, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Пришел к способу, при котором изменяются ссылки на добавление/удаление закладок. Но чую, что этот вариант подходит менее всего:

Код

// Выбираем все поля из таблицы статей 
$sel_art = "SELECT * FROM articles ORDER BY name DESC"; 
$res_art = mysql_query($sel_art, $dbcnx); 
// Выводим краткое описание статей в цикле (в качестве примера, выводим лишь наименования) 
while($row_art = mysql_fetch_array($res_art)) { 
    echo "" . $row_art['name'] . ""; 
    echo "<br /><br />"; 
    // Если статьи просматривает зарегистрированный пользователь - выводим ссылки на добавления/удаления из закладок 
    if(isset($id_user)) { 
        $sel_bookmarks = "SELECT * FROM bookmark WHERE id_user = '{$id_user}' AND id_new = '{$row_art['id']}'"; 
        $res_bookmarks = mysql_query($sel_bookmarks, $dbcnx); 
        $num_bookmarks = mysql_num_rows($res_bookmarks); 
        if($num_bookmarks == 0) { 
            echo "<a href=\"bookmark.php?action=add_bookmark&id=" . $row_art['id'] . "\">Добавить в закладки</a>"; 
        } else { 
            echo "<a href=\"bookmark.php?action=remove_bookmark&id=" . $row_art['id'] . "\">Удалить из закладок</a>"; 
        } 
    } 
    echo "<br /><br />"; 
}


Думаю, этот способ проверки не пригоден, т.к .запрос к базе идет при каждом выполнении цикла. Будут выбраны 100 статей - будет 100 раз выполняться один и тот же запрос. Но работает лишь этот способ. Или я смотрю совсем не в том направлении... ((

PM MAIL   Вверх
NewDima
Дата 13.5.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



хм, сейчас тестить на не чем будет, думаю как-то так запрос составить нужно:
Код

(
SELECT * , 1 AS added
FROM `articles`
WHERE `id`
IN (

SELECT `article`
FROM `bookmarks`
WHERE `user` = $userId
)
)
UNION (

SELECT * , 0 AS added
FROM `articles`
WHERE `id` NOT
IN (

SELECT `article`
FROM `bookmarks`
WHERE `user` = $userId
)
)
ORDER BY `id` 

Попробуйте например так, хотя можно наверное и упростить.
P.S. Здесь три таблицы: users(id, name), articles(id, title), boolmarks(user, article).
PM ICQ   Вверх
Valdo
Дата 13.5.2010, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Цитата(NewDima @ 13.5.2010,  13:02)
хм, сейчас тестить на не чем будет, думаю как-то так запрос составить нужно:

Попробуйте например так, хотя можно наверное и упростить.
P.S. Здесь три таблицы: users(id, name), articles(id, title), boolmarks(user, article).


Большое Вам спасибо за помощь на протяжении темы! Попробовал вариант с запросом - ничего не вышло. Вернее, моих знаний на данный момент времени, в полной мере не хватает, чтобы правильно примерить данный запрос к своему коду. Как ни крутил - безрезультатно (с этих пор, приступаю к более углубленному изучению mysql). 

Несмотря на это, задачу с выводом корректной ссылки успешно решена (эх, долго я корпел над ней)!  smile 

Вот окончательный вариант страницы "index.php":

Код

if( isset( $_COOKIE['nickname'] ) ) { 
    $nickname = $_COOKIE['nickname']; 
} 

// Выбираем из таблицы с пользователями (members) id пользователя 
$sel_member = "SELECT id FROM members WHERE name = '{$nickname}'"; 
$res_member = mysql_query($sel_member, $dbcnx); 
$member_id = mysql_fetch_array($res_member); 
// Получаем id_пользователя 
$id_user = $member_id['id']; 

$sel_bookmarks = "SELECT * FROM bookmark WHERE id_user = '{$id_user}'"; 
$res_bookmarks = mysql_query($sel_bookmarks, $dbcnx); 
$Nums = mysql_num_rows($res_bookmarks); 
if($Nums != 0) { 
    while($row = mysql_fetch_row($res_bookmarks)) { 
        $list[] = $row; 
    } 
     
    $fav_arr = array(); 
    foreach($list as $bookmarks) { 
        // В массив $fav_arr заносим лишь значения полей "id_new" (в них id выбранных статей) 
        $fav_arr[] = $bookmarks['2']; 
    } 
} 

// Выбираем все поля из таблицы статей 
$sel_art = "SELECT * FROM articles ORDER BY id DESC"; 
$res_art = mysql_query($sel_art, $dbcnx); 
// Выводим краткое описание статей в цикле (в качестве примера, выводим лишь наименования) 
while($row_art = mysql_fetch_array($res_art)) { 
    echo "" . $row_art['name'] . ""; 
    echo "<br /><br />"; 
    // Если статьи просматривает зарегистрированный пользователь - выводим ссылки на добавления/удаления из закладок 
    if(isset($id_user)) { 
        // Проверяем, если в массиве не существует id данной статьи - выводим ссылку "Удалить из закладок", 
        // иначе "Добавить в закладки" 
        if((!isset($fav_arr)) or (!in_array($row_news['id'], $fav_arr))) { 
            echo "<a href=\"bookmark.php?action=add_bookmark&id=" . $row_art['id'] . "\">Добавить в закладки</a>"; 
        } else { 
            echo "<a href=\"bookmark.php?action=remove_bookmark&id=" . $row_art['id'] . "\">Удалить из закладок</a>"; 
        } 
    } 
    echo "<br /><br />"; 
}


NewDima, BuShaRt Еще раз спасибо!  smile 

PS. Форум отличный! Недавно посещаю и впредь он станет для меня настольным!



Это сообщение отредактировал(а) Valdo - 13.5.2010, 21:06
PM MAIL   Вверх
BuShaRt
Дата 15.5.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1391
Регистрация: 29.6.2006

Репутация: 4
Всего: 6



Цитата(Valdo @  13.5.2010,  21:05 Найти цитируемый пост)
с этих пор, приступаю к более углубленному изучению mysql

MySQL. Учебное пособие. Люк Веллинг и Лора Томсон - шикарная книга для начинающих, лучшая, что я видел не только про MySQL, а вообще из учебников.
PM MAIL   Вверх
Valdo
Дата 20.5.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Цитата(BuShaRt @ 15.5.2010,  12:45)
MySQL. Учебное пособие. Люк Веллинг и Лора Томсон - шикарная книга для начинающих, лучшая, что я видел не только про MySQL, а вообще из учебников.


Спасибо! Буду искать...  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0618 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.