Ich bin ein Logging-System zu schaffen, für die ich den Benutzer wünschen, zusammen mit grundlegenden Informationen (Name, Benutzername, Passwort) sein Profil Bild zu speichern. Dazu habe ich diese Dateien kodiert:PHP - Kein Bild über mysqli_stmt_send_long_data senden
Das HTML-Formular (bei index.php):
<form id='signupform' enctype="multipart/form-data">
<table style='margin: 0px auto; border-collapse: separate; border-spacing: 0 1em; color: #ffffff;'>
<tr>
<th colspan='2'>
<h2>SIGN UP</h2>
<p>
Please fill out ALL the fields
</p>
</th>
</tr>
<tr>
<td colspan='2'>
<div id='signuperror' style='display: block; width: 100%; height: 20px; border: 2px solid #ff0000; border-radius: 10px; background-color: #ffffff; color: #ff0000; text-align: center; opacity: 0;'>Username is taken!</div>
</td>
</tr>
<tr>
<td style='text-align: right;'>
First Name:
</td>
<td>
<input id='fname' type='text' name='first' placeholder='First Name' onkeyup="checkComplete('signup');" />
</td>
</tr>
<tr>
<td style='text-align: right;'>
Last Name:
</td>
<td>
<input id='lname' type='text' name='last' placeholder='Last Name' onkeyup="checkComplete('signup');" />
</td>
</tr>
<tr>
<td colspan='2' style='text-align: center;'>
<input id='usrimg' type='file' accept='image/*' name='userimage' style='display: none;' />
<table style='width: 100%;'>
<tr>
<td style='width: 90%;'>
<button type='button' class='popbtn' onclick='browseImage();' style='width: 100%;'>Profile Image</button>
</td>
<td style='width: 10%;'>
<img id='imgstats' style='vertical-align: middle; display: none;' src='imgsuccess.png' />
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td style='text-align: right;'>
Username:
</td>
<td>
<input id='username' type='text' name='uid' placeholder='Username' onfocusout="checkUID(this.value);" onkeyup="checkComplete('signup');" />
</td>
</tr>
<tr>
<td style='text-align: right;'>
Password:
</td>
<td>
<input id='password' type='password' name='pwd' placeholder='Password' onkeyup="checkComplete('signup');" />
</td>
</tr>
<tr>
<td colspan='2' style='text-align: center;'>
<button type='button' id='signupbtn' class='popbtn' disabled='disabled'>SIGN UP</button>
</td>
</tr>
</table>
</form>
So kann die CSS ein wenig verwirren, aber im Grunde die Form ist wie folgt:
<form id='signupform' enctype="multipart/form-data">
<input id='fname' type='text' name='first' />
<input id='lname' type='text' name='last' />
<input id='usrimg' type='file' name='userimage' />
<input id='username' type='text' name='uid' />
<input id='password' type='password' name='pwd' />
<button type='button' id='signupbtn'>SIGN UP</button>
</form>
so ist die signupbtn
Taste hat eine onclick
Ereignis auf Dokument Last befestigt (auch bei index.php, zeige ich es nicht alles, wie es nicht relevant für diese ist):
$(function() {
$('#signupbtn').click(function(e) {
e.preventDefault();
e.stopImmediatePropagation();
$.ajax({
type: "POST",
url: "signup.php",
data: $('#signupform').serialize(),
success: function(response){
//...
}
});
return false;
});
//...
});
So
Ich benutze Ajax um die Datei zu nennen signup.php
das Formular ohne erfrischend zu unterbreiten. Dann auf diese Datei:
<?php
session_start();
include('connect.php');
$first = $_POST['first'];
$last = $_POST['last'];
$img = mysqli_real_escape_string(file_get_contents($_FILES['userimage']['tmp_name']));
$uid = $_POST['uid'];
$pwd = $_POST['pwd'];
$query = "insert into Users (first, last, img, uid, pwd) values (?,?,?,?,?)";
$stmt = mysqli_prepare($connect, $query);
mysqli_stmt_bind_param($stmt, 'ssbss', $first, $last, $img, $uid, $pwd);
mysqli_stmt_send_long_data($stmt, 2, $img);
$res = mysqli_stmt_execute($stmt);
echo $res;
?>
ich alle Informationen aus dem Formular abrufen, dann mysqli_stmt_send_long_data
verwenden, um das Einfügen mein Bild in die Tabelle, um zu versuchen, die auf connect.php erstellt:
<?php
$host_name = "xxx";
$database = "xxx";
$user_name = "xxx";
$password = "xxx";
$connect = mysqli_connect($host_name, $user_name, $password, $database);
if(mysqli_connect_errno()) {
echo '<p>Failed to connect to MySQL: '.mysqli_connect_error().'</p>';
}
else {
//echo '<p>Connection to MySQL server successfully established.</p>';
$db_selected = mysqli_select_db($connect, $database);
if ($db_selected) {
$userTableName = 'Users';
$userTableExists = mysqli_query($connect, "select * from $userTableName");
if (!$userTableExists) {
echo 'The table ' . $userTableName . ' does not exist. Creating...<br /><br />';
$sqlCreateTable = "create table " . $userTableName . "(id int(11) not null PRIMARY KEY AUTO_INCREMENT,
first varchar(128) not null,
last varchar(128) not null,
img longblob not null,
uid varchar(128) not null,
pwd varchar(1000) not null)";
$result = mysqli_query($connect, $sqlCreateTable);
if ($result) {
echo 'Table ' . $userTableName . ' created...<br>';
}
else {
die("Cannot create table " . $userTableName . ": " . mysql_error());
}
}
}
else {
die("Cannot use " . $database . ": " . mysql_error());
}
}
?>
Wie du würdest erwarten, da ich die Frage stelle, endet der Ajax mit Erfolg und die Zeile wird eingefügt. Aber während ich phpMyAdmin in der Datenbank meiner Site überprüfe, bekomme ich, dass das img
Feld einen Wert von [BLOB - 0 B]
hat, was nur bedeuten kann, dass das Hochladen des Bildes nicht funktioniert. Was könnte der Fall sein? Ich habe sehr wenig gefunden auf send_long_data funktioniert nicht, aber vielleicht hat jemand das gleiche Problem gehabt. Vielen Dank für die Antworten im Voraus.
** Nie ** speichern Klartext Passwörter. Sie sollten ['password_hash()'] (http://us3.php.net/manual/en/function.password-hash.php) und ['password_verify()'] (http: //us3.php) verwenden. net/manual/de/function.password-verify.php) statt. Wenn Sie eine Version von PHP vor Version 5.5 verwenden, verwenden Sie ** nicht ** MD5 oder SHA1, um Passwörter zu hashen. Stattdessen können Sie [dieses Kompatibilitätspaket] (https://github.com/ircmaxell/password_compat) verwenden. –
Was ist der Feldtyp der Spalte? –
@Alex Howansky Ja, ich komme dazu. Dies wird nicht meine endgültige Version sein. Wenn ich kann, möchte ich lernen, das Passwort und so zu salzen, aber ich fing an, das Bild einzufügen und steckte hier fest! – gfcf14