2017-02-22 3 views
0

EDIT:MySQLの構文エラー、しかしMySQLの端子での作品

は、私は、フォームデータを専用に送信されます私のバックエンドのPHPにAJAX POSTをしています以下の私のコメントで「解決策」 CRUD PHPフォームを使用してレコードを作成します。

SQL構文は2つのコマンドが必要です。したがって、私はこのように、BEGIN TRANSACTION; statements; COMMIT;構造を使用します。すべての文を区切っても

START TRANSACTION; 
INSERT INTO tblTask (subject, dateOpened, priority) VALUES 
    ('test 1', '2017-02-22 07:09:33', 3); 
INSERT INTO tblTaskContent (idTask, dateEntered, text) VALUES 
    (LAST_INSERT_ID(), '2017-02-22 07:09:33', 'fdsa'); 
COMMIT; 

は*、明確にするためにフォーマット。次のスペース。

これは、MySQLステートメントがPHPのechoステートメントを介してWebコンソールに送信されるため、そのまま出力されます。

if($action == 1)  //CREATE 
{ 
    if($taskVarArr['subject'] && $taskVarArr['priority'] && $taskVarArr['content']) //can create the initial record 
    { 
     if(ReadTask($taskVarArr)) //task exists, consider updating existing record 
     { 
      echo "Row exists!"; //TODO IS DEBUG 
      return http_response_code(400); 
      die(); 
     } 
     else if(CreateTask($taskVarArr)) //new record, insert 
     { 
      return http_response_code(200); 
      die(); 
     } 
    } 

    //if this reached, bad request 
    return http_response_code(400); 
    die(); 
} 
elseif($action == 2) //READ ...not used yet 
{ 

} 

EDIT:ここ

はPHPです
// Create - CRUD 
function CreateTask($taskVarArr) //sorry for your eyes 
{ 
    $conn = OpenConnection(); 
    $workingDate = date('Y-m-d h:i:s'); 

    $sql = "START TRANSACTION; "; 
    $sql .= "INSERT INTO tblTask (subject, dateOpened, priority) VALUES ". 
     "('".$taskVarArr['subject']."', '$workingDate', ".$taskVarArr['priority']."); "; //TODO below this breaks 
    $sql .= "INSERT INTO tblTaskContent (idTask, dateEntered, text) VALUES ". 
     "(LAST_INSERT_ID(), '$workingDate', '".$taskVarArr['content']."'); "; //LAST_INSERT_ID() grabs last autonumber 
    $sql .= "COMMIT;"; 

    //TODO IS DEBUG 
    echo $sql; 
    //TODO IS DEBUG 

    $result = mysqli_query($conn, $sql); 
    if($result) 
    { 
     return true; 
    } 

    return false; 
} 

// Read - CRUD; Only checks if record exists 
function ReadTask($taskVarArr) 
{ 
    $conn = OpenConnection(); 

    $sql = "SELECT idTask from tblTask WHERE subject = '".$taskVarArr['subject']."';"; 
    $result = mysqli_query($conn, $sql); 
    if (mysqli_num_rows($result) > 0) { 
     $row = mysqli_fetch_assoc($result); 
     return $row['idTask']; 
    } 

    return false; 
} 

私はReadTaskがレコードとCreateTaskを見つけることができませんので、作成時に400エラーが表示されます。ここではPHPの機能CreateTaskとReadTaskがあります正常に完了しません。しかし、同じ文を別の書式設定なしでMySQL PuTTYウィンドウに貼り付けると、それは問題なく受け入れられます。同じ情報で再度実行しようとすると、プログラムは行が存在することを検出し、「行は存在します」とエコーします。それが想定されている通りです。すべての資格情報が正しいことを確認し、接続が期待どおりに開かれています。

LAST_INSERT_ID()は、PDOまたはPHPの特定の実装に限定されていますか?私はMySQLがそれを解釈することを意図していると思った。

好奇心が強い人は、tblTask​​ContentのtblTask​​とそのコンテンツを分割しました。なぜなら、ユーザーは自分の仕事に更新を加えることができるからです。 tblTask​​ContentにはtblTask​​ id FKとタイムスタンプがあり、更新エントリ時間に基づいてデータをリンクしてソート可能に保ちます。

+1

私が知る限り、PHPはクエリ文字列を積み重ねることができません。 – Jer

+0

'$ sql =" START TRANSACTION; ";'トランザクションを開始すると思われるDB接続ではありませんか? $ con-> ST .....のようになる –

答えて

0

固定。

// Create - CRUD 
function CreateTask($taskVarArr) //sorry for your eyes 
{ 
    $conn = OpenConnection(); 
    $workingDate = date('Y-m-d h:i:s'); 

    $sql = "INSERT INTO tblTask (subject, dateOpened, priority) VALUES ". 
     "('".$taskVarArr['subject']."', '$workingDate', ".$taskVarArr['priority']."); "; 
    if(mysqli_query($conn, $sql)) 
    { 
     $sql = "INSERT INTO tblTaskContent (idTask, dateEntered, text) VALUES ". 
      "(LAST_INSERT_ID(), '$workingDate', '".$taskVarArr['content']."'); "; //LAST_INSERT_ID() grabs last autonumber 
     if(mysqli_query($conn, $sql)) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

これはダム解決策です。 mysqli_querysが動作した後、mysqli_autocommitとmysqli_commitの両方を利用することを望んでいましたが、そうではありません。私がPDOを使用する方法を学ぶ必要があるのではないかと思います。