2017-02-07 1 views
0

私はajaxとphpファイルでhtmlを持っています。私はmysqliでネイティブPHPをデータベースに使用しています。接続では、名前がconfig.phpであることを知っています。このスクリプト:複数のクエリが動作しないAjax投稿

<?php 
 
$db = new mysqli('localhost', 'root', '', 'student'); 
 
?>

そして私はこのようにAjaxでのHTMLを持っています。このような学生/ action.phpスクリプトの

$("form#form").submit(function(event) { 
 
    event.preventDefault(); 
 
    var formData = new FormData($(this)[0]); 
 
    $.ajax({ 
 
     url: 'student/action.php', 
 
     type: 'POST', 
 
     data: formData, 
 
     async: false, 
 
     cache: false, 
 
     contentType: false, 
 
     processData: false, 
 
     success: function(data) { 
 
      console.log(data); 
 
      if (data == 0) { 
 
       alert('all data updated'); 
 
      } else { 
 
       alert('failed'); 
 
      } 
 
     } 
 
    }); 
 
    return false; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<body> 
 
    <form id='form'> 
 
     <input type='hidden' name='type' value='new-data'> 
 
     <input name='name' type='text'> 
 
     <input name='class' type='text'> 
 
     <input name='hobbies' type='text'> 
 
     <button type='submit' name='submit'>Submit</button> 
 
    </form> 
 
</body>

<? 
 
php require_once '../config/config.php'; 
 
switch ($_POST[ 'type']) { 
 
    case "new-data": 
 
    $qry1=$db->query("INSERT INTO tableA SET id=NULL, name='$_POST[name]' "); 
 

 
    $qry2=$db->query("INSERT INTO tableB SET id=NULL, name='$_POST[class]' "); 
 

 
    $qry3=$db->query("INSERT INTO tableC SET id=NULL, name='$_POST[hobbies]' "); 
 

 
    if($qry1 && $qry2 && $qry3) { 
 
     echo '1'; 
 
    } else { 
 
     echo '2'; 
 
    } 
 
    break; 
 
} 
 
?>

いや、これは安定していない接続をホスティングし、ここでのアプリ。私がクリックsubmitによって提出すると、student/action.phpにデータが投稿されます。すべてのクエリ($ qry1、$ qry2、および$ qry3)を挿入する必要がありますが、接続が不良な場合は、すべてではなく一部のクエリのみを挿入します。それを解決する方法。おかげ

+1

$ dbからのスペースを削除 –

+1

トランザクションを参照してください – Strawberry

+0

私の接続が良好であればすべてのクエリが成功しましたが、接続が悪い場合はクエリが成功しました。私は方法、3つのクエリを1つのパッケージに挿入する方法をしたい。私の接続が悪い場合、それは挿入されていませんし、接続が良い場合は、このパッケージクエリの挿入が成功しました。おかげで –

答えて

1

まず、なかれmysqli_real_escape_string使用し、直接(理由はSQLインジェクションの)クエリに$ _POST、$ _GET、$ _REQUESTを使用することはありません:

$name=$db->mysqli_real_escape_string($_POST['name']); 
$class=$db->mysqli_real_escape_string($_POST['class']); 
$hobbies=$db->mysqli_real_escape_string($_POST['hobbies']); 

を引用符

の場合を忘れないでくださいすべてのリクエストが実行されるか、すべてのトランザクションが失敗することを確認したい(あなたはinnodbストレージエンジンが必要です)。

$db->begin_transaction(); 

//Your queries… 

$db->commit(); 

1つのリクエストが失敗した場合、前のリクエストはすべてロールバックされます。 $ db-> rollback()を使うことができます。コミットする前にすべてのクエリをキャンセルします。詳細はphp docを参照してください。

+0

ありがとうNeo、私はそれを試みます。それは私が望む見ている。応援します... –

+0

ありがとうNeo、私はそれを試みます。それは私が望む見ている。私は準備された文章を使用しました。何がベスト? –

+0

プリペアドステートメントは複数の同じクエリを高速化することができますが、トランザクションではありません。$ db-> begin_transaction();を使用します。および$ db-> commit(); innodb/xtradbストレージエンジンを使用します。 – neoteknic

関連する問題