MySQL事务在PHPMyAdmin中运行时有效,但在从PHP文件运行时则不行

时间:2012-02-26 18:54:35

标签: php mysql transactions

在php中运行时遇到MySQL查询问题。当我在PHPMyAdmin或SequelPro中运行它时它工作正常,但是当复制到PHP文件中它意味着运行时,它就会停止工作。

该查询旨在从与主键链接的多个表中获取数据,然后将该数据放入相应的相同表中。我知道这样做很奇怪,但它需要这样做。

查询(在PHP文件中使用)如下:

for($x = 0; $x  < count($REQIDARRAY); $x++){

$sql="BEGIN;
INSERT INTO `Request` 
SELECT NULL AS `RequestID`, `ModCode`, `RoomID`, `Students`, `Priority`, `Day`,     `StartTime`, `Length`, `Semester`, `DateAdded`, `SpecialRequests`
FROM RequestTEMP
WHERE RequestTEMP.RequestID=\"".$REQIDARRAY[$x]."\";
INSERT INTO `Week`
SELECT `WeekNumber` , LAST_INSERT_ID() AS `RequestID`
FROM `WeekTEMP`
WHERE WeekTEMP.RequestID=\"".$REQIDARRAY[$x]."\"';
INSERT INTO `RequestFacilities`
SELECT LAST_INSERT_ID() AS `RequestID` , `FacilityID`
FROM `RequestFacilitiesTEMP`
WHERE RequestFacilitiesTEMP.RequestID=\"".$REQIDARRAY[$x]."\"';
DELETE FROM `RequestTEMP` WHERE RequestID=\"".$REQIDARRAY[$x]."\";
DELETE FROM `RequestFacilitiesTEMP` WHERE RequestID=\"".$REQIDARRAY[$x]."\";
DELETE FROM `WeekTEMP` WHERE RequestID=\"".$REQIDARRAY[$x]."\";
COMMIT;";

$DB->Query('TransferMe' , $sql);
}

我已确认$ REQIDARRAY [$ x]正在返回正确的值。 在SequelPro中运行时,所有改变的是我会改变

RequestID=\"".$REQIDARRAY[$x]."\" 


'RequestID='123'

PHP中的错误消息是:
您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'INSERT INTO Request SELECT NULL AS RequestIDModCodeRoomID,`Student'附近使用正确的语法第2行。
MySQL版本是5.1.60 我不知道是什么导致了这个问题,我也尝试将RequestID的值编码硬编码到PHP文件中,它仍然会返回相同的错误。
任何帮助非常感谢!

1 个答案:

答案 0 :(得分:2)

您使用的库使用mysql_query()函数,该函数不能同时运行多个查询(作为防止SQL注入的保护)。

您需要通过单独调用$DB->Query()来运行每个查询。别担心,它仍将被视为单笔交易。

示例:

$sql="BEGIN";
$DB->Query('TransferMe' , $sql);
$sql = "INSERT INTO `Request` 
SELECT NULL AS `RequestID`, `ModCode`, `RoomID`, `Students`, `Priority`, `Day`,     `StartTime`, `Length`, `Semester`, `DateAdded`, `SpecialRequests`
FROM RequestTEMP
WHERE RequestTEMP.RequestID=\"".$REQIDARRAY[$x]."\";";
$DB->Query('TransferMe' , $sql);
...

另外:您可能希望了解一些更现代的从PHP访问MySQL的方法,如ext/MySQLI(由MySQL开发人员推荐)或PDO(受大多数PHP编码员青睐)