2017-02-22 22 views
0

編輯:在我的評論「解決方案」下面MySQL的語法錯誤,但在MySQL的終端作品

我做一個AJAX後到我的後端PHP,其中表單數據被髮送到一個專門的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回聲聲明吐出到Web控制檯,所以這就是程序逐字輸出的內容。

這裏的PHP:

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 
{ 

} 

編輯:這裏是PHP函數的CreateTask和ReadTask:

// 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錯誤沒有成功完成。但是,當我將相同的語句粘貼到我的MySQL PuTTY窗口而沒有附加格式時,它就可以接受它。在嘗試以相同的信息再次運行之後,程序檢測到行存在並且回聲「行存在!」正如它應該的那樣。我已驗證所有憑據是否正確,連接是否按預期打開。

LAST_INSERT_ID()僅限於PDO或PHP中的具體實現嗎?我認爲MySQL是爲了解釋這一點。

如果您好奇,我已經將tblTask​​及其內容分割爲tblTask​​Content,因爲我希望用戶能夠在他們的任務中添加更新。在tblTask​​Content中有一個tblTask​​ ID FK和一個時間戳,用於根據更新輸入時間保持數據鏈接和排序。

+1

據我所知,PHP不能堆積查詢字符串 – Jer

+0

'$ sql =「START TRANSACTION;」;'是不是你的數據庫連接,假設開始一個交易?像$ 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。