PHP-无法通过mysqli\u stmt\u send\u long\u数据发送图像
我正在创建一个日志系统,我希望用户将其配置文件图像与基本信息(名称、用户名、密码)一起保存。为此,我对这些文件进行了编码: HTML表单(位于index.php): 因此,我使用ajax调用文件PHP-无法通过mysqli\u stmt\u send\u long\u数据发送图像,php,mysql,ajax,Php,Mysql,Ajax,我正在创建一个日志系统,我希望用户将其配置文件图像与基本信息(名称、用户名、密码)一起保存。为此,我对这些文件进行了编码: HTML表单(位于index.php): 因此,我使用ajax调用文件signup.php,提交表单而不刷新。然后在该文件上: <?php session_start(); include('connect.php'); $first = $_POST['first']; $last = $_POST['last']; $img = mysql
signup.php
,提交表单而不刷新。然后在该文件上:
<?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;
?>
正如我提出这个问题后您所期待的,Ajax以成功结束,并且插入了行。但是当我在我的站点数据库上检查phpMyAdmin时,我发现img
字段的值为[BLOB-0b]
,这只能说明图像上传不起作用。可能是什么情况?我发现很少有发送数据不起作用,但可能有人也有同样的问题。感谢您提前给出答案。在收到您的建议后,我决定放弃BLOB想法,而是保存有关图像的字符串信息。为此,我首先修改了connect.php
文件以创建更好的表版本:
<?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,
sex varchar(1) not null,
img varchar(5) 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());
}
}
?>
如果未选中该复选框,则用户必须上载自己的图像。在本例中,我制作了一个FormData,以便在ajax下正确上载(注意:我浪费了大量时间将signupform
指定为参数。该文件将永远不会以这种方式上载),然后在追加所有内容后,我调用ajax函数,该函数将调用uploadimage.php
:
<?php
include('connect.php');
$res = mysqli_query($connect, "select count(1) from Users");
$row = mysqli_fetch_array($res);
$imgnum = $row[0];
$dir = 'Users/';
$ext = $_POST['filextension'];
$file = $dir . 'user' . $imgnum . '.' . $ext;
$upload = move_uploaded_file($_FILES['userimage']['tmp_name'], $file);
?>
<?php
session_start();
include('connect.php');
$uid = $_POST['signinuid'];
$pwd = $_POST['signinpwd'];
$sql = "select * from Users where uid='$uid' and pwd='$pwd'";
$res = mysqli_query($connect, $sql);
$row = mysqli_fetch_assoc($res);
$_SESSION['id'] = $row['id'];
$_SESSION['first'] = $row['first'];
$_SESSION['last'] = $row['last'];
$_SESSION['sex'] = $row['sex'];
$_SESSION['img'] = $row['img'];
$_SESSION['uid'] = $row['uid'];
header("Location: http://....php");
?>
因此,当用户登录时,所有这些值都存储在$\u会话中,然后页面刷新。这样,如果用户登录,则可以显示其信息,而不是提示用户注册或登录(隐藏),同时显示注销按钮:
<?php
if ($_SESSION['id']) {
$soutid = 'signout';
echo "<table style='margin: 0px auto;'>";
echo "<tr>";
echo "<td colspan='2'>";
echo "<h1>WELCOME!</h1>";
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td>";
if ($_SESSION['img'] == 'no') {
echo "<img src='Users/" . $_SESSION['sex'] . "def.png' alt=''>";
}
else echo "<img src='Users/user" . $_SESSION['id'] . "." . $_SESSION['img'] . "' alt=''>";
echo "</td>";
echo "<td>";
echo "<div style='color: #007146; font-size: 20px; text-align: center;'>";
echo $_SESSION['first'] . " " . $_SESSION['last'] . "(" . $_SESSION['uid'] . ")";
echo "</div>";
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td colspan='2'>";
echo "<form id='$soutid' method='POST' action='signout.php'>";
echo "<button type='button' class='popbtn'>Sign Out</a>";
echo "</form>";
echo "</td>";
echo "</tr>";
echo "</table>";
}
?>
如果用户提供了一个图像,我用他们的id和存储的扩展名来调用它:
echo "<img src='Users/user" . $_SESSION['id'] . "." . $_SESSION['img'] . "' alt=''>";
echo”“;
我没有显示所有代码,因为我想先完成表单。我还没有对密码、确认电子邮件、密码恢复和用户配置文件页面进行过哈希处理(既可以查看未登录的用户,也可以查看需要编辑的用户)。完成后,我会记录我的进度,并在这里留下一个视频链接。感谢所有帮助我来到这个州的人
上次编辑:项目现在已完成!您将在此处看到演示视频:切勿存储纯文本密码。您应该使用和。如果您使用的是5.5之前的PHP版本,请不要使用MD5或SHA1散列密码。相反,你可以使用。列的字段类型是什么?这是@AlexHowansky的评论,但我会支持他的。你真的不应该在密码哈希上使用你自己的盐,你真的应该使用PHP来处理密码安全性。在散列之前,请确保对它们进行了清理或使用了任何其他清理机制。这样做会更改密码并导致不必要的额外编码。老实说,我不会将图像存储在数据库中。我会将其存储在服务器上,然后将图像的路径放入数据库中。水滴的速度是出了名的慢,没错。
<form id='signupform' enctype="multipart/form-data">
<input id='fname' type='text' name='first' />
<input id='lname' type='text' name='last' />
I am <input type='radio' name='sex' value='m' />Male <input type='radio' name='sex' value='f' />Female
<input id='usrimg' type='file' name='userimage' />
<input type='checkbox' id='imgdef' />Use a default image for now
<input id='username' type='text' name='uid' />
<input id='password' type='password' name='pwd' />
<button type='button' id='signupbtn'>SIGN UP</button>
</form>
$(function() {
$('#signupbtn').click(function(e) {
e.preventDefault();
e.stopImmediatePropagation();
var filextension;
if (!(document.getElementById('imgdef').checked)) {
filextension = $('#usrimg').val().substr($('#usrimg').val().lastIndexOf('.') + 1);
var fdata = new FormData();
fdata.append('first', $('#fname').val());
fdata.append('last', $('#lname').val());
fdata.append('sex', $("#signupform input[type='radio']:checked").val());
fdata.append('userimage', $('#usrimg').prop("files")[0]);
fdata.append('uid', $('#username').val());
fdata.append('pwd', $('#password').val());
fdata.append('filextension', filextension);
$.ajax({
type: "POST",
url: "uploadimage.php",
data: fdata,
processData: false,
contentType: false
});
}
else filextension = 'no';
$.ajax({
type: "POST",
url: "signup.php",
data: $('#signupform').serialize() + '&filextension=' + filextension,
success: function(response) {
//...
}
});
});
//...
});
<?php
include('connect.php');
$res = mysqli_query($connect, "select count(1) from Users");
$row = mysqli_fetch_array($res);
$imgnum = $row[0];
$dir = 'Users/';
$ext = $_POST['filextension'];
$file = $dir . 'user' . $imgnum . '.' . $ext;
$upload = move_uploaded_file($_FILES['userimage']['tmp_name'], $file);
?>
<?php
session_start();
include('connect.php');
$uid = $_POST['signinuid'];
$pwd = $_POST['signinpwd'];
$sql = "select * from Users where uid='$uid' and pwd='$pwd'";
$res = mysqli_query($connect, $sql);
$row = mysqli_fetch_assoc($res);
$_SESSION['id'] = $row['id'];
$_SESSION['first'] = $row['first'];
$_SESSION['last'] = $row['last'];
$_SESSION['sex'] = $row['sex'];
$_SESSION['img'] = $row['img'];
$_SESSION['uid'] = $row['uid'];
header("Location: http://....php");
?>
<?php
if ($_SESSION['id']) {
$soutid = 'signout';
echo "<table style='margin: 0px auto;'>";
echo "<tr>";
echo "<td colspan='2'>";
echo "<h1>WELCOME!</h1>";
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td>";
if ($_SESSION['img'] == 'no') {
echo "<img src='Users/" . $_SESSION['sex'] . "def.png' alt=''>";
}
else echo "<img src='Users/user" . $_SESSION['id'] . "." . $_SESSION['img'] . "' alt=''>";
echo "</td>";
echo "<td>";
echo "<div style='color: #007146; font-size: 20px; text-align: center;'>";
echo $_SESSION['first'] . " " . $_SESSION['last'] . "(" . $_SESSION['uid'] . ")";
echo "</div>";
echo "</td>";
echo "</tr>";
echo "<tr>";
echo "<td colspan='2'>";
echo "<form id='$soutid' method='POST' action='signout.php'>";
echo "<button type='button' class='popbtn'>Sign Out</a>";
echo "</form>";
echo "</td>";
echo "</tr>";
echo "</table>";
}
?>
echo "<img src='Users/" . $_SESSION['sex'] . "def.png' alt=''>";
echo "<img src='Users/user" . $_SESSION['id'] . "." . $_SESSION['img'] . "' alt=''>";