2017-02-22 51 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。