我在 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
附近使用的正确语法。选择 NULL 作为 RequestID
, ModCode
, RoomID
,第 2 行的“学生”。
MySQL版本为5.1.60。
我不知道是什么导致了这个问题,我也尝试过将 RequestID 的值硬编码到 PHP 文件中,但它仍然返回相同的错误。
非常感谢任何帮助!
最佳答案
您使用的库正在使用 mysql_query()
函数,该函数不能一次运行多个查询(作为对 SQL 注入(inject)的保护)。
您需要通过单独调用 $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 程序员的最爱)
关于php - MySQL 事务在 PHPMyAdmin 中运行时有效,但在从 PHP 文件运行时无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9456073/