Invoeren van project naar database
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)
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
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>
";
}
?>
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
- 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?
- 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
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?
- 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
Gewijzigd op 11/08/2014 16:12:43 door Ramon van Dongen
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.).
Quote:
@Ramon: er staat wel een ! voor op regel 17.
Helemaal overheen gekeken, excusi!
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...
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
?>
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
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 -
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.
- 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.
Regel 9: Waarom addslashes? => Dat is geen beveiliging voor in de database.
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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');
?>
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');
?>
Waarom gebruik je niet de kolommen om te inserten, zo blijft je script overzichtelijk wat waar moet komen.
Code (php)
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
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).
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.
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 ;)
En als ze het weten te hacken kunnen ze alsnog een onveilig script uploaden....
Betreft je login systeem, HTTP, of zelf gebouwd? Als je je login even slecht beveiligd als je upload scripts, komen ze er zo in.
php login maar die is al inmiddels al beveiligd met een CRYPT_MD5 en een sql injection. maar beveiligen lukt verder wel.