Invoeren van project naar database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Enrico van der List

Enrico van der List

11/08/2014 15:39:25
Quote Anchor link
Afbeelding
Afbeelding

ik ben een uploadsysteem aan het maken. waarbij ik mijn project wil weergeven een soort formulier. het uitlezen is niet het probleem maar het invoeren van deze gegevens zit ik even mee vast. want ik heb wel iets kunnen maken maar het gaat niet werken. is er een betere mogelijkheid hoe ik dit kan oplossen?

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
<?php
if(isset($_POST['submit'])){

$titel    = $_POST['titel'];
$subtitel = $_POST['subtitel'];
$url_plaatje = $_POST['url_plaatje'];// weet niet of het werkt?
$url_project = $_POST['url_project'];// weet niet of het werkt?
$omschrijving = $_POST['omschrijving'];
$datum    = $_POST['datum'];

include('mysql_connect.php');            // Database aanroepen

$query_controleren_project = mysql_query("SELECT * FROM Project WHERE titel='$titel'");
$num_controleren_project = mysql_num_rows ($query_controleren_project);

if(!$num_controleren_project == 1){
    $query_insert = mysql_query ("INSERT INTO Project (titel, subtitel, url_plaatje, url_project, download_project, omschrijving, datum) VALEUS('$titel','$subtitel','$url_plaatje','$url_project','$omschrijving','$datum')");    
}
else{
    echo "Dit Project staat al op de website";
}

}
else{
    echo "
        <form action='upload.php' method='POST' enctype='multipart/form-data'>
        <p>Titel project:
        <input name='mytitel' size='50' type='text'><br>
        Subtitel:<input name='mysubtitel' size='50' type='text'><br>
        Afbeelding:
        <input name='myimage' type='file' size='50' title='afbeelding'><br>
        Project:<input name='myproject' type='file' size='50'><br>
        Download url:<input name='myproject' type='url' size='50'><br>
        Datum:
        
        <input name='mydate' type='date'><br>
        <br>
        Omschrijving project:<br>
        <textarea name='omschrijving' rows='10' cols='50'></textarea>
        <input type='submit' value='Upload het project' size='38'>
        </p>
  </form>
    "
;
    
}

?>
Gewijzigd op 11/08/2014 15:41:30 door Enrico van der List
 
PHP hulp

PHP hulp

22/12/2024 16:39:32
 
Ward van der Put
Moderator

Ward van der Put

11/08/2014 15:59:38
Quote Anchor link
Je vraag is niet helemaal duidelijk:

- Wil je plaatjes uploaden naar de webserver?
- Wil je plaatjes uploaden naar de databaseserver?
- Wil je alleen de URL van plaatjes opslaan in de database?
- Of wil je plaatjes uploaden door hun URL op te geven?
 
Ramon van Dongen

Ramon van Dongen

11/08/2014 16:02:56
Quote Anchor link
Een paar eerste opmerkingen over je script:

- regel 2 kun je beter vervangen door if($_SERVER['REQUEST_METHOD'] == 'POST')
- regel 4 t/m 9 zijn helemaal onzinnig. Komt er eigenlijk op neer dat ik nu zeg: Enrico, nu noem ik jou Kees. Als ik jou gewoon Enrico blijf noemen is het veel duidelijker.
- regel 6&7; komen binnen in $_FILES
- regel 11: je kunt beter mysql_ functies loslaten en met mysqli_ functies gaan werken. Mysql_ vervalt uiteindelijk.
- regel 13: selecteer niet alles met * maar benoem wat je nodig hebt
- regel 13&17: denk aan SQL injectie. Kijk eens naar mysql(i)_real_escape_string
- regel 14 en 16 is dan wat dubbel
 
Enrico van der List

Enrico van der List

11/08/2014 16:06:57
Quote Anchor link
Ward van der Put op 11/08/2014 15:59:38:
Je vraag is niet helemaal duidelijk:

- Wil je plaatjes uploaden naar de webserver?
- Wil je plaatjes uploaden naar de databaseserver?
- Wil je alleen de URL van plaatjes opslaan in de database?
- Of wil je plaatjes uploaden door hun URL op te geven?


De plaatjes wil ik op mijn server plaatsen en die afbeeldingen moet ik uiteindelijk kunnen weergeven op de site
 
Ramon van Dongen

Ramon van Dongen

11/08/2014 16:11:53
Quote Anchor link
Je controleert nu op regel 17 of er al 1 van bestaat. Zo ja voer je hem nog een keer in, als het niet al 1 keer bestaat geef je juist de melding dat het al bestaat... moet omgekeerd zijn denk ik?
Gewijzigd op 11/08/2014 16:12:43 door Ramon van Dongen
 
Obelix Idefix

Obelix Idefix

11/08/2014 22:57:35
Quote Anchor link
@Ramon: er staat wel een ! voor op regel 17.

Maar jouw hele code gaat naar mijn idee niet werken.
De namen die je in de $_POST waarden hebt staan komen niet overeen met het formulier (los van het feit dat je geen nieuwe variabelen aan zou hoeven maken).

Waar is je code om een afbeelding te uploaden naar de server?
(bv http://www.w3schools.com/php/php_file_upload.asp, of zoek op google met upload file php voor nog veel meer tuts, vragen, voorbeelden, etc.).
 
Ramon van Dongen

Ramon van Dongen

12/08/2014 09:56:54
Quote Anchor link
Quote:
@Ramon: er staat wel een ! voor op regel 17.

Helemaal overheen gekeken, excusi!
 
Erwin H

Erwin H

12/08/2014 10:08:46
Quote Anchor link
Wat dus betekent dat alles groter dan 0 daar false op levert. Voor dit script wellicht geen probleem, maar op zijn minst een erg vreemde manier van checken...
 
Peter K

Peter K

12/08/2014 13:47:56
Quote Anchor link
Pas regel 17 eens aan van:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
    VALEUS  


naar
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
    VALUES


Dat zal wellicht ook beter gaan
Gewijzigd op 12/08/2014 13:48:24 door Peter K
 
Enrico van der List

Enrico van der List

12/08/2014 20:48:31
Quote Anchor link
Ik ben momenteel even op nieuw begonnen en probeer eerst een plaatje op de server te krijgen en dat werkt maar ik wil ook dat hij in mijn database terechtkomt bij url_plaatje. Ik heb dit wel eens eerder gedaan met een andere project en dat werkte wel maar nu werkt deze code niet helemaal op deze database. Wat doe ik dan verkeerd?

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
<?php
    session_start();
    include('mysql_connect.php'); // connectie met database
    
    $resultaat = mysql_query("SELECT MAX(id) FROM Project", $db); // checkt of database image bestaat    
    $rij = mysql_fetch_array($resultaat);  
    $rij = $rij['MAX(id)'] + 1 ; // veranderd de naam in een nummer van de foto's aan de hand van de database + 1
    $image = addslashes(file_get_contents($_FILES['myimg']['tmp_name']));
    $image_name = addslashes($_FILES['myimg']['name']); // naam bestand
    $image_size = getimagesize($_FILES['myimg']['tmp_name']); // grote van de foto
    $filePath = "uploaded/" . $rij; // locatie en naam van het bestand wat is geupload
    
    if($size > 3000000)
    {

        die("Bestand is te groot!");
    }

    else    
    move_uploaded_file($_FILES["myimg"]["tmp_name"], "uploaded/" . $rij . ".jpg");// plaats waar de foto wordt geplaatst op de server
    
    mysql_query("INSERT INTO Project VALUES ('','$image_name','$filePath')");// alle informatie wordt in een database geplaatst
?>
Gewijzigd op 12/08/2014 20:49:34 door Enrico van der List
 
- SanThe -

- SanThe -

12/08/2014 21:45:20
Quote Anchor link
Regel 8: Waarom addslashes() over een plaatje? => Kans is groot dat het nu mismaakt is.
Regel 9: Waarom addslashes? => Dat is geen beveiliging voor in de database.
Regel 10: grote => grootte.
Regel 11: $filePath => Waarom gebruik je dat niet ook in regel 18?
Regel 18: jpg? => Dat weet je niet.
Regel 20: INSERT INTO ... (veldnaam, ...) VALUES ('waarde', ...)

Maak eens foutafhandeling.
Alles wat je nu doet is gebaseerd op gokken dat het goed gaat.
Je checkt niet of er gepost is.
Je checkt niet of de download wel is gelukt.
Je checkt niet of het verplaatsen is gelukt.
De query is niet beveiligd.
Je checkt niet of de query is gelukt.

Het enige dat je controleert is de grootte en dan moet ie nog dood ook.
Gewijzigd op 12/08/2014 22:35:03 door - SanThe -
 
Obelix Idefix

Obelix Idefix

12/08/2014 22:05:34
Quote Anchor link
Als je toch opnieuw bent begonnen, waarom neem je dan niet alle tips mee:
Ramon van Dongen op 11/08/2014 16:02:56:
je kunt beter mysql_ functies loslaten en met mysqli_ functies gaan werken. Mysql_ vervalt uiteindelijk.
 
Enrico van der List

Enrico van der List

13/08/2014 01:39:12
Quote Anchor link
- SanThe - op 12/08/2014 21:45:20:
Regel 8: Waarom addslashes() over een plaatje? => Kans is groot dat het nu mismaakt is.
Regel 9: Waarom addslashes? => Dat is geen beveiliging voor in de database.
Regel 10: grote => grootte.
Regel 11: $filePath => Waarom gebruik je dat niet ook in regel 18?
Regel 18: jpg? => Dat weet je niet.
Regel 20: INSERT INTO ... (veldnaam, ...) VALUES ('waarde', ...)

Maak eens foutafhandeling.
Alles wat je nu doet is gebaseerd op gokken dat het goed gaat.
Je checkt niet of er gepost is.
Je checkt niet of de download wel is gelukt.
Je checkt niet of het verplaatsen is gelukt.
De query is niet beveiligd.
Je checkt niet of de query is gelukt.

Het enige dat je controleert is de grootte en dan moet ie nog dood ook.


ik heb wel hier en daar inmiddels aangepast ook heb ik het al mysqli van gemaakt(ik weet alleen niet of het al goed is). Ik ben momenteel nog wel aan regel 20 aan het sleutelen. toch vind ik het gek dat ik bijna dezelfde code heb kunnen gebruiken bij een andere opdracht en daar werkte alles wel ook werd het in mijn database en op de server geplaatst.

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
<?php
    session_start();
    include('mysql_connect.php'); // connectie met database
    
    $resultaat = mysqli_query("SELECT MAX(id) FROM Project", $db); // checkt of database image bestaat    
    $rij = mysqli_fetch_array($resultaat);  
    $rij = $rij['MAX(id)'] + 1 ; // veranderd de naam in een nummer van de foto's aan de hand van de database + 1
    $image = addslashes(file_get_contents($_FILES['myimg']['tmp_name']));
    $image_name = addslashes($_FILES['myimg']['name']); // naam bestand
    $image_size = getimagesize($_FILES['myimg']['tmp_name']); // grootte van de foto
    $filePath = "uploaded/" . $rij; // locatie en naam van het bestand wat is geupload
    
    if($size > 3000000)
    {

        die("Bestand is te groot!");
    }

    else    
    move_uploaded_file($_FILES["myimg"]["tmp_name"], $filePath);// plaats waar de foto wordt geplaatst op de server
    
    //mysqli_query("INSERT INTO Project VALUES ('','$image_name','$filePath')");// alle informatie wordt in een database geplaatst

    mysqli_query("INSERT INTO Project VALUES INSERT url_plaatje'");
    header('location: admin.php');
?>
 
Peter K

Peter K

13/08/2014 08:24:45
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
mysqli_query("INSERT INTO Project VALUES INSERT url_plaatje'");


Waarom gebruik je niet de kolommen om te inserten, zo blijft je script overzichtelijk wat waar moet komen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
mysqli_query("INSERT INTO `tabelnaam` (`kolom1`, `kolom2`) VALUES ('waarde_kolom_1', 'waarde_kolom_2')");


Je kunt eventueel ook eens in je Mysql browser (PHPmyadmin waarschijnlijk) eens een insert doen. Gebruik dan de query die daar weergegeven wordt eens in je script en kijk of alles werkt.

Toevoeging:
Begin daarna met de variabelen die je wilt invullen eens hard in je script te zetten:
$bestandsnaam = "bestandsnaam.jpg";
$bestand_locatie = "pad_naar/de_locatie/";

Voeg dit vervolgens toe in je query en test dan of het werkt. Werkt het dan nog, dan kun je eens je upload script er tussen proberen. Doe dit kolom per kolom en zo lang het blijft werken weet je dat het laatst toegevoegde goed is. Gaat het fout zit daar het probleem!
Gewijzigd op 13/08/2014 08:27:16 door Peter K
 
Obelix Idefix

Obelix Idefix

13/08/2014 08:42:41
Quote Anchor link
Enrico van der List op 13/08/2014 01:39:12:
toch vind ik het gek dat ik bijna dezelfde code heb kunnen gebruiken bij een andere opdracht en daar werkte alles wel ook werd het in mijn database en op de server geplaatst.

Misschien dat de oorzaak dan ligt in het woordje 'bijna'? ;-)
Er zijn dus verschillen tussen die code die wel werkt en deze.
Welke? En kan daar de oorzaak liggen voor het feit dat het nu niet werkt

Enrico van der List op 13/08/2014 01:39:12:
ook heb ik het al mysqli van gemaakt(ik weet alleen niet of het al goed is).

Dat schiet niet op. Doe het of niet of doe het goed. Half kan niet.
mysqli_query moet een foutmelding geven. Bouw dus foutafhandeling in!!

Waar controleer je of het bestand dat iemand upload wel voldoet aan een afbeelding. Volgens mij kan ik nu vrij eenvoudig een php bestand (met schadelijke code) uploaden.
Je zet zo te zien de geuploade bestanden niet buiten de root neer; voor iedereen dus toegankelijk.

Waarom die header op regel 22? Laat die eens weg (of vervang door een melding dat het gelukt is).
 
Enrico van der List

Enrico van der List

14/08/2014 01:48:45
Quote Anchor link
deze topic kan gesloten worden. want ik heb hem al gelukkig werkend. heb stap voor stap gekeken met aan de hand van echo(); en bleek dat ik te weinig arrays had aangegeven.

Quote:
Waar controleer je of het bestand dat iemand upload wel voldoet aan een afbeelding. Volgens mij kan ik nu vrij eenvoudig een php bestand (met schadelijke code) uploaden.
Je zet zo te zien de geuploade bestanden niet buiten de root neer; voor iedereen dus toegankelijk.

deze pagina kan niemand van buitenaf op komen uiteindelijk want dit komt achter een login systeem waar alleen ik de beheerder ben en wachtwoord van weet ;)
 
Peter K

Peter K

14/08/2014 07:26:03
Quote Anchor link
En als ze het weten te hacken kunnen ze alsnog een onveilig script uploaden....
 
Peter  Flos

Peter Flos

14/08/2014 11:18:35
Quote Anchor link
Betreft je login systeem, HTTP, of zelf gebouwd? Als je je login even slecht beveiligd als je upload scripts, komen ze er zo in.
 
Enrico van der List

Enrico van der List

14/08/2014 11:36:16
Quote Anchor link
php login maar die is al inmiddels al beveiligd met een CRYPT_MD5 en een sql injection. maar beveiligen lukt verder wel.
 



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.