编辑:我的评论中的'解决方案'
我正在对我的后端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及其内容拆分为tblTaskContent,因为我希望用户能够随时向其任务添加更新。在tblTaskContent中有一个tblTask id FK和一个时间戳,用于根据更新输入时间保持数据的链接和排序。
答案 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。