Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 发生SQL语法错误_Mysql_Sql Server_Perl_Delimiter - Fatal编程技术网

Mysql 发生SQL语法错误

Mysql 发生SQL语法错误,mysql,sql-server,perl,delimiter,Mysql,Sql Server,Perl,Delimiter,以下是我的简单查询: my $SQLp = "SELECT MAX([PawnPayments].[CreationTimeDate]) as MaxTransDate FROM [PawnSafeDBCE].[dbo].[PawnPayments] INNER JOIN [PawnSafeDBCE].[dbo].[PawnPaymentDetails] ON [PawnPayme

以下是我的简单查询:

          my $SQLp = "SELECT MAX([PawnPayments].[CreationTimeDate]) as MaxTransDate
                FROM [PawnSafeDBCE].[dbo].[PawnPayments]
                INNER JOIN [PawnSafeDBCE].[dbo].[PawnPaymentDetails]
                ON [PawnPayments[.[PaymentID] = [PawnPaymentDetails].[PaymentID]
                WHERE [PawnPaymentDetails].[TicketID[ = '$TicketID'
                AND [PawnPaymentDetails].[StoreID] ='$StoreID'
请注意,查询是在Perl引擎上编写的。我一直收到一个错误,上面写着:

“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以了解将“[PawnPayments].[CreationTimeDate])附近的语法用作MaxTransDate的正确性:”

我相信这个错误与括号符号有关,但不幸的是,我不得不使用这种样式,因为第三方表构造得很糟糕。有什么帮助吗?我错过了什么明显的东西吗


巨大的编辑:我查询的表实际上是在SQL服务器上,而不是在MySQL服务器上!我的数据库运行在MySQL服务器上,但此第三方数据库运行在较旧版本的Microsoft SQL上。

您说您正在查询MS SQL数据库,但错误消息明确表示您正在使用MySQL数据库或MySQL数据库驱动程序

如果要查询MS SQL数据库,请修复连接字符串

如果要查询MySQL数据库,请使用与MySQL兼容的查询。MySQL使用倒勾来引用标识符(不像MS SQL那样使用方括号)

应该是

`PawnPayments`.`CreationTimeDate`


请注意,由于错误引用插入SQL查询的值,您的代码存在注入错误。(仅仅在值周围加引号是不够的!)这些可能会导致代码失败,并使您容易受到注入攻击。修复引号,或者使用可替换的参数。

我不知道为什么表和列名周围有这么多方括号,但它们不是必需的,也不是标准的SQL。这就是导致语法错误的原因

my $SQLp = "SELECT MAX(PawnPayments.CreationTimeDate) as MaxTransDate
            FROM PawnSafeDBCE.dbo.PawnPayments
            INNER JOIN PawnSafeDBCE.dbo.PawnPaymentDetails
            ON PawnPayments.PaymentID = PawnPaymentDetails.PaymentID
            WHERE PawnPaymentDetails.TicketID = '$TicketID'
            AND PawnPaymentDetails.StoreID ='$StoreID'";
我还将补充一点,在SQL语句中插入这样的变量可能会使您面临更大的风险。最好在SQL中使用绑定点,并使用额外的参数
execute
来填充值(假设您使用的是DBI)

Update:正如在一篇评论中指出的那样,
database.schema.table
语法在MySQL数据库中毫无意义。所以我觉得你有点困惑。您收到的错误消息肯定提到了MySQL,因此您正在使用DBD::MySQL连接到MySQL服务器,但也许您应该改为连接到MSSQL服务器


如果您向我们展示您的数据库连接代码(设置
$dbh
(或等效)变量的调用),这可能会很有用。

您正在MySQL服务器上尝试SQL server语法。括号是SQL server的转义方法。dbo是一个只在SQL server中工作的对象。。。而且,只有在您希望SQL注入工作的情况下,您的代码才容易受到SQL注入的攻击。您的错误消息清楚地表明是MySQL。因此,无论您认为涉及到什么MSSQL服务器,您都不是在和它说话。另外,不要将变量放入SQL中。请改用DBI的占位符。如果您使用的第三方软件仅支持Microsoft SQL Server,并且无法配置为使用标准标识符分隔符(如),则您不能将其用于MySQL。此外,我发现您的查询还有另一个Microsoft SQL Server功能:
[PawnSafeDBCE].[dbo].[PawnPayments]
使用
Database.Schema.Table
表示法(请参阅),但MySQL不支持该表示法。MySQL只支持
schema.table
。因此,即使您修复了方括号,您的查询也无法在MySQL上运行。感谢您通知我可能的注入攻击。我从未接触过这种信息。我现在就试试这个方法。
Database.Schema.Table
语法也不受MySQL支持。@BillKarwin:说得好。我已经更新了我的答案。我认为OP相当混乱!我认为他们只是在使用一个Perl应用程序,它显然是为MicrosoftSQLServer设计的,他们正试图将它与MySQL结合使用。
my $SQLp = "SELECT MAX(PawnPayments.CreationTimeDate) as MaxTransDate
            FROM PawnSafeDBCE.dbo.PawnPayments
            INNER JOIN PawnSafeDBCE.dbo.PawnPaymentDetails
            ON PawnPayments.PaymentID = PawnPaymentDetails.PaymentID
            WHERE PawnPaymentDetails.TicketID = '$TicketID'
            AND PawnPaymentDetails.StoreID ='$StoreID'";
my $SQLp = "SELECT MAX(PawnPayments.CreationTimeDate) as MaxTransDate
            FROM PawnSafeDBCE.dbo.PawnPayments
            INNER JOIN PawnSafeDBCE.dbo.PawnPaymentDetails
            ON PawnPayments.PaymentID = PawnPaymentDetails.PaymentID
            WHERE PawnPaymentDetails.TicketID = ?
            AND PawnPaymentDetails.StoreID = ?";

my $sth = $dbh->prepare($SQLp);
$sth->execute($TicketID, $StoreID);