gpt4 book ai didi

php - PHP 应用程序中的 MySQL 语法错误,但可以在 MySQL 终端中使用

转载 作者:行者123 更新时间:2023-11-29 19:21:56 26 4
gpt4 key购买 nike

编辑:下面我的评论中的“解决方案”

我正在对后端 PHP 执行 AJAX POST,其中表单数据被发送到专用的 CRUD PHP 表单并用于创建记录。

SQL 语法是这样的,我需要 2 个命令。因此,我使用 BEGIN TRANSACTION;声明; 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;
}

由于 ReadTask 找不到记录并且 CreateTask 未成功完成,因此我在创建时收到 400 错误。然而,当我将相同的语句粘贴到 MySQL PuTTY 窗口而不进行额外的格式化时,它会很好地接受它。尝试使用相同的信息再次运行后,程序检测到行存在并回显“行存在!”正如它应该的那样。我已验证所有凭据均正确,并且连接正在按预期打开。

LAST_INSERT_ID() 是否仅限于 PDO 或 PHP 中的特定实现?我认为 MySQL 应该解释这一点。

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

最佳答案

已修复。

// 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。

关于php - PHP 应用程序中的 MySQL 语法错误,但可以在 MySQL 终端中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42391366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com