2017-04-24 24 views
0

私は姓/名字変更用のユーザパネルを作成しようとしています。MySQL/PHP/jQuery - クエリの問題

私はconsole.log(data){fname: "Damian", lname: "Doman", id: "20"}を見ることができるので、$ajaxフォーム処理がうまくいっているようです。

また、phpクラスは私がフォームを送信した後も実行されているようですが、print 'Your name has been changed! To go back, please click <a href="userpage.php">here</a>';という意味です。

最後に、クエリー自体(UPDATE members SET fname = ?, lname = ? WHERE id = ?)は疑問符ではなく値でSQLコンソールを手動で起動すると完全に機能します。

まだ全体のスクリプトはうまくいきません、私はそれが成功しているというメッセージを受け取りますが、まだテーブルはUPDATEを取得しません。

HTML:

<div class="changename-form-wrapper"> 
    <h1>Define your first and last names here:</h1> 
    <div class="form-group"> 
     <input type="text" name="fname" id="fname" tabindex="3" class="form-control ui-autocomplete-input" placeholder="First name..." value=""> 
    </div> 
    <div class="form-group"> 
     <input type="text" name="lname" id="lname" tabindex="4" class="form-control ui-autocomplete-input" placeholder="Last name..."> 
    </div> 
    <div class="form-group"> 
     <input type="text" name="id" id="id" tabindex="4" class="form-control ui-autocomplete-input" style="display:none;" value="<?=$_SESSION['user']['id']?>"> 
    </div> 
    <div class="form-group"> 
     <div class="row"> 
      <div class="col-sm-6 col-sm-offset-3"> 
       <input type="button" name="name-submit" id="name-submit" tabindex="4" class="form-control btn btn-login" value="Apply"> 
      </div> 
     </div> 
    </div> 
</div> 
<div class="alert-space"> 
    <div class="ui-widget" style="display:none;"> 
     <div class="ui-state-error ui-corner-all"> 
      <div class="p"><span class="ui-icon ui-icon-alert"></span></div><div class="p"><div class="ui-state-error-text"></div></div> 
     </div> 
    </div> 
</div> 

jQueryの/ AJAX:

$("#name-submit").click(function(){ 
       var data = { "fname": $('#fname').val(), "lname": $('#lname').val(), "id": $('#id').val() }; 
       if($("#fname").val() != "" && $("#lname").val() != ""){ 
        $.ajax({ 
         method: "POST", 
         url: 'changename.php', 
         data: data, 
        }).done(function(msg) { 
         console.log(data); 
         if(msg !== ""){ 
          $(".ui-widget").show(); 
          $(".ui-state-error-text").html(msg); 
         }else{ 
          window.location = "userpage.php"; 
         } 
        }); 
       }else{ 
        $(".ui-widget").show(); 
        $(".ui-state-error-text").html("<strong>Error:</strong> Please, fill in both the first and last name."); 
       } 
      }); 

CHANGENAME.PHPのフォームハンドラ:

<?php 
    require_once '../../class/user.php'; 
    require_once '../../config.php'; 

    $id = filter_input(INPUT_POST, 'id', FILTER_SANITIZE_STRING); 
    $fname = filter_input(INPUT_POST, 'fname', FILTER_SANITIZE_STRING); 
    $lname = filter_input(INPUT_POST, 'lname', FILTER_SANITIZE_STRING); 

    if($user->userUpdate($id, $fname, $lname)) { 
     print 'Your name has been changed! To go back, please click <a href="userpage.php">here</a>'; 
     die; 
    } else { 
     $user->printMsg(); 
     die; 
    }; 

そして最後にuserUpdate($id, $fname, $lname)クラスコード:

public function userUpdate($id,$fname,$lname){ 
     $pdo = $this->pdo; 
     if(isset($id) && isset($fname) && isset($lname)){ 
      $stmt = $pdo->prepare('UPDATE members SET fname = ?, lname = ? WHERE id = ?'); 
      if($stmt->execute([$id,$fname,$lname])){ 
       return true; 
      }else{ 
       $this->msg = 'User information change failed.'; 
       return false; 
      } 
     }else{ 
      $this->msg = 'Provide a valid data.'; 
      return false; 
     } 
    } 

私が間違って何をしているのですか?私は現時点でコンソールに何のエラーもありません。

+0

jqueryを除外してフォームに入れてみませんか? –

+2

'if($ stmt-> execute([$ id、$ fname、$ lname])){'はそのクエリの順序が間違っているようです。 –

+0

クエリが正しく実行され、何も更新されないため、エラーは発生しません。 –

答えて

1

executeに指定している配列の値の順序が間違っている場合は、クエリの順序と一致するように$fname, $lname, $idにする必要があります。

しかし、私は、順序付けられたプレースホルダの代わりに名前付きプレースホルダを使用することをお勧めします。それでは、順序は関係ありません。

$stmt = $pdo->prepare('UPDATE members SET fname = :fname, lname = :name WHERE id = :id'); 
$stmt->execute([':id' => $id, ':fname' => $fname, ':lname' => $lname]); 
+0

お返事ありがとうございます!私がコメントセクションに書いたのと同じように、それは簡単だとは信じられません。ですから、 'execute'の正しい順序は、これらの名前/変数を' MySQLクエリ 'に表示する順序と同じでなければなりません。プレースホルダーのトリックも、この問題のために私に多くの苦労を救うようです。 –