[PHP/JavaScript] PHP uitvoeren na Javascript "onClick()"

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Ik heb een filmdatabase gemaakt die gebaseerd is op IMDB, zie *snip*:)

Bij het toevoegen van een film wordt het cijfer dat de film op IMDB krijgt in mijn databae opgeslagen. Dit cijfer verandert natuurlijk voortdurend aangezien mensen op films kunnen stemmen op IMDB.

Ik zou nu willen dat het IMDB cijfer geupdated wordt in mijn database wanneer mensen een film "uitklappen". Dit uitklappen gebeurt met behulp van JavaScript. Wat ik dus wil is een PHP functie aanroepen mbv van JavaScript die opnieuw IMDB informatie ophaalt en deze verandert in mijn database.

Ik heb al even zitten Googelen en dit lijkt niet zo simpel mogelijk aangezien PHP serversided is en JS clientsided. Toch lijkt me Ajax ook niet helemaal wat ik wil (toch?). Iemand die me op weg kan helpen ;)

[ Voor 1% gewijzigd door Creepy op 07-03-2010 20:46 . Reden: ontspammed ;) ]


Acties:
  • 0 Henk 'm!

  • HendrikN
  • Registratie: Februari 2007
  • Laatst online: 20:16
Het aanspreken van een php-script (met een GET-variabele) door middel van een simpele AJAX-call vanuit JS is precies wat je nodig hebt, denk ik?

http://example.com/getImdbCijfer.php?film=103 bijvoorbeeld? Dit script zou dan heel simpel in plain-text bijvoorbeeld het cijfer kunnen echo'en.

[ Voor 33% gewijzigd door HendrikN op 07-03-2010 18:37 ]


Acties:
  • 0 Henk 'm!

  • Miyamoto
  • Registratie: Februari 2009
  • Laatst online: 00:21
The Write Less, Do More, JavaScript Library

click load

Noem het een overkill voor hetgeen je nu wellicht wilt, maar het werkt wel meteen cross-browser en is gemakkelijk aan te passen en uit te breiden.

Acties:
  • 0 Henk 'm!

  • Luqq
  • Registratie: Juni 2005
  • Laatst online: 12-09 14:10
Je kan gewoon via $.get() in jquery een URL aanroepen, en die aan een .click binden (wel even wrappen binnen een functie).

Acties:
  • 0 Henk 'm!

  • BCC
  • Registratie: Juli 2000
  • Laatst online: 23:33

BCC

AJAX is precies wat jij wil: een call doen vanuit javascript naar een serverside resource.
Graag wel POST gebruiken in plaats van GET. Om bijvoorbeeld te voorkomen dat de google bot al je films gaat beoordelen.

[ Voor 74% gewijzigd door BCC op 07-03-2010 19:17 ]

Na betaling van een licentievergoeding van €1.000 verkrijgen bedrijven het recht om deze post te gebruiken voor het trainen van artificiële intelligentiesystemen.


Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Bedankt voor jullie reacties! Het is gelukt met XMLHTTPRequest. Zie de onderstaande code. Maak me eigenlijk wel een beetje zorgen om de beveiliging. Volgens mij kan nu ieder script posten naar update_imdb.php waardoor er iets geupdate wordt in mijn database. Lijkt me niet echt de bedoeling ;)


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var xmlhttp;

function updateScore(movieID, movieURL) {
    xmlhttp = GetXmlHttpObject();
    
    if (xmlhttp == null) {
        alert ("Browser does not support HTTP Request");
        return;
    }
    
    var page = "update_imdb.php";
    var params = "id=" + movieID + "&url=" + movieURL;
    xmlhttp.open("POST", page, true);

    //Send the proper header information along with the request
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    xmlhttp.setRequestHeader("Content-length", params.length);
    xmlhttp.setRequestHeader("Connection", "close");
    xmlhttp.send(params);   
}

function GetXmlHttpObject() {
    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        return new XMLHttpRequest();
    }
    
    if (window.ActiveXObject) {
        // code for IE6, IE5
        return new ActiveXObject("Microsoft.XMLHTTP");
    }
    
    return null;
}

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

require_once "inc_connect_mysql.php";
require_once "inc_functions.php";

if (isset($_POST['id']) && isset($_POST['url'])) {
    $movieID = (int)$_POST['id'];
    $movieURL = addslashes($_POST['url']);
    
    // Filminformatie ophalen
    $movieInfo = getMovieInfo($movieURL);
    
    if ($movieInfo !== false) {
        $newRating = $movieInfo['rating'][0].$movieInfo['rating'][2];
        
        if(is_numeric($newRating)) {
            $updateMovie = "UPDATE `movies` SET `imdbscore` = {$newRating} WHERE `id` = {$movieID} LIMIT 1";
            $excQuery = mysql_query($updateMovie);
        }
    }
}

?>

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Het enige wat ik zou veranderen is dat ik clientside enkel een id zou versturen, in php dan de movie-url erbij zoeken.
Zodat niet iedereen een willekeurige rating van een movieurl aan een id kan koppelen, maar voor de rest zie ik geen probleem.

Als je dat geimplementeerd hebt dan is het ergste wat er kan gebeuren dat iemand je server aanroept om iets elders te gaan verversen, en dat iets te vaak ( wat weer kan leiden tot een ban van imdb oid ). Maar voor de rest zie ik er geen misbruikmogelijkheid in.

En die ene misbruikmogelijkheid is ook vrij simpel te ondervangen door als je toch de movieurl gaat ophalen uit je dbase dan ook even een lastupdated timestamp op te halen en als die minder dan een uur geleden was dan geen getMovieInfo en geen update query uitvoeren ( geen idee hoe vaak een rating op imdb verandert, maar 1x per uur lijkt me erg veel )

Acties:
  • 0 Henk 'm!

Verwijderd

Hoe is het mogelijk om cijfers van films uit IMDB rechtstreeks in je eigen site te verwerken?

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Verwijderd schreef op zondag 07 maart 2010 @ 21:24:
Hoe is het mogelijk om cijfers van films uit IMDB rechtstreeks in je eigen site te verwerken?
Simpelste manier, screenscraping / html uitlezen via curl / fopen oid.

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Er zijn ook hobbyisten die zelf een API ontwikkeld hebben: o.a. http://www.deanclatworthy.com/imdb/

Acties:
  • 0 Henk 'm!

  • Rvanlaak
  • Registratie: Juni 2005
  • Laatst online: 18-08 11:59
Je wil iedere keer dat een film word bekeken het cijfer updaten?! Lijkt me een beetje overkill eigenlijk. Naar mijn idee is een cronjob eerder wat je zoekt, welke dan alle cijfers update. Kun je de functionaliteit lekker aan de PHP kant houden en zit je ook niet met je security issues.

Verder zou ik persoonlijk ook eens een zoektocht beginnen naar een API zoals mcdronkz zegt. Binnenkort wil je vast nog meer van IMDB afhalen en zit je weer met hetzelfde probleem. Die APIs zullen daar vast wel een oplossing voor hebben.

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
Rvanlaak schreef op zondag 07 maart 2010 @ 22:29:
Je wil iedere keer dat een film word bekeken het cijfer updaten?! Lijkt me een beetje overkill eigenlijk. Naar mijn idee is een cronjob eerder wat je zoekt, welke dan alle cijfers update. Kun je de functionaliteit lekker aan de PHP kant houden en zit je ook niet met je security issues.
Het is allebei geen ideale oplossing, maar de jouwe lijkt me nog het minst ideaal omdat je dan op gezette tijden voor iedere film - en dat kunnen er best veel worden - een request naar de IMDB site (of API) moet gaan doen.

Zeker wanneer z'n site niet zo druk bezocht wordt, is het voordeliger om het cijfer on-the-fly op te vragen. Je zou ook in je database een veld kunnen introduceren waarin je opslaat wanneer het cijfer voor het laatst is geupdate. Wanneer het cijfer korter dan een uur (om maar iets te noemen) in je database staat, hoef je dan geen request naar de IMDB site (of API) te doen.

Acties:
  • 0 Henk 'm!

  • monnick
  • Registratie: December 2005
  • Niet online
Ik gebruik mijn film database scraper al een redelijke poos. Ik kan je vertellen dat IMDB je gewoon voor een paar minuten weigert als je te veel requests doet. Een cron job lijkt me dus niet heel ideaal. Of je moet elke keer een wachttijd van een aantal seconden tussen de requests doen. Maar in principe is de oplossing die ik hierboven heb uitgewerkt prima :)

Zitten overigens nog wel wat bugs in mijn script na de aanpassing.
- In Chrome klapt de film niet uit (meer info) als je er op klikt
- De optie "bekijk de trailer" opent in IE niet in een popup maar in een nieuw venster

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
monnick schreef op zondag 07 maart 2010 @ 23:17:
Ik gebruik mijn film database scraper al een redelijke poos. Ik kan je vertellen dat IMDB je gewoon voor een paar minuten weigert als je te veel requests doet. Een cron job lijkt me dus niet heel ideaal. Of je moet elke keer een wachttijd van een aantal seconden tussen de requests doen. Maar in principe is de oplossing die ik hierboven heb uitgewerkt prima :)
Toch zou ik je aanraden wel iets van een last-updated time oid erin te zetten, waarna je script pas runt nadat er x tijd sinds vorige run ( voor deze film ) verstreken is.
Persoonlijk zou ik er ook nog een globale last-updated time inzetten, zodat niet 10 mensen die alle films openklappen je gelijk voor langere tijd bij imdb blockt...

Het probleem is dat imdb niet echt fan is van dit soort dingen ( en terecht ). Als er morgen 100.000 tweakers dit topic lezen en je site bezoeken dan heb je een redelijk probleem...
Of als een brakke spider je website vind dan heb je ook weer een probleem.

Altijd zo defensief mogelijk opzetten dit soort dingen is mijn motto, je hebt altijd grapjassen die anders je hobbyding verpesten. En als je zelf al tegen imdb limieten aangelopen bent...
Pagina: 1