PHP应用程序中的MySQL语法错误,但在MySQL终端

时间:2017-02-22 12:21:20

标签: php mysql ajax post putty

编辑:我的评论中的'解决方案'

我正在对我的后端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控制台,这就是程序逐字输出的内容。

这是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;
}

我在创建时遇到400错误,因为ReadTask找不到记录而CreateTask没有成功完成。但是,当我将相同的语句粘贴到我的MySQL PuTTY窗口而没有额外的格式时,它接受它就好了。尝试使用相同的信息再次运行后,程序检测到存在的行并回显“Row exists!”因为它应该。我已经验证所有凭据都是正确的,并且正在按预期打开连接。

LAST_INSERT_ID()是否仅限于PDO或PHP中的特定实现?我认为MySQL的意思是解释它。

如果您感到好奇,我会将tblTask​​及其内容拆分为tblTask​​Content,因为我希望用户能够随时向其任务添加更新。在tblTask​​Content中有一个tblTask​​ id FK和一个时间戳,用于根据更新输入时间保持数据的链接和排序。

1 个答案:

答案 0 :(得分: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。