php
  • mysql
  • ajax
  • 2017-04-26 54 views 0 likes 
    0

    我創建一個記錄系統,爲此,我希望用戶保存的個人資料圖片帶基本信息(姓名,用戶名,密碼)一起發送圖像。對於這一點,我已經編寫了以下文件:PHP - 無法通過mysqli_stmt_send_long_data

    HTML表單(在的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> 
    

    因此,CSS可能混淆了一點,但基本形式如下:

    <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> 
    

    所以signupbtn按鈕具有附着在文檔加載一個onclick事件(也是在index.php文件,我沒有展示這一切,因爲它是不適合此):

    $(function() { 
         $('#signupbtn').click(function(e) { 
         e.preventDefault(); 
         e.stopImmediatePropagation(); 
    
         $.ajax({ 
          type: "POST", 
          url: "signup.php", 
          data: $('#signupform').serialize(), 
          success: function(response){ 
          //... 
          } 
         }); 
         return false; 
         }); 
    
        //... 
    
    }); 
    

    所以我用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; 
    ?> 
    

    我檢索所有表單中的信息,然後使用mysqli_stmt_send_long_data在插入我的形象成表,這是在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, 
                       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()); 
         } 
        } 
    ?> 
    

    由於你會期望,因爲我問這個問題,Ajax成功結束,並插入行。但是,當我檢查phpMyAdmin的在我的網站的數據庫中,我得到了img領域具有[BLOB - 0 B]值這隻能意味着圖片上傳不工作。可能是什麼情況?我在send_long_data上找不到任何工作,但也許有人遇到了同樣的問題。提前感謝您提供任何答案。

    +1

    **永不**存儲純文本密碼。你應該使用['password_hash()'](http://us3.php.net/manual/en/function.password-hash.php)和['password_verify()'](http://us3.php。 net/manual/en/function.password-verify.php)。如果您使用的是5.5之前的PHP版本,請不要**使用MD5或SHA1來散列密碼。相反,您可以使用[此兼容包](https://github.com/ircmaxell/password_compat)。 –

    +1

    列的字段類型是什麼? –

    +0

    @Alex Howansky是的,我明白了。這不會是我的最終版本。如果可以的話,我想學習如何加密密碼等,但是我開始進行圖像插入並卡在這裏! – gfcf14

    回答

    0

    Jay Blanchard的建議後,我決定放棄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()); 
         } 
        } 
    ?> 
    

    所以,現在有兩個新領域:性(1個字符,以節省是「M」或「F」),和img(最多5個字符來保存圖像EXTENSION)。讓這一點非常重要的是,爲了讓這個表單感覺更完整,用戶應該有機會選擇他們自己的圖像,或者選擇一個臨時的默認圖像。這就是爲什麼性別領域是重要的,什麼反映形式的變化:

    <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> 
    

    所以現在,當我按下signupbtn,二AJAX函數調用,這取決於是否選中該複選框:

    $(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) { 
          //... 
          } 
         }); 
         }); 
    
         //... 
    }); 
    

    如果沒有選中該複選框,則用戶上傳自己的形象。在這種情況下,我做一個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); 
    ?> 
    

    的代碼更簡單似乎比。雖然總是建議檢查該文件是否爲圖像,如果大小是正確的,那麼我已經在javascript中這樣做了,所以我甚至不打擾到這裏。在這裏,我得到Users表的行數,以便我可以得到下一個用戶。我這樣做是因爲我發現使用通用名稱保存上傳圖像更方便(在這種情況下,根據表中是否有n行,新用戶的圖像將被保存爲usern.ext,其中ext將是擴展名(jpg ,PNG,GIF等)),而不必保留原始圖像名稱的整個字符串。

    在用戶選擇默認的情況下,該分機變成no以在其顯示器上指示。基本上,在index.php另一種形式被用於登錄,提供用戶名和密碼,名爲signin.php文件:

    <?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"); 
    ?> 
    

    所以當所有這些值的用戶日誌存儲在$ _SESSION,然後頁面刷新。這是這樣,如果一個用戶登錄,他們的信息可以證明,而不是提示註冊或登錄(其中被隱藏),用登出按鈕一起:

    <?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>"; 
         } 
        ?> 
    

    這是我所有的心計走到一起,如果$_SESSION['img']no的,然後我調用默認的圖像,mdef.pngfdef.png,這取決於用戶選擇在簽署後,這一行:

    echo "<img src='Users/" . $_SESSION['sex'] . "def.png' alt=''>"; 
    

    而且,如果用戶提供一張圖片,我用它們的ID和存儲的擴展名稱:

    echo "<img src='Users/user" . $_SESSION['id'] . "." . $_SESSION['img'] . "' alt=''>"; 
    

    我沒有顯示我的所有代碼,因爲我想先完成我的表單。我還沒有對密碼,確認電子郵件,密碼恢復和用戶個人資料頁面進行散列處理(既可以查看未登錄的用戶,也可以查看用戶的編輯狀態)。一旦我完成了這個,我會記錄我的進度,並在這裏留下一個視頻鏈接。感謝所有幫助我達到這個狀態的人。

    最後編輯:該項目已經完成!你會在這裏找到一個演示視頻:https://www.youtube.com/watch?v=cLpbKdTY_xo&t=2s

    相關問題