Plaatje uploaden
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
if ( isset($_SESSION['username']) ) {
echo "<b><a>
<form enctype='multipart/form-data' action='YourPhotos2.php?id=$id&&username=$username' method='post'>
<input type='hidden' name='MAX_FILE_SIZE' value='99999999' />
<div><input name='userfile' type='file' /></div>
<div><input type='submit' value='Submit' /></div>
</form>";
}
else {
echo"";}?>
if ( isset($_SESSION['username']) ) {
echo "<b><a>
<form enctype='multipart/form-data' action='YourPhotos2.php?id=$id&&username=$username' method='post'>
<input type='hidden' name='MAX_FILE_SIZE' value='99999999' />
<div><input name='userfile' type='file' /></div>
<div><input type='submit' value='Submit' /></div>
</form>";
}
else {
echo"";}?>
de code om het op te slaan in database:
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
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
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
<?php
session_start(); ?>
<?php
if(isset($_GET['username']))
{
$username = $_GET['username'];
// getting info from db
}?>
<?php
if(isset($_GET['id']))
{
$id = intval($_GET['id']);
// getting info from db
}
?>
<?php
/*** check if a file was submitted ***/
if(!isset($_FILES['userfile']))
{
echo '<p>Please select a file</p>';
}
else
{
try {
upload();
/*** give praise and thanks to the php gods ***/
echo '<p>Thank you for submitting</p>';
}
catch(Exception $e)
{
echo '<h4>'.$e->getMessage().'</h4>';
}
}
?><?php
/**
*
* the upload function
*
* @access public
*
* @return void
*
*/
function upload(){
/*** check if a file was uploaded ***/
if(is_uploaded_file($_FILES['userfile']['tmp_name']) && getimagesize($_FILES['userfile']['tmp_name']) != false)
{
/*** get the image info. ***/
$size = getimagesize($_FILES['userfile']['tmp_name']);
/*** assign our variables ***/
$type = $size['mime'];
$imgfp = fopen($_FILES['userfile']['tmp_name'], 'rb');
$size = $size[3];
$name = $_FILES['userfile']['name'];
$maxsize = 99999999;
/*** check the file is less than the maximum file size ***/
if($_FILES['userfile']['size'] < $maxsize )
{
/*** connect to db ***/
$dbh = new PDO("mysql:host=localhost;dbname=sfriends", 'root', 'superbart');
/*** set the error mode ***/
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*** our sql query ***/
$stmt = $dbh->prepare("INSERT INTO testblob (image_type ,image, image_size, image_name, user_id) VALUES (? ,?, ?, ?, ?)");
/*** bind the params ***/
$stmt->bindParam(1, $type);
$stmt->bindParam(2, $imgfp, PDO::PARAM_LOB);
$stmt->bindParam(3, $size);
$stmt->bindParam(4, $name);
$stmt->bindParam(5, $id);
/*** execute the query ***/
$stmt->execute();
}
else
{
/*** throw an exception is image is not of type ***/
throw new Exception("File Size Error");
}
}
else
{
// if the file is not less than the maximum allowed, print an error
throw new Exception("Unsupported Image Format!");
}
}
?>
session_start(); ?>
<?php
if(isset($_GET['username']))
{
$username = $_GET['username'];
// getting info from db
}?>
<?php
if(isset($_GET['id']))
{
$id = intval($_GET['id']);
// getting info from db
}
?>
<?php
/*** check if a file was submitted ***/
if(!isset($_FILES['userfile']))
{
echo '<p>Please select a file</p>';
}
else
{
try {
upload();
/*** give praise and thanks to the php gods ***/
echo '<p>Thank you for submitting</p>';
}
catch(Exception $e)
{
echo '<h4>'.$e->getMessage().'</h4>';
}
}
?><?php
/**
*
* the upload function
*
* @access public
*
* @return void
*
*/
function upload(){
/*** check if a file was uploaded ***/
if(is_uploaded_file($_FILES['userfile']['tmp_name']) && getimagesize($_FILES['userfile']['tmp_name']) != false)
{
/*** get the image info. ***/
$size = getimagesize($_FILES['userfile']['tmp_name']);
/*** assign our variables ***/
$type = $size['mime'];
$imgfp = fopen($_FILES['userfile']['tmp_name'], 'rb');
$size = $size[3];
$name = $_FILES['userfile']['name'];
$maxsize = 99999999;
/*** check the file is less than the maximum file size ***/
if($_FILES['userfile']['size'] < $maxsize )
{
/*** connect to db ***/
$dbh = new PDO("mysql:host=localhost;dbname=sfriends", 'root', 'superbart');
/*** set the error mode ***/
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
/*** our sql query ***/
$stmt = $dbh->prepare("INSERT INTO testblob (image_type ,image, image_size, image_name, user_id) VALUES (? ,?, ?, ?, ?)");
/*** bind the params ***/
$stmt->bindParam(1, $type);
$stmt->bindParam(2, $imgfp, PDO::PARAM_LOB);
$stmt->bindParam(3, $size);
$stmt->bindParam(4, $name);
$stmt->bindParam(5, $id);
/*** execute the query ***/
$stmt->execute();
}
else
{
/*** throw an exception is image is not of type ***/
throw new Exception("File Size Error");
}
}
else
{
// if the file is not less than the maximum allowed, print an error
throw new Exception("Unsupported Image Format!");
}
}
?>
Maar als ik dat probeer geeft hij het volgende aan:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null.
Hoe kan dit?
$id is nergens gedefineerd binnen je functie.
Daarbij:
- images opslaan in een db? :/
- functie definieren binnen een if/try statement (en daarna maar 1x uitvoeren)? :/
action='YourPhotos2.php?id=$id&&username=$username' method='post'
Ook de filesize in je HTML zetten is een erg stomme zet, doe dit in PHP want de gebruiker kan nu via het formulier zelf de bestandsgrootte insetellen, dus word je server lekker volgezet met grote bestanden.
input type='hidden' name='MAX_FILE_SIZE' value='99999999'
Ik ben bezig met het maken van een zoekfunctie voor het zoeken van een gebruiker.
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
$term = $_POST['term'];
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username=$term")) {
$row = mysqli_fetch_assoc($result);
if ($row['COUNT(*)'] == 0) {
while($row = mysqli_fetch_array($result)) {
echo '<br/> First Name: '.$row['username'];
echo '<br/><br/>';
}
echo "";
}}
else {
// no
// print status message
echo "No rows found!";
}
// free result set memory
mysqli_close($con);
?>
$term = $_POST['term'];
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username=$term")) {
$row = mysqli_fetch_assoc($result);
if ($row['COUNT(*)'] == 0) {
while($row = mysqli_fetch_array($result)) {
echo '<br/> First Name: '.$row['username'];
echo '<br/><br/>';
}
echo "";
}}
else {
// no
// print status message
echo "No rows found!";
}
// free result set memory
mysqli_close($con);
?>
dit is de php code van de zoekfunctie.
Als ik naar een naam zoek die ook echt in 'users' staat, zegt hij:"No rows found".
terwijl hij als hij een gebruiker vind, hem wel hoort te weergeven.
2. SQL-injection is mogelijk!
3. moet je zoeken in een tabel niet met LIKE-keyword van SQL doen?
LIKE of = maakt geen verschil.
WHERE username = '$term'
of
WHERE username LIKE '%$term%'
(ander punt: beveilig je invoer: http://wiki.pfz.nl/sqlinjectie )
Dan laat hij een blanco pagina zien.
if ( isset($_SESSION['username']) ) {
hiermee beveilig je dat het form alleen getoond wordt als iemand ingelogd is.
Echter: je kijkt nergens meer naar als je de upload verwerkt.
Als iemand de action aanpast tot action='YourPhotos2.php?id=10&&username=bart'
dan zal dat zomaar verwerkt worden.
En dat terwijl bij het verwerken ook de $_SESSION gewoon beschikbaar is. Je hoeft dit dus niet zichtbaar mee te sturen.
Toevoeging op 16/10/2015 10:39:15:
Bart de kinkelaar op 16/10/2015 10:36:39:
Dan laat hij een blanco pagina zien.
Dan heb je een fatal error aan je broek hangen (parse error) en heb je je error reporting uit staan.
Zet die aan, of zoek de error in je log files (gewoon op scherm zetten is natuurlijk een heel stuk eenvoudiger) https://www.pfz.nl/wiki/troubleshooter/#stap-1-regel-een-foutmelding
Gewijzigd op 16/10/2015 10:39:47 door Ivo P
Blanco pagina blijft blanco.
Error reporting staat aan?
Zowel die code die je volgens de site bovenaan de pagina moest zetten staat er als de code die je in PHP.ini moest plaatsen.
In dat geval moet je dus in php.ini, of gemakkelijker in .htaccess, de reporting aan zetten.
Als je voor php.ini kiest, moet je ook de server (apache) restarten.
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
$term = $_POST['term'];
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username=$term")) {
$row = mysqli_fetch_assoc($result);
if ($row['COUNT(*)'] == 0) {
while($row = mysqli_fetch_array($result)) {
echo '<br/> First Name: '.$row['username'];
echo '<br/><br/>';
}
echo "";
}
}
else {
// no
// print status message
echo "No rows found!";
}
// free result set memory
mysqli_close($con);
?>
$term = $_POST['term'];
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username=$term")) {
$row = mysqli_fetch_assoc($result);
if ($row['COUNT(*)'] == 0) {
while($row = mysqli_fetch_array($result)) {
echo '<br/> First Name: '.$row['username'];
echo '<br/><br/>';
}
echo "";
}
}
else {
// no
// print status message
echo "No rows found!";
}
// free result set memory
mysqli_close($con);
?>
Beetje netter inspringen geeft meer inzicht/overzicht.
No rows found! is te zien als de query is mislukt.
Als $row['COUNT(*)'] == 0 ga je proberen om $row['username'] te laten zien.
Maar 0 is toch niks gevonden.
En username wordt niet opgehaald.
als je zoekt met een query waarbij username=x
dan hoef je niet uit $row[] te zoeken wat er in de db stond bij dat record voor username. dat namelijk $term (zij het eventueel hoofdletter ongevoelig, afhankelijk van je db settings.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$term = $_POST['term'];
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username LIKE "%$term%"")) {
$row = mysqli_fetch_assoc($result);
if ($row['COUNT(*)'] == 1) {
while($row = mysqli_fetch_array($result)) {
echo "Je bent ingelogd als";
}
}}
else {
// no
// print status message
echo "No rows found!";
}
// free result set memory
mysqli_close($con);
?>
$term = $_POST['term'];
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username LIKE "%$term%"")) {
$row = mysqli_fetch_assoc($result);
if ($row['COUNT(*)'] == 1) {
while($row = mysqli_fetch_array($result)) {
echo "Je bent ingelogd als";
}
}}
else {
// no
// print status message
echo "No rows found!";
}
// free result set memory
mysqli_close($con);
?>
Zowel in het geval van zonder als in geval van met If count = 1, krijg ik de volgende error:
Warning: Division by zero in .... on line 22.
lijn 22 is de mysqli query.
Toevoeging op 16/10/2015 15:16:38:
En ik ben erachter dat dat komt omdat hij niks met die specifieke username kan vinden.
Maar dat is raar want dat hoort hij wel te doen.
Maak er eens van:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
...
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username LIKE '%".mysqli_real_escape_string($con, $term)."%'")) {
...
?>
...
if ($result = mysqli_query($con,"SELECT COUNT(*) FROM users WHERE username LIKE '%".mysqli_real_escape_string($con, $term)."%'")) {
...
?>
Daarnaast kan een LIKE query best meerdere resultaten opleveren, dus waarom == 1?
En als je dan toch == 1 gebruikt, waarom dan een while, je hebt met == 1 altijd precies één resultaat...
Nu lijkt mij dat dat kan met:
Code (php)
1
if ($result = mysqli_query($con,"SELECT id,username FROM users WHERE username LIKE '%".mysqli_real_escape_string($con, $term)."%'")) {
Maar wat moet dan hier
komen te staan ipv count. Want zet ik er een van de twee (id of username) dan werkt hij logischerwijs niet.
// laat zien
else
// niks gevonden
Dit moet dan vervolgens PRECIES één resultaat opleveren. Dit kun je controleren door resultaten te tellen, dit doe je met mysqli_num_rows().
Code (php)
Ik zou als ik jou was jezelf aanleren de object georienteerde schrijfwijze van MySQLi te gebruiken, in plaats van de procedurele variant die je nu gebruikt.
Verder hoop ik dat je voorzieningen hebt ingebouwd die garanderen dat gebruikersnamen uniek zijn in je systeem, anders levert die query mogelijk meerdere resultaten op...
Gewijzigd op 16/10/2015 15:44:16 door Thomas van den Heuvel