PHP-无法通过mysqli\u stmt\u send\u long\u数据发送图像

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

我正在创建一个日志系统,我希望用户将其配置文件图像与基本信息(名称、用户名、密码)一起保存。为此,我对这些文件进行了编码:

HTML表单(位于index.php):

因此,我使用ajax调用文件
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=''>";