Verouderde scripts werken niet meer: foto-upload faalt

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ty Muus

Ty Muus

01/05/2014 13:59:10
Quote Anchor link
Beste PHP kameraden,

In 2007 heb ik eens een foto upload script gemaakt, en nu is na lange tijd de server geupdate naar de meest actuele PHP en SQL versie. Diverse scripts werken niet meer.

Ik heb in alle formulieren "HTTP_POST_VARS" moeten zetten omdat dat kennelijk wél werkte. Maar het is vast niet de juiste oplossing.

Mijn foto-formulieren doen het nog niet. Wat is er verouderd? Ik kan het niet ontdekken.
- artikel_id = id van het nieuwsbericht waar de foto's bij horen BIJV. 45
- fotonummer = id van het nummer, gelinkt aan de bestandsnaam BIJV. 5 (wordt 45_5.jpg)
- bestandsnaam = bijv. 45_5.jpg

Alvast bedankt voor jullie supervisie!

Groet,
Ty

Fragment van het form:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?
//UPLOAD NIEUWE FOTO
//Vraag artikel id op uit de url

$artikel_id = $_GET['id'];
$var = mysql_query("SELECT * FROM plaatjes WHERE artikel_id LIKE '$id' ORDER BY fotonummer DESC LIMIT 1") or die (mysql_error());
$current = mysql_fetch_object($var);
$max = $current->fotonummer;
$plus1 = 1;
$new = $plus1 + $max;
if ($new == 12)
{

echo "Je kan geen extra fotos meer toevoegen";
}

else
{
echo "<input type='hidden' name='MAX_FILE_SIZE' value='10000000' />";
echo "Selecteer afbeelding (.JPG): <br><input name='userfile' type='file'>";
echo "<input name='newname' value='". $artikel_id . "_". $new .".jpg' type='hidden'>";
echo "<input name='artikel_id' value='". $artikel_id ."' type='hidden'>";
echo "<input name='fotonummer' value='". $new ."' type='hidden'>";
echo "<input name='bestandsnaam' value='". $artikel_id . "_". $new .".jpg' type='hidden'>";
echo "<input type='submit' value='Afbeelding toevoegen' />";
}

?>


Submit script


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?  
$artikel_id
= $_GET['id'];
$fotonummer=$HTTP_POST_VARS['fotonummer'];
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<?
global $_FILES;

$filename = $_FILES['userfile']['name'];  

$allow[0] = "jpg";
// $allow[3] = "exe"; enz.

if ($_POST["newname"])
    $uploadname = $_POST['newname'];
else
    $uploadname = $_FILES['userfile']['name'];
    
$extentie = substr($uploadname, -3);

for ($i = 0; $i < count($allow); $i++)
{

    if ($extentie == $allow[$i])
    {

        $extentie_check = "ok";
        $i = count($allow) + 5; // om loop te beindigen
    }
}


if ($extentie_check)
{

    if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {  
        move_uploaded_file($_FILES['userfile']['tmp_name'], "../../nieuws/plaatjes/" . $uploadname);  
        chmod('../../nieuws/plaatjes/'.$uploadname.'', 0666);

        echo "";
    }
}

else
{
    echo "Erg ging iets mis, mogelijk is je bestand te groot, of is het een verkeerd bestandstype (alleen .jpg is toegestaan). <br><br><p>";
    echo "";
}
  
//maken en opslaan van thumnails
//site chmod 0777 /httpdocs/database/thumbnails/ in window, other, FTPlog

/**
* @param string $sImg The location of the image that needs to be resized to a thumbnail
* @param int $iMaxWidth The maximum width of the thumbnail
* @param int $iMaxHeight The maximum hight of the thumbnail
* @param string $sImg The location of the new image (including name of image)
* @return bool
*
*/


$sImg = '../../nieuws/plaatjes/'.$uploadname.'';
$sStore = '../../nieuws/plaatjes_miniaturen/'.$uploadname.'';
$iMaxHeight = 67;
$iMaxWidth = 100;

function
createThumbnail($sImg, $iMaxWidth, $iMaxHeight, $sStore)
{

    //Check if the image exists
    if(!@file_exists($sImg))
    {

        return false;
    }

    
    //Retrieve information of the image
    if(!@$aSize = getimagesize($sImg))
    {

        return false;
    }

    
    //Automatic calculation of maximum height or width
    $dProportion = $aSize[1]/$aSize[0];
    if($iMaxWidth>$aSize[0])
    {

        $iWidth = $iMaxHeight>$aSize[1] ? $aSize[0] : round($iMaxHeight/$dProportion);
        $iHeight = $iMaxHeight>$aSize[1] ? $aSize[1] : $iMaxHeight;
    }

    else if($iMaxWidth<$aSize[0])
    {

        if($iMaxHeight>$aSize[1])
        {

            $iWidth = $iMaxWidth;
            $iHeight = round($iMaxWidth*$dProportion);
        }

        else
        {
            if($dProportion>1)
            {

                $iNewWidth=round($iMaxHeight/$dProportion);
                if($newWidth>$iMaxWidth)
                {

                    $iWidth = $iMaxWidth;
                    $iHeight = round($iMaxWidth*$dProportion);
                }

                else
                {
                    $iWidth = round($iMaxHeight/$dProportion);
                    $iHeight = $iMaxHeight;
                }
            }

            else
            {
                $iNewHeight = round($iMaxWidth*$dProportion);
                if($iNewHeight>$iMaxHeight)
                {

                    $iWidth = round($iMaxHeight/$dProportion);
                    $iHeight = $iMaxHeight;
                }

                else
                {
                    $iWidth = $iMaxWidth;
                    $iHeight = round($iMaxWidth*$dProportion);
                }
            }
        }
    }


    //Create empty image resource for thumbnail
    $rDest = imagecreatetruecolor($iWidth,$iHeight);
    
    //Create image resource from the specified image depending on the format
    switch($aSize[2])
    {
        case
1: $rSrc=imagecreatefromgif($sImg);break;
        case
2: $rSrc=imagecreatefromjpeg($sImg);break;
        case
3: $rSrc=imagecreatefrompng($sImg);break;
        default:
return false;
    }

    
    //Create the thumbnail resource
    $bNoError = imagecopyresampled($rDest, $rSrc, 0, 0, 0, 0, $iWidth, $iHeight, $aSize[0], $aSize[1]);
    
    //Save the thumbnail on the specified location
    if($bNoError)
    {

        switch($aSize[2])
        {
            case
1: $bNoError=imagegif($rDest, $sStore);break;
            case
2: $bNoError=imagejpeg($rDest, $sStore, 100);break;
            case
3: $bNoError=imagepng($rDest, $sStore);break;
        }
    }

    //Return true when the thumbnail is created, false otherwise
    return $bNoError;
}


if(createThumbnail($sImg, $iMaxWidth, $iMaxHeight, $sStore))
{

    echo "";
}

else
{
    echo "<br><br>Error: Thumbnail niet geupload.";
}


?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
$id
=$HTTP_POST_VARS['id'];
$artikel_id=$HTTP_POST_VARS['artikel_id'];
$fotonummer=$HTTP_POST_VARS['fotonummer'];
$bestandsnaam=$HTTP_POST_VARS['bestandsnaam'];
//Get soortinfo
$var = mysql_query("SELECT * FROM plaatjes WHERE artikel_id LIKE '$id' ORDER BY fotonummer DESC LIMIT 1") or die (mysql_error());

//alleen submitten als er een nieuwe foto wordt toegevoegd met beschrijving, dus niet in geval van foto vervangen. Alleen in het upload formulier wordt een soortinformatie gesubmit door het formulier zoals photonr. In het vervang script wordt alleen foto vervangen, en door het formulier geen info meegestuurd. Wellicht dit script later op een aparte pagina zetten.
if (isset($fotonummer)) {
//update foto informatie
$sql = "INSERT INTO plaatjes (artikel_id, fotonummer, bestandsnaam)
VALUES ('$artikel_id', '$fotonummer', '$bestandsnaam')"
;
mysql_query($sql) or die(mysql_error());  
//geef aan dat gegevens in tabel zijn toegevoegd
echo "";
}

else
{
echo "";
}

?>
Gewijzigd op 01/05/2014 14:00:35 door Ty Muus
 
PHP hulp

PHP hulp

27/11/2024 03:48:21
 
Michael -

Michael -

01/05/2014 14:05:44
Quote Anchor link
$HTTP_POST_VARS zou je beter kunnen vervangen door $_POST
$HTTP_POST_VARS en de mysql_* functies zijn deprecated en zullen dus komen te vervallen.
Je script is zo lek als een mandje. Zoek eens op SQL Injection. Altijd gebruikersinvoer controleren i.p.v. alles maar in de database stoppen waaronder ook 'verkeerde' data.
Or die is ook geen mooie manier. Een mysql_error() presenteren in een live omgeving... Het is voor kwaadwillenden net een speeltuin :)

Je zou een groot gedeelte van je code moeten aanpassen/verbeteren wil je hier nog wat van maken.
Mogelijk kun je sneller iets nieuws schrijven of een andere, recenter, script zoeken.
 
Peter  Flos

Peter Flos

01/05/2014 14:09:07
Quote Anchor link
Zodra je op php.net kijkt zie je het volgende:

http://www.php.net/manual/en/reserved.variables.post.php

Daar staat $HTTP_POST_VARS [deprecated], $HTTP_POST_VARS worden dus afgekeurd.

Ik ben niet de slimste op PHP gebied, maar probeer eens in plaats van

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$id=$HTTP_POST_VARS['id'];


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$id=mysql_real_escape_string($_POST['id']);


te gebruiken...

Alvast een aanrader voor het geval je je scripts later weer moet aanpassen: Mysql is verouderd, nog wel bruikbaar maar stap over op Mysqli of PDO.
 
- SanThe -

- SanThe -

01/05/2014 14:12:30
Quote Anchor link
Scripts zijn allen lek => sql-injection.
Veel te weinig controles op de input.
mysql is antiek => mysqli of pdo.
HTTP_POST_VARS is antiek.
if ($_POST["newname"]) test eigenlijk op true/false dus best een vreemde controle.

Ik raad je aan het even geheel te herschrijven met meer controles, veiligheid en met de nieuwere manier van database functions.
Gewijzigd op 01/05/2014 14:14:01 door - SanThe -
 
Ty Muus

Ty Muus

01/05/2014 14:31:26
Quote Anchor link
Dank jullie voor de reacties!

Helaas ben ik zelf niet een fantastische PHP kenner dus de basis die ooit door iemand geschreven is gebruik ik maar, werk ik wat bij, enz. Ik moet er toch echt fanatiek aan gaan sleutelen merk ik wel.

Gelukkig staat het script wel in een admin, wat het al iets veiliger maakt.

Ik werk met MySQL 5.1. Helaas kan ik daar niks aan veranderen, omdat het webbedrijf hier over gaat. Ik weet niet beter.. :-(
 
- Ariën  -
Beheerder

- Ariën -

01/05/2014 14:37:01
Quote Anchor link
De versie van MySQL speelt geen rol. Het gaat namelijk om die functies die PHP aanbiedt om mee naar MySQL te communiceren.

Zo is mysql_*() straks verleden tijd. Een mooi moment om naar MySQLi te kijken of PDO. De laatste is erg krachtig als je ook met andere databases wilt werken, zoals MsSQL, SQLite , ProstGreSQL, Oracle, Firebird etc....
 
Ty Muus

Ty Muus

01/05/2014 15:10:44
Quote Anchor link
Ik zal het voorleggen aan het webhostbedrijf :)

Zou dit script enigszins goed zijn, vanuit jullie optiek bekeken?

http://www.w3bees.com/2013/02/simple-file-upload-with-php.html
 
Michael -

Michael -

01/05/2014 15:31:56
Quote Anchor link
> Ik zal het voorleggen aan het webhostbedrijf :)
Wat wil je voorleggen? We geven jou tips. Dit staat los van je webhosting. Het is juist goed dat hun hebben ge-upgrade.
Mysql 5.1 is volgens mij ook al vrij oud, maar dat heeft hier inderdaad niks mee te maken.
 
Ty Muus

Ty Muus

01/05/2014 15:47:21
Quote Anchor link
Sorry, ik doelde op de opmerking over MySQLi en PDO. Dat wordt niet door het webhostingbedrijf aangeboden, dus ik kan hier in feite niks mee... Ik ben toch aangewezen op MySQL in dit geval.

Uiteraard neem ik jullie adviezen ter harte.

Al moet ik nu wel bekennen dat ik aardig met de handen in het haar zit, omdat ik iets moet fixen wat deel uitmaakt van een groter geheel, en ik niet weet hoe ik dat moet doen. De scripts moet ik zelf schrijven want ze staan niet op internet, en aangezien ik 2 linker handen heb wat PHP betreft... :-(

EDIT: Na wat zoekwerk over mysqli zou het dus kunnen dit gewoon samen werkt met hetgeen wat ik herken als MySQL? Dus mocht ik mysqli in de scripts verwerken, dan werkt dit gewoon met de huidige MySQL en MyAdmin?
Gewijzigd op 01/05/2014 15:51:24 door Ty Muus
 
- Ariën  -
Beheerder

- Ariën -

01/05/2014 15:49:57
Quote Anchor link
MySQLi en PDO zijn functie-bibiliotheken voor PHP, geen Databases op zichzelf. Dus je kan prima bij het gebruik van MySQL blijven, echter raden we de standaard mysql_*()-functies van PHP af.

Je hoeft infeite niks te overleggen met je hosting, want beiden zullen wel aangeboden worden door hen, tenzij die 6 jaar achter de feiten aan loopt. Maar daar gaan we maar niet van uit.
Ty Muus op 01/05/2014 15:47:21:
Dus mocht ik mysqli in de scripts verwerken, dan werkt dit gewoon met de huidige MySQL en MyAdmin?

Correct!
MyAdmin (PhpMyAdmin?) zal niets anders zijn dan een beheertool voor MySQL, dus die staat er los van, gewoon een data-invoer- en controlepaneel die in PHP gebouwd zal zijn.
Gewijzigd op 01/05/2014 15:55:36 door - Ariën -
 
Ty Muus

Ty Muus

01/05/2014 16:01:47
Quote Anchor link
Aaah thanks!! Ja, het kwartje moest even vallen. Ik had er nog nooit van gehoord (en dat zegt wat).

Ik zal het doorvoeren :)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.