Добавяне/премахване на любими от потребител

vinsbg

Registered
Здравейте,

искам да направя, когато един потребител се е логнах на снимка, видео, пост и т.н. да има един бутон 'Добави в любими'. Съответно, когато потребителя натисне 'Добави в любими' да бъде добавяне към този потребител, така че, когато си влезе после в пробила да може да вижда всичко добавено в любими.

Имам таблица POST и таблица USERS. За целта добавих нова таблица, която да държи фаворитите.
Таблица favorites с полета - user_id и item_id.
По този начин показвам бутона за добавяне на фаворитите, когато потребителя е логнат.
Код:
if(!empty($_SESSION['user'])) 
{                                    
      echo '
                <div class="buttons">    
                       <div class="count">Прегледи: '.$row['image_hits'].'</div>                      
                       <a href="#" class="bookmarked has-tooltip" data-title="Добави в любими" id="'.$row['image_id'].'"></a>                                                          
                </div>';
}
else {
       echo '
                  <div class="buttons">                                       
                        <div class="count">Прегледи: '.$row['image_hits'].'</div>
                   </div>';                                   
}
Така на снимката вече има бутон за добавяне, който държи id-то на снимката. Предполагам трябва да взема и id-то на потребителя?

След това ajax-a ( не съм сигурен, че е правилен... малко ми е "тъмна индия" все още ajax-a :) )
Код:
$(document).ready(function(){
    $('.bookmarked', $('.buttons')).click(function(){
        var id = $(this).attr('id');
        $.ajax({
          type: "POST",
          url: "favorites.php",
          data: { image_id: image_id }
        }).done(function( msg ) {
          alert( "Добавено в любими: " + msg );
        });
    });
});
Сега въпросите са ми -

1. Как да взема и къде да добавя user_id. Още при логване да запазвам user_id в сесията и да го предавам и него ли? Къде да го добавя в бутона?

2. Примерен код в favorites.php за инсъртване в таблицата favorites.

3. Заявка за изкарване на всички фаворити, които има потребителя, когато си влезе в профила( profile.php )

Блгагодаря!

edit:
Драснах набързо това и при натискане на бутона изкарва съобщение, че е добавено, но в базата няма нищо добавено..
Код:
if(!empty($_POST["image_id"]) && !empty($_SESSION['user_id'])) {
    include 'misc/database.inc.php';
    error_reporting(E_ALL); 
    ini_set('display_errors', 1);
    $pdo = Database::connect();   
    
    	$image_id = $_POST['image_id'];        	   
    	$user_id = $_SESSION['user_id'];
    	    			   
    	$query = $pdo -> prepare("INSERT INTO favorites (image_id,user_id)
                                VALUES (:image_id, :user_id)");   
        $query -> execute(array(
                          ":image_id"          => $image_id,
                          ":user_id"          => $user_id
        ));       
    Database::disconnect();    
}
 
Трябва да се научиш да дебъгваш, по-лесно ще ти е :?:- var_dump($_POST) и т.н...., :) че такива грешки трудно се намират. Мисля, че все пак открих едно typo:

var id = $(this).attr('id');
$.ajax({
type: "POST",
url: "favorites.php",
data: { image_id: image_id }
}).done(function( msg ) {
alert( "Добавено в любими: " + msg );
});

Ето ти един по-опростен вариант на горното:

[js]$.post('favorites.php', { image_id: $(this).attr('id') }, function (data) {
alert('Добавено в любими.');
});[/js]
 
anonimen каза:
Научи се да дебъгваш, по-лесно ще ти е - var_dump($_POST) и т.н...., :) че такива грешки трудно се намират. Мисля, че все пак открих едно typo:

var id = $(this).attr('id');
$.ajax({
type: "POST",
url: "favorites.php",
data: { image_id: image_id }
}).done(function( msg ) {
alert( "Добавено в любими: " + msg );
});
Да, това го оправих .. аз също забелязах. Но проблема остава, а в конзолата няма нищо .. няма грешки.


След if(!empty...) добавих един else и сложих в него var_dump-a, за да видя, какво връща..
var_dump($_POST) - връща array(0)

edit:
Благодаря за опростяването.
 
След execute-то сложи някво echo $pdo->lastInsertId(); и $stmt->rowCount()
И се увери, че имаш
PHP:
$pod->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
Нищо не изкарва - нито в конзолата някаква грешка, нито var_dump, нито $pod->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); ... нищо.

Освен alert-a, че е успешно добавено, но базата е празна. Пробвах да махна $_SESSION['user_id']; от favorites.php тъй като не съм сигурен как точно да го подавам и остана само $_POST['image_id'] .. същата работа.

едит:
Добавих console.log(data); при алерта и сега в конзолата излезе

Код:
array(1) {
  ["image_id"]=>
  string(4) "2717"
}

Махнах $_SESSION['user_id'] от цялата картинка и добави image_id в базата..
т.е. сега остава въпроса за user_id-то
 
Чакай, чакай, съвсем си се объркал :D:D С налучкване няма да стане :)0

1. Login -> запазваш $_SESSION['user_id']

2. Картинка -> показваш like-бутона

3. Цъкаш like-бутон -> POST към add_to_favorites.php с image_id

4. В add_to_favorites правиш insert into favorites ($_POST['image_id'], $_SESSION['user_id'])
 
Да, искам да запазя в базата данни id-то на снимката и id-to на потребителя.. за да мога после с един селект да покажа в профила на потребителя всички снимки, които са в любимите му.

Само да добавя, че при успешен лог на потребителя правя така
Код:
if($login_ok) 
        { 
            $_SESSION['user'] = $row;
}

Запазвам всичко за този потребител в $_SESSION['user'] ...

И в точка. 3 от твоите предполагам, че освен image_id трябва да дам и $_SESSION['user'] на аякса или ?
 
vinsbg каза:
Да, искам да запазя в базата данни id-то на снимката и id-to на потребителя.. за да мога после с един селект да покажа в профила на потребителя всички снимки, които са в любимите му.

Само да добавя, че при успешен лог на потребителя правя така
Код:
if($login_ok) 
        { 
            $_SESSION['user'] = $row;
}

Запазвам всичко за този потребител в $_SESSION['user'] ...
Явно това ще да е бил проблема - в сесията запазваш масив с цялата информация и се опитваш да го insert-неш в mysql поле - не става :)
В insert-a го направи да записва ID-то на юзера, а не всичко :?:
 
anonimen каза:
vinsbg каза:
Да, искам да запазя в базата данни id-то на снимката и id-to на потребителя.. за да мога после с един селект да покажа в профила на потребителя всички снимки, които са в любимите му.

Само да добавя, че при успешен лог на потребителя правя така
Код:
if($login_ok) 
        { 
            $_SESSION['user'] = $row;
}

Запазвам всичко за този потребител в $_SESSION['user'] ...
Явно това ще да е бил проблема - в сесията запазваш масив с цялата информация и се опитваш да го insert-неш в mysql поле - не става :)
В insert-a го направи да записва ID-то на юзера, а не всичко :?:
Така ли да трябва да се вземе само ID-то от масива - $_SESSION['user']['id'] ?
Пробвах така, но без успех отново. consle.log продължава да връща само снимката...
Код:
array(1) {
  ["image_id"]=>
  string(4) "1210"
}
Пак да питам към favorites.php не трябва ли да се подаде и сесията с user_id-то освен на снимката?
 
Не, не трябва. Сесията я имаш винаги, а картинката се променя. Никога не пращай по този начин ид-то на юзера през ajax-a! Защото ако аз изпълня тази заявка мога да добавям на всеки юзер в "любими".
 
Кой знае какво е дребно и ме дразни много, но не става.. Как ли не го въртях. Това е текущия сорс на favorites.php
Код:
if(!empty($_POST["image_id"]) && !empty($_SESSION['user'])) {
    include 'database.inc.php';
    error_reporting(E_ALL); 
    ini_set('display_errors', 1);
    $pdo = Database::connect();   
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
    	$item_id = $_POST['image_id'];        	   
    	$_SESSION['user']['id'] = $_SESSION['user'];
    	    			   
    	$query = $pdo -> prepare("INSERT INTO favorites (item_id, user_id)
                                VALUES (:item_id, :user_id)");   
        $query -> execute(array(
                          ":item_id"         => $_POST['image_id'],
                          ":user_id"          => $_SESSION['user']['id']
        ));       
        
    Database::disconnect();    
}
Какво пропускам?
 
За по-лесен дебъг във favorites смени _POST на _GET и дебъгвай през url-то:

http://localhost/favorites.php?image_id=5#някво съществуващо id

А сега нещо много очевидно:

$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Ако Database::connect връща pdo обект, ок. Но ако връща инстанция на Database - откъде идва setAttribute?
 
Усетих се, че session_start() е добавен в database.inc.php, който е инклуднат във всяка страница. А в favorites съм го инклуднал, след като се опитам да използвам сесията в IF-a ... уви и това не реши проблема.

Пробвах с гет, както спомена и получавам следното
Notice: Array to string conversion in /var/www/html/misc/favorites.php on line 17
line 17:
Код:
        $query -> execute(array(
                          ":item_id"         => $_GET['image_id'],
                          ":user_id"          => $_SESSION['user']['id']
        )); [color=red]<----[/color]
Е добре с един print_r на $_SESSION['user']['id'] връща цялата информация за потребителя .. всместо само id-то.
 
В случая имаш само два параметъра, ще се опрости ако използваш номерирани placeholder-и:

PHP:
$query = $pdo -> prepare("INSERT INTO favorites (item_id, user_id) 
                                VALUES (?, ?)");    
$query->execute([$_GET['image_id'], $_SESSION['user']['id']]);

И все пак виж дали $_SESSION['user']['id'] е число...

едит - сега видях промяната горе. Значи проблемът ти е в логина :)
 
login.php
Код:
    require("database.inc.php");  
    $pdo = Database::connect();
    if(!empty($_POST)) 
    { 

        $query = " 
            SELECT 
                * 
            FROM users             
            WHERE 
                username = :username 
        "; 
         
        $query_params = array( 
            ':username' => $_POST['username'] 
        ); 
         
        try 
        { 
            $stmt = $pdo->prepare($query); 
            $result = $stmt->execute($query_params); 
        } 
        catch(PDOException $ex) 
        { 
            die("Failed to run query: " . $ex->getMessage()); 
        } 
          
        $login_ok = false; 
        $row = $stmt->fetch(); 
        if($row) 
        { 
            $check_password = hash('sha256', $_POST['password'] . $row['salt']); 
            for($round = 0; $round < 65536; $round++) 
            { 
                $check_password = hash('sha256', $check_password . $row['salt']); 
            } 
             
            if($check_password === $row['password']) 
            { 
                $login_ok = true; 
            } 
        } 
        if($login_ok) 
        { 
            unset($row['salt']); 
            unset($row['password']); 

            $_SESSION['user'] = $row; 

            header("Location: index.php"); 
        } 
        else 
        { 
           print("При опита за вход възникна проблем. Моля, опитайте отново."); 
        } 
    }
Ако имаше проблем с логин-а нямаше ли да е изцяло в смисъл изобщо да не може да се логне в системата?
 
vinsbg каза:
Taка стана
Код:
$id = $_SESSION['user'][0];
вместо
Код:
$id = $_SESSION['user']['id'];
Е няма откъде да знаем какво имаш в _SESSION['user']. Ти каза, че $_SESSION['user']['id'] дава цялата информация.

А най-добре вместо да се мъчиш с разни глобални променливи да си направиш един class User и от него да си дърпаш информацията :?:
 
Така май наистина ще е най-добре.
Ще пробвам да го преправя.

Благодаря за помощта! :?:
 

Back
Горе