Avatar billede rasta123 Nybegynder
26. maj 2006 - 22:59 Der er 25 kommentarer

Problemer med PHP4Flicks

Hej Alle.. Jeg har lige fundet et lækkert script inde på hotscripts.com

Det hedder php4flicks og drejer sig om en database hvor man kan tilføje sine film, og så henter den automatisk dataene fra IMDB..

Det er let at installere. Man kører bare sql filen i phpmyadmin og så ændrer de vigtige data i en fil der hedder config.php..

Der er desværre ikke meget support på det og jeg kan ikke forstå hvad jeg skal ændre i et af punkterne! Nemlig det der handling om sortering.. ASC/DESC.. Jeg kan ikke finde ud af hvad jeg skal ændre der!

Her er den øverste del af config filen:

<?
    /* 'main' configuration ******************************************************
    ** various options for the script                                          **
    ******************************************************************************/
   
    $cfg['mysql_host'] = 'localhost';      // mysql host    
   
    $cfg['mysql_user'] = 'munky_dk';          // mysql user
   
    $cfg['mysql_pass'] = 'XXXXXX';          // mysql password
   
    $cfg['mysql_db'] = 'munky_dk';            // database name
   
    $cfg['pagetitle'] = 'MunkyMovies';      // the browser window title

    $cfg['nofflicks'] = 25;                // # movies per page (main window)
   
        // default sort order; must NOT be empty! the max # of rows by which can be sorted is the size of this array.
        // ASC/DESC MUST be specified!
    $cfg['defaultsort'] = array('name ASC','nr ASC','year DESC');

        // define any number of users here; users[i][md5pass] must contain the md5-encrypted password
    $cfg['users'][0]['user'] = 'munky';
    $cfg['users'][0]['md5pass'] = 'ae681bd0b65d6f7e8e44f7894d1180b5';
       
    $cfg['version'] = 'version 0.4';

    $cfg['old_browsers'] = false;          // if set to true, javascript/DOM will not be used in the edit mode
                                            // for compatibility with older browser

----------------------------

I kan se scriptet her: www.munky.dk/movies

Det virker fint nok, men når jeg vil søge eller klikke på et bogstav så får jeg en fejlmeddelelse..

En anden fejl er også, at den ikke får fat på billederne.. Det burde også virke!

Er der nogen der kan hjælpe mig??
Avatar billede jakobdo Ekspert
27. maj 2006 - 00:32 #1
Prøv at lav en phpinfo().
Tror måske det kan skyldes magicquotes()
Avatar billede rasta123 Nybegynder
27. maj 2006 - 10:38 #2
Her er min phpinfo ang. magic quotes:

magic_quotes_gpc On On
magic_quotes_runtime Off Off
magic_quotes_sybase Off Off


Een er på og to er off.. Men ved ikke lige hvad de er hver især?

Kan det være grunden til det?
Avatar billede jakobdo Ekspert
27. maj 2006 - 10:45 #3
Prøv at se om du kan finde stedet i koden hvor linien: IN BOOLEAN MODE) ORDER BY name ASC,nr ASC,year DESC LIM er.
Måske vi kan hacke din kode, så den fungerer.
Avatar billede jakobdo Ekspert
27. maj 2006 - 10:47 #4
Se lige her: http://php4flicks.sourceforge.net/README

* please note that magic_quotes must be switched off! (php.ini: magic_qoutes = off)
      otherwise you'll get SQL error messages.
Avatar billede rasta123 Nybegynder
27. maj 2006 - 13:44 #5
ja jeg har set det!.. Men da jeg skal køre den på mit webhotel, er du umuligt for mig at ændre i min php.ini fil!.. Ihvertfald hos b-one.net.. Kender i nogen bedre, som er lige billige?

Strengen bliver sat sammen af to filer, nemlig config.php og index.php..

Ovenfor kan ses, at delen name ASC,nr ASC,year DESC kommer fra config.php

Den anden del kommer fra index.php, hvor det vigtigste vises her:

// index.php -- display main page with movie list
   
    require_once('config/config.php');
   
    // columns to be listed
    $cols = ' DISTINCT CONCAT(cat,nr)as nr,movies.name,year,runtime,medium,movies.id,fid ';
   
    // check if user is logged in
    $loggedin = false;
    if(!isset($_POST['login']) || $_POST['login'] != '0'){
        session_start();
        if(!isset($_SESSION['user'])){
            session_unset(); session_destroy();
        } else $loggedin = true;
    }
    // if loggedin is true, the logout-button instead of the login-b. are shown, but of course also additional info could be shown!

    // default query (overwritten below if filter posted)
    $query = "SELECT SQL_CALC_FOUND_ROWS $cols FROM movies ";
       
    // iff filter has been submitted, use it
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // form has been posted, page, filter and sortby[] values are present!
       
        // WHERE clause
        if(strlen($_POST['filter'])>0){
            // where clause was submitted
            // check if it is a select and not malicious SQL
            if(substr($_POST['filter'],0,38) != 'SELECT SQL_CALC_FOUND_ROWS _COLS_ FROM')
                die('don\'t try that.');
            $query = str_replace('_COLS_',$cols,$_POST['filter']);
        }
        // ORDER BY clause
        $sortsize = sizeof($_POST['sortby']);
        for($i=0; $i<$sortsize; $i++){
            $sortarray[$i] = $_POST['sortby'][$i];
            if($sortarray[$i]=='') break;
        }
        // fill rest of sort array with default values
        for($j=0; $j<$sortsize-$i; $j++){
            if(!isset($cfg['defaultsort'][$j])) break;
            $sortarray[$i] = $cfg['defaultsort'][$j];
            $i++;
        }
        $sortsize = sizeof($sortarray);
        $query .= ' ORDER BY '.implode($sortarray,',');

    } else {
        // default query
        $sortarray = $cfg['defaultsort'];
        $sortsize = sizeof($cfg['defaultsort']);
        $sortby = implode($sortarray,',');
        $query .= " ORDER BY $sortby ";
        $_POST['filtertitle'] = 'all movies';
        $_POST['filter'] = '';
        $_POST['genres'] = '';
    }
    // LIMIT clause
    if(!isset($_POST['page']) || $_POST['page'] == '')
        $_POST['page'] = '0';
    $query .= ' LIMIT '.$_POST['page'].','.$cfg['nofflicks'];
   
    $result = mysql_query($query) or die(mysql_error());
   
    $rowresult = mysql_query('SELECT FOUND_ROWS()') or die(mysql_error());
    $row = mysql_fetch_row($rowresult);
    $rowcount = $row[0];
   
?>

Ved ORDER By clausen begynder det!.. Er der nogen der har forslag til ændringer, så skriptet kan køre selvom magic quotes er slået til.. Hvis altså det er det der er problemet!
Avatar billede jakobdo Ekspert
27. maj 2006 - 15:12 #6
Det du skal gøre, er at tage inputs og køre dem gennem: stripslashes()
$sortarray[$i] = $_POST['sortby'][$i];
kunne måske være:

$sortarray[$i] = stripslashes($_POST['sortby'][$i]);
Sådan skal du gøre med alle posts.
Det åbner mulighvis så for SQL injections, hvilket er skidt.
Men du kan jo prøve dig lidt frem i koden.

Det er her du skal rette med stripslashes()

// iff filter has been submitted, use it
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // form has been posted, page, filter and sortby[] values are present!
     
        // WHERE clause
        if(strlen($_POST['filter'])>0){
            // where clause was submitted
            // check if it is a select and not malicious SQL
            if(substr($_POST['filter'],0,38) != 'SELECT SQL_CALC_FOUND_ROWS _COLS_ FROM')
                die('don\'t try that.');
            $query = str_replace('_COLS_',$cols,$_POST['filter']);
        }
        // ORDER BY clause
        $sortsize = sizeof($_POST['sortby']);
        for($i=0; $i<$sortsize; $i++){
            $sortarray[$i] = $_POST['sortby'][$i];
            if($sortarray[$i]=='') break;
        }
        // fill rest of sort array with default values
        for($j=0; $j<$sortsize-$i; $j++){
            if(!isset($cfg['defaultsort'][$j])) break;
            $sortarray[$i] = $cfg['defaultsort'][$j];
            $i++;
        }
        $sortsize = sizeof($sortarray);
        $query .= ' ORDER BY '.implode($sortarray,',');
Avatar billede rasta123 Nybegynder
27. maj 2006 - 16:14 #7
ok.. det må jeg lige prøve i aften når jeg kommer hjem!..
Avatar billede rasta123 Nybegynder
27. maj 2006 - 17:27 #8
hmm.. nej det virkede.. erstattede bare den ene du snakkede om.. Du kan prøve at teste hvad den skrive nu.. Nu kommer der slet ikke en order by funktion med.. Jeg kan ikke rigtig forstå hvorfor der skal bruges en array der.. Fordi den siger jo at der både skal sorteres efter navn, men også nr og år.. Det er vel mere eller mindre umuligt??
Avatar billede rasta123 Nybegynder
27. maj 2006 - 23:18 #9
nej det virkede ikke.. ups må hellere læse igennem hvad jeg skriver!
Avatar billede jakobdo Ekspert
28. maj 2006 - 13:43 #10
Prøv som en test, at udskriv:
echo '<pre>';
print_r($_POST);
echo '</pre>';

Så kan vi se hvad der modtages, og så kan vi evt. lave et hack ud fra det.
Avatar billede rasta123 Nybegynder
29. maj 2006 - 16:39 #11
Den viser følgende:

Array
(
)



Jeg lavede en fil der hedder www.munky.dk/movies/test.php som indeholder:
<?
echo '<pre>';
print_r($_POST);
echo '</pre>';
?>
Avatar billede rasta123 Nybegynder
29. maj 2006 - 16:41 #12
Har iøvrigt fået det med billederne til at virke nu!.. Det var fordi imdb havde ændret måden de linker til deres billeder på, men nu virker det, så det er kun søgefunktionen der ikke virker nu!
Avatar billede jakobdo Ekspert
29. maj 2006 - 17:24 #13
Meningen var du skulle lave:
echo '<pre>';
print_r($_POST);
echo '</pre>';
i filen: index.php
Så når vi poster noget til scriptet, så kan vi se hvad den sender videre.
Avatar billede rasta123 Nybegynder
29. maj 2006 - 20:12 #14
ups.. sorry!!.. satte det ind lige efter tabellen!.. here it is:

Array
(
    [filtertitle] => all movies
    [filter] =>
    [genres] =>
    [page] => 0

Dette skriver den.. Du kan også se det på linket!
Avatar billede jakobdo Ekspert
29. maj 2006 - 21:47 #15
Kan du ikke smide koden helt i toppen af filen?
Avatar billede rasta123 Nybegynder
30. maj 2006 - 11:13 #16
Nåå.. nu forstår jeg hvad du mener.. Har flyttet det op til næsten toppen.. Lige efter require(config.php)

Når jeg så trykker på et af bogstaverne, får jeg følgende:
Array
(
    [page] => 0
    [filtertitle] => movies m
    [filter] => SELECT SQL_CALC_FOUND_ROWS _COLS_ FROM movies WHERE name like \'m%\'
    [sortby] => Array
        (
            [0] => name ASC
            [1] => nr ASC
            [2] => year DESC
        )

    [genres] =>
    [login] => 0
)

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '\'m%\' ORDER BY LIMIT 0,25' at line 1
Avatar billede jakobdo Ekspert
30. maj 2006 - 11:15 #17
Prøv det sted hvor $_POST['filter'] bruges, at ret til: stripslashes($_POST['filter'])
Avatar billede rasta123 Nybegynder
30. maj 2006 - 11:46 #18
Det har jeg gjort nu.. Det bliver brugt ca. 4 steder i index.php..  De er alle blevet rettet, og du kan se her hvordan index-filen ser ud.

    require_once('config/config.php');

echo '<pre>';
print_r($_POST);
echo '</pre>';
   
    // columns to be listed
    $cols = ' DISTINCT CONCAT(cat,nr)as nr,movies.name,year,runtime,medium,movies.id,fid ';
   
    // check if user is logged in
    $loggedin = false;
    if(!isset($_POST['login']) || $_POST['login'] != '0'){
        session_start();
        if(!isset($_SESSION['user'])){
            session_unset(); session_destroy();
        } else $loggedin = true;
    }
    // if loggedin is true, the logout-button instead of the login-b. are shown, but of course also additional info could be shown!

    // default query (overwritten below if filter posted)
    $query = "SELECT SQL_CALC_FOUND_ROWS $cols FROM movies ";
       
    // iff filter has been submitted, use it
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
        // form has been posted, page, filter and sortby[] values are present!
       
        // WHERE clause
        if(strlen(stripslashes($_POST['filter']))>0){
            // where clause was submitted
            // check if it is a select and not malicious SQL
            if(substr(stripslashes($_POST['filter']),0,38) != 'SELECT SQL_CALC_FOUND_ROWS _COLS_ FROM')
                die('don\'t try that.');
            $query = str_replace('_COLS_',$cols,stripslashes($_POST['filter']));
        }
        // ORDER BY clause
        $sortarray[$i] = $_POST['sortby'][$i];
        for($i=0; $i<$sortsize; $i++){
            $sortarray[$i] = $_POST['sortby'][$i];
            if($sortarray[$i]=='') break;
        }
        // fill rest of sort array with default values
        for($j=0; $j<$sortsize-$i; $j++){
            if(!isset($cfg['defaultsort'][$j])) break;
            $sortarray[$i] = $cfg['defaultsort'][$j];
            $i++;
        }
        $sortsize = sizeof($sortarray);
        $query .= ' ORDER BY '.implode($sortarray,',');

    } else {
        // default query
        $sortarray = $cfg['defaultsort'];
        $sortsize = sizeof($cfg['defaultsort']);
        $sortby = implode($sortarray,',');
        $query .= " ORDER BY $sortby ";
        $_POST['filtertitle'] = 'all movies';
        stripslashes($_POST['filter'])] = '';

Men nu får jeg bare hvid skærm når jeg går ind på www.munky.dk/movies.. Jeg har haft slået php-errormessages fra.,. Men har lige været inde og slå det til igen.. Indtil videre har den ikke vist nogen fejlmeddelelse, men det plejer at tage et stykke tid, før ændringerne fra kontrolpanelet bliver opdateret!
Avatar billede rasta123 Nybegynder
30. maj 2006 - 11:54 #19
Nu opdateredes det også.. og jeg kunne læse fejlmeddelelsen.. Havde glemt at slette en bracket et sted i filen, så jeg rettede:

stripslashes($_POST['filter'])] = '';

til

stripslashes($_POST['filter']) = '';

Men jeg får stadig en fejl..

Fatal error: Can't use function return value in write context in /customers/munky.dk/munky.dk/httpd.www/movies/index.php on line 64

Det er den samme linie, som jeg havde lavet fejlen i før.. Kan bare ikke helt gennemskue, hvorfor den skriver det!
Avatar billede jakobdo Ekspert
30. maj 2006 - 12:44 #20
Er dette linie 64: if(substr(stripslashes($_POST['filter']),0,38) != 'SELECT SQL_CALC_FOUND_ROWS _COLS_ FROM') ???
Avatar billede rasta123 Nybegynder
30. maj 2006 - 13:20 #21
Nopes.. Det er denne der er linie 64. (Notepad uden wordwrap på index.php også talte jeg bare nedad!)       
stripslashes($_POST['filter']) = '';
Avatar billede jakobdo Ekspert
30. maj 2006 - 14:05 #22
Fjern stripslashes() fra den.
Avatar billede rasta123 Nybegynder
30. maj 2006 - 16:10 #23
Så har jeg ændret det, og nu kommer jeg ind på siden igen!

Har to fejlmeddelelser i toppen nu.. Men dem tror jeg altid de har været der, hvis jeg eller havde haft slået show php errors til hele tiden.

Men når jeg trykker på et bogstav får jeg:

Array
(
    [page] => 0
    [filtertitle] => movies j
    [filter] => SELECT SQL_CALC_FOUND_ROWS _COLS_ FROM movies WHERE ( ISNULL(genre) ) AND name like \'j%\'
    [sortby] => Array
        (
            [0] => name ASC
            [1] => nr ASC
            [2] => year DESC
        )

    [genres] => <none>
    [login] => 0
)

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0,25' at line 1



Array
(
    [page] => 0
    [filtertitle] => movies j
    [filter] => SELECT SQL_CALC_FOUND_ROWS _COLS_ FROM movies WHERE ( ISNULL(genre) ) AND name like \'j%\'
    [sortby] => Array
        (
            [0] => name ASC
            [1] => nr ASC
            [2] => year DESC
        )

    [genres] => <none>
    [login] => 0
)

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 0,25' at line 1
Avatar billede jakobdo Ekspert
30. maj 2006 - 17:38 #24
Fang mig på msn: jakobdo [at] hotmail {dot} com
Så må vi kigge på det i aften.
Avatar billede rasta123 Nybegynder
30. maj 2006 - 17:40 #25
ok.. det er bare i orden.. Tak for det!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester